1. USB Legacy Gadget 사용법
Kernel에서 기존부터 제공하는 Legacy Gadget 으로 Kernel의 Gadget Module Driver를 Load를 하면 쉽게 사용하는 방법이다.
Legacy를 사용하기 위해서는 각 Kernel Legacy Gadget Driver들을 반드시 Module로 만들어서 사용해야한다.
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의 세부적인 구현을 하려면 반드시 알아야함
https://ahyuo79.blogspot.com/2014/11/usb-host-gadget-debug-2.html
https://www.kernel.org/doc/Documentation/usb/gadget_serial.txt
https://linux-sunxi.org/USB_Gadget/Serial
2.2 g_ether (RNDIS/ECM)
Kernel 설정 및 USB Host 지원상황에 따라 USB CDC 가 달라지며, 각각 독립적인 Network이 구성되며, 각 Route Table 역시 확인해봐야한다.
2.3 g_mass_storage (MASS STORAGE)
일반적으로 내부 Partition을 연결하거나 File을 연결하여 사용하면 된다.
내부 파일을 연결시에는 Image를 만들어서 연결해도 상관이 없지만, FAT로 Format 후 사용하자.
1.2 USB Device 와 USB Function 구조 파악
내부적으로 보면 , Legacy Gadget Driver 역시 Kernel 의 USB Function을 사용하므로 관련소스를 보면 이해하기가 쉽다
- USB Device Descriptor 구조
- Configuration Descriptor
- Interface Descriptor -> Function (USB Device) ==> Class Driver (USB Host 와 연결)
- included Endpoint Descriptors
Gadget Legacy Driver 역시 내부적으로 각 Function 들과 연결되어 동작되어짐
https://training.ti.com/sites/default/files/docs/USB-M6-USB-in-Device-Mode.pdf |
2. USB Legacy Gadget Module 사용
기본적인 사용법은 각 사용할 Module 찾아 Module을 올리면 기본적으로 동작된다.
다만 확인해야 할 사항이 현재 UDC가 사용가능하는 것을 확인해야하고, 더불어 UDC가 사용중이면, 사용 중인 Module Driver를 제거를 한 후 다른 Module를 사용해야한다.
두 개의 기능을 동시에 사용하고 싶다면 Composite Device 을 Kernel에서 설정을 해야하며, 제한적으로 사용가능하다.
- 에러사항
보통 gadget을 사용중이거나, kernel에서 udc를 별도로 설정을 안했을 경우
$ modprobe g_serial udc-core: couldn't find an available UDC - added [g_serial] to list of pending drivers $ lsmod // 현재 사용중인 다른 gadget 확인 or USB Gadget ConfigFS에서 설정한 것 해제
USB CDC 의 관련사항
https://en.wikipedia.org/wiki/Ethernet_over_USB
https://en.wikipedia.org/wiki/Ethernet_over_USB
- USB Legacy Gadget의 공통 Parameter 및 설정방법
Parameter | Purpose | Type |
---|---|---|
idVendor | USB Vendor ID | (ushort) |
idProduct | USB Product ID | (ushort) |
bcdDevice | USB Device version | (BCD) (ushort) |
iSerialNumber | SerialNumber string | (charp) |
iManufacturer | USB Manufacturer string | (charp) |
iProduct | Product string | (charp) |
$ vi /etc/modprobe.d/options // modprobe usbserial vendor=0x0525 product=0xA4A6
....
options usbserial vendor=0x0525 product=0xA4A6
...
- 반드시 필독 (아래 이외의 UVC 와 UVA g_printer 사용)
TI-USB와 다른 AP와 별차이가 없으며 쉽게 설명
https://training.ti.com/sites/default/files/docs/USB-M6-USB-in-Device-Mode.pdf- USB 모든 Gadget 기본 TET 방법
USB Device Gadget Function기준으로 테스트 방법
2.1 g_serial (ACM)
USB to Serial 가장 많이 사용이 되며, 동작역시 쉽게된다.
- USB Device 설정
# CONFIG_USB_G_SERIAL
# USB Gadget Driver (Device의 /dev/ttyGS0 -> Host의 ACM) 실제연결
$ modprobe g_serial
g_serial gadget: Gadget Serial v2.4
g_serial gadget: g_serial ready
g_serial gadget: high-speed config #2: CDC ACM config
- USB Device: ttyGS0 생성
- USB Host: ttyACMx
- USB Device 에서 USB Host 통신확인
Host에서 간단히 TEST Message 확인 및 socat으로 다른 /dev/ttyx 와 /dev/ttyGS0 연결
$ ls /dev/ttyGS0 // 생성확인 /dev/ttyGS0 $ cat /sys/class/tty/ttyGS0/dev 246:0 // Host에서 USB Serial로 연결 후 Baudrate를 맘대로 변경해도 다 됨 (기본 115200) 설정 후 테스트 $ echo "Test " > /dev/ttyGS0 $ cat /dev/ttyGS0
https://linux-sunxi.org/USB_Gadget/Serial
2.2 g_ether (RNDIS/ECM)
Kernel 설정 및 USB Host 지원상황에 따라 USB CDC 가 달라지며, 각각 독립적인 Network이 구성되며, 각 Route Table 역시 확인해봐야한다.
- USB Device 설정
$ modprobe g_ether using random self ethernet address using random host ethernet address usb0: HOST MAC a2:3a:fa:76:8c:18 usb0: MAC 4a:1e:02:84:f1:3f using random self ethernet address using random host ethernet address g_ether gadget: Ethernet Gadget, version: Memorial Day 2008 g_ether gadget: g_ether ready g_ether gadget: high-speed config #2: RNDIS or $ modprobe g_ether idVendor=0x1234 idProduct=0xabcd bcdDevice=0x0304 \ iSerialNumber=sn7890 iManufacturer=myCom iProduct=demo
- USB Device Network 설정
아래와 같이 강제로 usb0을 up 시키거나, 자동으로 잡도록 /etc/network/interface or /etc/systemd/network/xxx.network 로 설정
$ ifconfig usb0 up $ ifconfig usb0 usb0 Link encap:Ethernet HWaddr 4A:1E:02:84:F1:3F inet6 addr: fe80::481e:2ff:fe84:f13f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) $ ifconfig usb0 192.168.5.7
- USB Host Network 설정
USB Host 의 경우 usb0으로 잡혀도 route table이 link-local로 잡혀 제대로 통신이 되지 않는다.
그러므로 별도로 route table를 설정해줘야 한다.
$ ifconfig usb0 192.168.5.11 // Route Table에 현재 설정한 부분이 link-local로 되며, 등록이 안됨 $ route ... link-local 0.0.0.0 255.255.0.0 U 204 0 0 usb0 .. // 직접 Route Table에 추가 $ sudo route add -net 192.168.5.0 netmask 255.255.255.0 usb0 .... 192.168.5.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0
- USB Device 와 Host 검증
최종테스트 Host 와 Device 사이에 ping으로 테스트 진행하며, ifconfig에서 Packet이 전송되었는지를 반드시 확인하자
$ ifconfig usb0 //USB Device usb0 Link encap:Ethernet HWaddr 4A:1E:02:84:F1:3F inet addr:192.168.5.7 Bcast:192.168.5.255 Mask:255.255.255.0 inet6 addr: fe80::b4fe:8fff:fe61:d00d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) $ ifconfig usb0 //USB Host usb0 Link encap:Ethernet HWaddr A2:3A:FA:76:8C:18 inet addr:192.168.5.11 Bcast:192.168.5.255 Mask:255.255.255.0 inet6 addr: fe80::b4fe:8fff:fe61:d00d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
좀 더 속도 및 세부적으로 검증하고자 하면, iperf 를 이용하여 세부검증을 하자.
일반적으로 내부 Partition을 연결하거나 File을 연결하여 사용하면 된다.
내부 파일을 연결시에는 Image를 만들어서 연결해도 상관이 없지만, FAT로 Format 후 사용하자.
Window에서 인식하기 위해서 File or Device FAT or NTFS 로 format을 해야함
$ modprobe g_mass_storage file=/dev/mmcblk0p3 Mass Storage Function, version: 2009/09/11 LUN: removable file: (no medium) LUN: file: /dev/mmcblk0p3 Number of LUNs=1 g_mass_storage gadget: Mass Storage Gadget, version: 2009/09/11 g_mass_storage gadget: userspace failed to provide iSerialNumber g_mass_storage gadget: g_mass_storage ready g_mass_storage gadget: high-speed config #1: Linux File-Backed Storage