[DLA PRAKTYKÓW] USB w systemie Linux
W artykule przyjrzymy się konfiguracji Linuksa Embedded do pracy w charakterze urządzenia (klienta/device) USB. Posłużę się Linuksem w wersji 4.0 uruchomionym na Wandboard Quad. Jest to komputer jednopłytkowy z 4-rdzeniowym procesorem Freescale i.MX6.
*******************
Wspólnie z autorem artykułu zapraszamy do udziału w szkoleniu „Programowanie sterowników urządzeń w jądrze Linux”, które odbędzie się w dniach 25-28.05.2015 w Warszawie. Szczegółowe informacje są dostępne pod adresem.
*******************
USB to standard interfejsu opracowany w latach ‘90. Normalizuje kable, wtyczki i gniazda oraz protokół komunikacyjny. USB jest używany do podłączania szerokiej gamy urządzeń elektronicznych do komputera i innych urządzeń konsumenckich.
Wersje USB
Urządzenia podłączane są do kontrolera hosta. Dzięki zastosowaniu HUB-ów – magistrala tworzy strukturę drzewiastą.
USB może przesyłać dane w kilku trybach:
- Low Speed – 1,5 Mb/s
- Full Speed – 12 Mb/s
- High Speed – 480 Mb/s
- Super Speed – 5,0 Gb/s
Jest to przepustowość w bitach na sekundę, którą przesyłane są sygnały na magistrali, a nie efektywna prędkość przesyłania danych. Protokoły komunikacyjne używane w USB mogą wprowadzać stosunkowo duży narzut. Podczas projektowania urządzeń – bardzo istotny jest dobór odpowiedniego protokołu.
USB Implementers Forum – organizacja odpowiedzialna za standaryzację i upowszechnianie protokołu, wprowadziła kilka wersji protokołu:
- USB 1.1 – 1998 – Low Speed i Full Speed
- USB 2.0 – 2000 – dodano High Speed
- USB 3.0 – 2008 – Super Speed
Standard USB nie narzuca przepustowości magistrali. Na przykład urządzenie USB 2.0 może pracować w trybie: High Speed, Full Speed lub Low Speed. Klawiatura USB 2.0 w zupełności zadowoli się trybem Full Speed.
Terminologia
- Device (urządzenie) – fizyczne lub logiczne urządzenie, wykonujące jakąś funkcję: mysz, klawiatura, pendrive, modem GSM itp.
- Configuration (konfiguracja) – tryb, w jakim działa urządzenie. Każde urządzenie ma co najmniej jeden tryb. Na przykład pendrive pracuje jako dysk USB.
Niektóre urządzenia mają więcej niż jedną konfigurację, ale tylko jedna może być w danej chwili aktywna. Na przykład modem GSM może pracować jako dysk USB (tylko do odczytu – ze sterownikami dla niektórych systemów), a po wysłaniu odpowiedniej sekwencji poleceń – przełączać się na właściwą funkcję (karta sieciowa). - Interface (interfejs) – konfiguracja definiuje jeden lub kilka interfejsów. Wszystkie są aktywne w danej konfiguracji. Na przykład modem GSM może równocześnie udostępniać kartę sieciową (do komunikacji) i port szeregowy (do wysyłania SMS-ów). Interfejs składa się z określonej liczby endpointów.
- Endpoint – pozwala przesyłać dane w jednym kierunku: do albo od urządzenia.
Endpointy
Standard definiuje cztery typy konfiguracji endpointów:
- Control (kontrolny) – wyjątkowo dwukierunkowy (zwracany jest status: suckes/porażka). Każde urządzenie posiada skonfigurowany w ten sposób EP 0 – używany do wykrywania (enumeration) urządzeń na magistrali.
- Interrupt – przesyła niewielkie ilości danych stara się robić to z możliwie najmniejszym opóźnieniem (low-latency). Kontroler rezerwuje pasmo magistrali dla każdego skonfigurowanego w ten sposób endpointu. Najczęściej używany w urządzeniach typu HID (klawiatury,, myszy, joysticki).
- Bulk – przesyłanie dużych ilości danych – pakiety sieciowe, dyski itp. Stosowany w sytuacji, kiedy opóźnienia nie są istotne. Nie rezerwuje pasma.
- Isochronous – przesyłanie dużych ilości danych, przy których istotne jest jak najmniejsze opóźnienie. Dostarczenie danych nie jest gwarantowane (kontroler może zgubić część pakietów). Endpointy tego typu mają zastosowanie przede wszystkim w urządzeniach multimedialnych: karty dźwiękowe, kamery, w sytuacji, gdy zgubienie części danych jest mniejszym problemem niż dostarczenie ich z opóźnieniem.
Każdy typ ma określoną maksymalną ilość danych, która może zostać przesłana w jednej transakcji:
Interrupt |
Bulk |
Isochronous |
|
Full Speed |
64B |
64B |
1024B |
High Speed |
3072B |
512B |
1024Bx3 |
Transakcja – to wysłanie/odebraie danych do/z urządzenia. Zawsze inicjowane przez host.
Jedna lub więcej transakcji składa się na transfer. W jednym transferze można przesyłać wiele danych (nawet używając niewielkich transakcji).