LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

[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