11/18/2020

USB OTG (Gadget) Legacy 사용법

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

  • USB Gadget Kernel API
Gadget의 세부적인 구현을 하려면 반드시 알아야함  
  https://ahyuo79.blogspot.com/2014/11/usb-host-gadget-debug-2.html


1.2  USB Device 와  USB Function 구조 파악 


내부적으로 보면 , Legacy Gadget Driver 역시 Kernel 의 USB Function을 사용하므로 관련소스를 보면 이해하기가 쉽다 


  • USB Device Descriptor 구조 

  1. Configuration Descriptor  
  2. Interface Descriptor -> Function (USB Device) ==> Class Driver (USB Host 와 연결)
    1. 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 Legacy Gadget의 공통 Parameter 및 설정방법 
ParameterPurposeType
idVendorUSB Vendor ID(ushort)
idProductUSB Product ID(ushort)
bcdDeviceUSB Device version(BCD) (ushort)
iSerialNumberSerialNumber string(charp)
iManufacturerUSB Manufacturer string(charp)
iProductProduct 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

  1. USB Device: ttyGS0 생성 
  2. 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://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 역시 확인해봐야한다. 

  • 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 를 이용하여 세부검증을 하자. 



2.3 g_mass_storage (MASS STORAGE)

일반적으로 내부 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