[DLA PRAKTYKÓW] USB w systemie Linux

Kontroler USB

Magistrala USB jest zarządzana przez kontroler. W komputerach PC jest on najczęściej urządzeniem PCI, w systemach embedded, stanowi jeden z elementów SoC-a (urządzenie platform).

Kontroler inicjuje wszystkie transfery. Urządzenie zawsze oczekuje na zapytanie z kontrolera. USB działa więc w trybie pollingu. Na przykład kontroler cyklicznie odpytuje endpointy interrupt urządzenia HID (mysz). Jeżeli urządzenie zgłosi dane oznaczające zmianę pozycji kursora – kontroler zgłosi odpowiednie przerwanie w systemie.

Endpoint może dostać skonfigurowany w trybie Out (do urządzenia) lub In (z urządzenia).

Transakcje mogą być inicjowane z poziomu przestrzeni użytkownika:

  • przy użyciu biblioteki libusb :
    API synchroniczne (http://libusb.org/static/api-1.0/group__syncio.html):
    API asynchroniczne (http://libusb.org/static/api-1.0/group__asyncio.html):
  • z poziomu kodu w jądrze Linux:
    (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/core/message.c?id=v4.0#n131)
    (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/core/message.c?id=v4.0#n183)
    (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/core/message.c?id=v4.0#n223)
    (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/core/urb.c?id=v4.0#n325)
    Ostatnia funkcja – działa asynchronicznie.

 

Klasy urządzeń

USB definiuje klasy dla typowych urządzeń. Klasa wyznacza zestaw endpointów i sposób ich konfiguracji. Dzięki klasom, jeden sterownik może obsługiwać wiele urządzeń różnych producentów. Typowym przykładem są pendrive-y i nagrwarki płyt.

http://www.usb.org/developers/defined_class

 

Obsługa USB w Linuksie

Jądro Linux implementuje wszystkie aspekty standardu USB. W konfiguracji źródeł jadra w wersji 4.0 znajdziemy sterowniki kontrolerów hosta, urządzeń (gadget). Także standardowych klas, oraz niektóre sterowniki dla konkretnych urządzeń (na przykład konwerterów USB-serial).

W przypadku drukarek i skanerów, komunikacja z urządzeniem zaimplementowana jest w całości w przestrzeni użytkownika (odpowiednio w programach: CUPS i sane).

Sterowniki i urządzenia zorganizowane są w magistralę zunifikowanego modelu urządzeń jądra Linux. Informacje i poszczególnych obiektach eksportowane są w postaci plików, katalogów i dowiązań symbolicznych w sysfs .

Po podłączeniu urządzenia, informacje o jego wykryciu pojawiają się w buforze komunikatów jądra:

Identyfikator urządzenia zdradza informacje o jego położeniu na magistrali:

  • 1 – pierwsza magistrala USB
  • 1-1 – pierwsze złącze root hub-a. Jest to pierwszy element (hub) każdej magistrali. Wbudowany w kontroler zazwyczaj posiada jedno lub dwa złącza (wyprowadzenia).
  • 1-1.3 – w omawianym przypadku, mysz USB podłączona jest do HUB-a w klawiaturze – konkretnie do trzeciego złącza.

W przypadku kiedy mysz zostanie podłączona przez kolejny HUB, urządzenie dostanie identyfikator:

Co wskazuje na czwarte złącze Hub-a. Obecność kolejnych rogałęźników sygnaliwowana jest przez dodanie segmentu <kropka>.<liczba>.

Komenda lsusb dostarcza ogólnych informacji o urządzeniach podłączonych do systemu (korzysta z wpisów w sysfs):

O autorze