[DLA PRAKTYKÓW] USB w systemie Linux
Stworzenie nowego urządzenia (na razie jego szkieletu) polega na stworzeniu nowego katalogu:
$ mkdir g1 $ cd g1 $ ls UDC bDeviceSubClass bcdUSB idProduct strings bDeviceClass bMaxPacketSize0 configs idVendor bDeviceProtocol bcdDevice functions os_desc
Należy określić identyfikatory: producenta i urządzenia:
$ echo > idVendor $ echo > idProduct
W celach testowych możemy posłużyć się identyfikatorami zarejestrowanymi przez Linux Foundation:
1d6b Linux Foundation 0001 1.1 root hub 0002 2.0 root hub 0003 3.0 root hub 0100 PTP Gadget 0101 Audio Gadget 0102 EEM Gadget 0103 NCM (Ethernet) Gadget 0104 Multifunction Composite Gadget 0105 FunctionFS Gadget 0200 Qemu Audio Device
Urządzenie powinno także zgłaszać numer seryjny, oraz nazwy: urządzenia i producenta. W tym celu, należy stworzyć odpowiedni podkatalog strings. Numer określa język (0x409 – angielski por. http://en.wikipedia.org/wiki/Locale#Specifics_for_Microsoft_platforms).
$ mkdir strings/0x409 $ echo > strings/0x409/serialnumber $ echo > strings/0x409/manufacturer $ echo > strings/0x409/product
Można przystąpić do tworzenia konfiguracji:
$ mkdir configs/c.1 $ mkdir configs/c.1/strings/0x409 $ echo > configs/c.1/strings/0x409/configuration $ echo 120 > configs/c.1/MaxPower
Funkcje (interfejsy)
$ mkdir functions/ncm.usb0
Zostanie automatycznie załadowany moduł usb_f_ncm.ko
Poszczególne funkcje dostarczają własnego zestawu atrybutów, które należy ustawić. Dla NCM (karta sieciowa) są to:
dev_addr host_addr ifname qmult
Następnie dodajemy interfejs do konfiguracji:
$ ln -s functions/ncm.usb0 configs/c.1
Skonfigurowany w powyższy sposób gadget, należy na koniec skojarzyć ze sterownikiem kontrolera UDC. W tym celu wpisujemy jego nazwę do:
$ echo> UDC
Nazwa określona jest w:
$ ls /sys/class/udc/ ci_hdrc.0
Stąd:
$ echo ci_hdrc.0 > UDC
W systemie działającym na Wandboard-zie rejestrowany jest interfejs sieciowy usb0.
Po stronie PC mamy:
$ lsusb Bus 001 Device 065: ID 1d6b:0103 Linux Foundation NCM (Ethernet) Gadget $ dmesg usb 1-1.1: new high-speed USB device number 65 using xhci_hcd usb 1-1.1: New USB device found, idVendor=1d6b, idProduct=0103 usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-1.1: Product: WB Test Device usb 1-1.1: Manufacturer: BIS-Linux usb 1-1.1: SerialNumber: 0123456789abcd cdc_ncm 1-1.1:1.0: MAC-Address: 4e:31:19:b1:03:c8 cdc_ncm 1-1.1:1.0 usb0: register 'cdc_ncm' at usb-0000:00:10.0-1.1, CDC NCM, 4e:31:19:b1:03:c8 usbcore: registered new interface driver cdc_ncm cdc_ncm 1-1.1:1.0 usb0: 425 mbit/s downlink 425 mbit/s uplink
Mechanizm configfs umożlwia modyfikowanie urządzeń w locie – konfiguracje ich interfejsy mogą być na bieżąco zmieniane. Możliwe jest także obsługiwanie endpointów z przestrzeni użytkownika (libusb).
Dla ułatwienia konfiguracji urządzeń klienckich, powstała biblioteka libgusb (https://github.com/libusbg/libusbg).
Wandboard QUAD i inne zestawy z procesorami i.MX6 firmy Freescale wykorzystywane są podczas organizowanych przeze mnie szkoleń. Więcej informacji: http://bis-linux.com/pl/terminy_szkolen