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
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 구조
- Configuration Descriptor
- Interface Descriptor -> Function (USB Device) ==> Class Driver (USB Host 와 연결)
- 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 사용법
USB Function 부분 연결가능하며, 동작도 역시 Legacy USB Gadget 가 거의 동일하게 동작한다.
2.1 USB Serial (g_serial 과 동일)
2.1 USB Serial (g_serial 과 동일)
설정방법만 소개하고 테스트 방법 및 사용법은 기존 Legacy와 크게 다르지 않다
- USB Serial (ACM) 예제
상위 g_serial 과 동일하게 동작하며, 테스트 방법도 동일
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 다른 설정 (상위와 거의 동일함)
# 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
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 이름만 아래와 같이 변경해서 사용하면된다.
Name | Driver | Description | Documentation |
---|---|---|---|
acm | Abstract Control Model (CDC ACM) | ACM serial link, works with Windows/Linux (use Documentation/usb/linux-cdc-acm.inf) | Documentation/usb/gadget_serial.txt |
gser | Generic serial bulk in/out | The function talks to the Linux-USB generic serial driver | |
obex | Object Exchange Model (CDC OBEX) | Needs an user space OBEX server | |
rndis | RNDIS | Microsoft "Remote NDIS" (RNDIS) Ethernet protocol (use Documentation/usb/linux.inf) | |
ecm | Ethernet Control Model (CDC ECM) | Ethernet Control Model | |
eem | Ethernet Emulation Model (EEM) | Newer USB Ethernet standard that is somewhat simpler than CDC ECM | |
ncm | Network Control Model (CDC NCM) | Advanced protocol for Ethernet | |
ffs | Function filesystem (FunctionFS) | Allows to implement USB functions from user-space (e.g. for MTP) | Documentation/usb/functionfs.txt |
mass_storage | Mass storage | Exports a regular file or block device as USB Mass Storage disk drive | Documentation/usb/mass-storage.txt |
hid | HID function | Generic 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-linuxUSB Gadget Config FS Composite 예제
https://elinux.org/images/e/ef/USB_Gadget_Configfs_API_0.pdf
USB Gadget Config FS 예제 및 검증
https://www.ti.com/lit/an/spracb5/spracb5.pdf
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841729/Zynq+Ultrascale+MPSOC+Linux+USB+device+driver
2.3 Gadget Config FS 와 libusg 사용
상위 설정을 Shell Script가 아닌 C로 작성하여 사용방법
2.4 Android Gadget Config FS 예제
Android USB Config FS
https://stackoverflow.com/questions/48419908/how-to-setup-usb-gadget-via-configfs-in-android-shell
Android USB Config FS
https://stackoverflow.com/questions/48419908/how-to-setup-usb-gadget-via-configfs-in-android-shell
Android USB Config FS 관련초기설정
Android udev 처럼 uevent 관리
3. Window RNDIS 관련문제사항
추후 필요없는 부분 삭제
RNDIS(Remote NDIS)관련설명
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/remote-ndis--rndis-2Window에서 RNDIS 의 인식문제
https://answers.microsoft.com/en-us/windows/forum/windows_10-networking-winpc/windows-10-vs-remote-ndis-ethernet-usbgadget-not/cb30520a-753c-4219-b908-ad3d45590447
RNDIS Driver Download (해결되지 않음)
http://www.catalog.update.microsoft.com/ScopedViewRedirect.aspx?updateid=37e35bd4-d788-4b83-9416-f78e439f90a2
https://www.driverscape.com/download/usb-ethernet-rndis-gadget
RNDIS Gadget Window Driver (RNDIS Driver가 아님)
https://driversupdatecenters.com/drivers/?driver=USB+Ethernet%2FRNDIS+Gadget+Driver&p=28