11/22/2020

USB OTG (Gadget Config FS) 사용법

1. USB Gadget Config FS 사용법 


USB Gadget Config File System은 기존의 Legacy Gadget 처럼 Kernel Module 만 올리면 되는 것이 아니라, 
USB Gadget Config File System을 Mount를 한 후 User에서 필요한 USB Device에 관해서 Descriptor 정보 와 Function을 연결하는 방식이다. 
물론 Composite Device도 지원가능하며, 이를 위해서 Multi Function 기능사용해야한다.

Python기반의 USB Gadget 관리

1.1  USB Kernel 설정 후 빌드 및 확인

  • USB OTG 사용시 Gadget 관련 Kernel 설정 및 확인 
USB Gadget에 관련된 Kernel 설정은 아래의 링크로 확인하고 관련 기능 확인 
  https://ahyuo79.blogspot.com/2020/11/usb-device-gadget-cdc.html

  • USB Gadget Kernel API
Gadget의 세부적인 구현을 하려면 반드시 알아야함  

1.2  USB Device 와  USB Function 구조 파악 

기존의 USB Legacy 와 크게 다르지 않으므로, 중략 


USB Legacy Gadget 사용법


  • USB Gadget Config FS 의 구조 와 Functions 구조 
  1. Configuration Descriptor  
  2. Interface Descriptor -> Function (USB Device) ==> Class Driver (USB Host 와 연결)
    1. included Endpoint Descriptors

https://training.ti.com/sites/default/files/docs/USB-M6-USB-in-Device-Mode.pdf

USB Gadget Config File system mount 후 아래와 같이 설정 

https://training.ti.com/sites/default/files/docs/USB-M6-USB-in-Device-Mode.pdf


2. USB Gadget Config FS 사용법 


상위 그림처럼 Kernel Config에서 설정 후  /sys/kernel/config/usb_gadget 을 mount 후 직접 USB Device 설정 및 
USB Function 부분 연결가능하며, 동작도 역시 Legacy USB Gadget 가 거의 동일하게 동작한다.  


2.1 USB Serial (g_serial 과 동일)

설정방법만 소개하고 테스트 방법 및 사용법은 기존 Legacy와 크게 다르지 않다 

  • USB Serial (ACM) 예제 
상위 g_serial 과 동일하게 동작하며, 테스트 방법도 동일 
# Check Kernel Config about Gadget and ConfigFS 
$ mount -t configfs none /sys/kernel/config
$ cd /sys/kernel/config/usb_gadget

# Create g1/g2/g3 Gadget(USB Device) STEP1
$ mkdir g1

# Set USB Device Descriptor STEP2
$ cd g1
$ ls
UDC              bMaxPacketSize0  functions        strings
bDeviceClass     bcdDevice        idProduct
bDeviceProtocol  bcdUSB           idVendor
bDeviceSubClass  configs          os_desc

$ echo "0x1d6b" > idVendor
$ echo "0x0104" > idProduct

# Create/Set USB Device Descriptor about String STEP2
$ mkdir strings/0x409
$ ls strings/0x409/
manufacturer  product       serialnumber

$ echo "0123456789" > strings/0x409/serialnumber
$ echo "Foo Inc." > strings/0x409/manufacturer
$ echo "Bar Gadget" > strings/0x409/product


# Create/Set USB Config Descriptor STEP3 
$ mkdir configs/c.1
$ ls configs/c.1
MaxPower      bmAttributes  strings

# Set USB Config Descriptor for String STEP3 
$ mkdir configs/c.1/strings/0x409
$ ls configs/c.1/strings/0x409/
configuration

# Set USB Config Descriptor for String STEP4 
$ echo "CDC ACM" > configs/c.1/strings/0x409/configuration

# Create USB Interface Descriptor (Functions)  STEP5,6 
# USB Host              /dev/ttyACMx
# USB Device (Gadget)   /dev/ttymxc4  (need g_serial)   CONFIG_USB_G_SERIAL  
$ mkdir functions/acm.GS0

# Link USB Interface Descriptor (Functions)  STEP5,6 
$ ln -s functions/acm.GS0 configs/c.1

# Check USB Gadget 의 UDC name 파악 
# i.MX의 경우 현재 USB OTG 설정은 다음과 같이 Device Tree에서 설정 
#  ci_hdrc.0 : Device  
#  ci_hdrc.1:  Host    
# TI는 musb-hdrc.0/1로 사용 
# 각 AP마다 이름이 다르며, Device Tree의 설정같이 봐야함 (아래의 UDC에 정의하면 동작함) 
$ ls /sys/class/udc/
ci_hdrc.0

# Activate USB-CDC ACM Device 동작  (Host에서 ACM, USB Serial 확인가능) 
$ echo "ci_hdrc.0" > UDC


$ find /sys -name *hdrc*  //OTG1 (ci_hdrc.0) , OTG2 (ci_hdrc.1) 검색 
/sys/kernel/debug/ci_hdrc.1
/sys/kernel/debug/ci_hdrc.0
/sys/devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1
/sys/devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0
/sys/devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0/udc/ci_hdrc.0
/sys/class/udc/ci_hdrc.0
/sys/bus/platform/devices/ci_hdrc.0
/sys/bus/platform/devices/ci_hdrc.1
/sys/bus/platform/drivers/ci_hdrc
/sys/bus/platform/drivers/ci_hdrc/ci_hdrc.0
/sys/bus/platform/drivers/ci_hdrc/ci_hdrc.1

$ cat /sys/bus/platform/devices/ci_hdrc.0/uevent
DRIVER=ci_hdrc
MODALIAS=platform:ci_hdrc

$ cat /sys/bus/platform/devices/ci_hdrc.1/uevent
DRIVER=ci_hdrc
MODALIAS=platform:ci_hdrc

https://elixir.bootlin.com/linux/v4.9/ident/ci_hdrc

UVC Gadget 설정방법 
  https://developer.ridgerun.com/wiki/index.php?title=How_to_use_the_UVC_gadget_driver_in_Linux

Gadget Config FS 관련설정참고
  https://www.kernel.org/doc/Documentation/usb/gadget_configfs.txt
  https://www.kernel.org/doc/Documentation/usb/gadget-testing.txt
  https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt 


2.2 다른 설정 (상위와 거의 동일함)


상위구조처럼 생성한 후 Function 이름만 아래와 같이 변경해서 사용하면된다.

NameDriverDescriptionDocumentation
acmAbstract Control Model (CDC ACM)ACM serial link, works with Windows/Linux (use Documentation/usb/linux-cdc-acm.inf)Documentation/usb/gadget_serial.txt
gserGeneric serial bulk in/outThe function talks to the Linux-USB generic serial driver
obexObject Exchange Model (CDC OBEX)Needs an user space OBEX server
rndisRNDISMicrosoft "Remote NDIS" (RNDIS) Ethernet protocol (use Documentation/usb/linux.inf)
ecmEthernet Control Model (CDC ECM)Ethernet Control Model
eemEthernet Emulation Model (EEM)Newer USB Ethernet standard that is somewhat simpler than CDC ECM
ncmNetwork Control Model (CDC NCM)Advanced protocol for Ethernet
ffsFunction filesystem (FunctionFS)Allows to implement USB functions from user-space (e.g. for MTP)Documentation/usb/functionfs.txt
mass_storageMass storageExports a regular file or block device as USB Mass Storage disk driveDocumentation/usb/mass-storage.txt
hidHID functionGeneric emulation of USB Human Interface Devices (HID)Documentation/usb/gadget_hid.txt


USB Gadget Config FS 예제 및 Function 부분 자세히 설명 
  https://developer.toradex.com/knowledge-base/usb-device-mode-linux

2.3 Gadget Config FS 와 libusg 사용 

상위 설정을 Shell Script가 아닌 C로 작성하여 사용방법 



Android USB Config FS 관련초기설정 

Android udev 처럼 uevent 관리


3. Window RNDIS 관련문제사항 

추후 필요없는 부분 삭제