Laboratorní úloha z předmětu 36PZ
Martin Tůma
Vaším úkolem v této laboratorní úloze je seznámit se se sběrnicí USB, pochopit její strukturu z pohledu programátora a napsat velmi jednoduchý program, který bude příjmat data ze zařízení připojeného na sběrnici. Referát z této úlohy bude obsahovat odpovědi na jednoduché otázky a kód programu, který napíšete v rámci cvičení.
V operačním systému Linux existuje subsystém jádra pro práci s USB, který má usnadnit psaní ovladačů zařízení. Nám však bude pro seznámení s USB sloužit knihovna libusb, která nám umožní snadno dělat základní funkce, jako je inicializace sběrnice, vyhledávání zařízení a odesílaní a příjem dat. Zdrojové kódy knihovny najdeme na adrese [1]. Podle přiložených instrukcí knihovnu zkompilujeme a nainstalujeme do systému. Pečlivě si prostudujeme ukázkový program testlibusb.c v adresáři tests. Ve specifikaci USB (na adrese [2]) vyhledáme oddíl o popisovačích a seznámíme se s položkami popisovače zařízení, sestavení, rozhraní a s vlastnostmi koncového bodu. Spustíme program testlibusb, který nám vypíše USB zařízení v systému. Podle specifikace zjistíme vlastnosti jednotlivých zařízení a v tabulce výrobců a zařízení [3] si najdeme, jaká zařízení v systému máme. Zapíšeme si kolik má které zařízení možných sestavení, rozhraní a koncových bodů. Na adrese [4] můžeme vyhledat, jaké jsou třídy jednotlivých rozhraní. Najdeme si jedno zařízení, které nám poskytne data v režimu interrupt a napíšeme program, který bude tato data příjmat.
Pomocí programu testlibusb
(je součástí zdrojových kódů
libusb
), který vypíše všechna USB zařízení obsažená v systému
a jejich parametry jsme získali následující informace:
bus/device idVendor/idProduct 004/001 0000/0000 - Product : USB UHCI Root Hub - Serial Number: d800 wTotalLength: 25 bNumInterfaces: 1 bConfigurationValue: 1 iConfiguration: 0 bmAttributes: 40h MaxPower: 0 bInterfaceNumber: 0 bAlternateSetting: 0 bNumEndpoints: 1 bInterfaceClass: 9 bInterfaceSubClass: 0 bInterfaceProtocol: 0 iInterface: 0 bEndpointAddress: 81h bmAttributes: 03h wMaxPacketSize: 8 bInterval: 255 bRefresh: 0 bSynchAddress: 0 004/002 045E/0040 - Manufacturer : Microsoft - Product : Microsoft 3-Button Mouse with IntelliEye(TM) wTotalLength: 34 bNumInterfaces: 1 bConfigurationValue: 1 iConfiguration: 0 bmAttributes: a0h MaxPower: 50 bInterfaceNumber: 0 bAlternateSetting: 0 bNumEndpoints: 1 bInterfaceClass: 3 bInterfaceSubClass: 1 bInterfaceProtocol: 2 iInterface: 0 bEndpointAddress: 81h bmAttributes: 03h wMaxPacketSize: 4 bInterval: 10 bRefresh: 0 bSynchAddress: 0 003/001 0000/0000 - Product : USB UHCI Root Hub - Serial Number: d400 wTotalLength: 25 bNumInterfaces: 1 bConfigurationValue: 1 iConfiguration: 0 bmAttributes: 40h MaxPower: 0 bInterfaceNumber: 0 bAlternateSetting: 0 bNumEndpoints: 1 bInterfaceClass: 9 bInterfaceSubClass: 0 bInterfaceProtocol: 0 iInterface: 0 bEndpointAddress: 81h bmAttributes: 03h wMaxPacketSize: 8 bInterval: 255 bRefresh: 0 bSynchAddress: 0 002/001 0000/0000 - Product : USB UHCI Root Hub - Serial Number: d000 wTotalLength: 25 bNumInterfaces: 1 bConfigurationValue: 1 iConfiguration: 0 bmAttributes: 40h MaxPower: 0 bInterfaceNumber: 0 bAlternateSetting: 0 bNumEndpoints: 1 bInterfaceClass: 9 bInterfaceSubClass: 0 bInterfaceProtocol: 0 iInterface: 0 bEndpointAddress: 81h bmAttributes: 03h wMaxPacketSize: 8 bInterval: 255 bRefresh: 0 bSynchAddress: 0 001/001 0000/0000 - Product : USB UHCI Root Hub - Serial Number: cc00 wTotalLength: 25 bNumInterfaces: 1 bConfigurationValue: 1 iConfiguration: 0 bmAttributes: 40h MaxPower: 0 bInterfaceNumber: 0 bAlternateSetting: 0 bNumEndpoints: 1 bInterfaceClass: 9 bInterfaceSubClass: 0 bInterfaceProtocol: 0 iInterface: 0 bEndpointAddress: 81h bmAttributes: 03h wMaxPacketSize: 8 bInterval: 255 bRefresh: 0 bSynchAddress: 0
výpis 1 - Informace o sběrnicích a zařízeních
Z uvedeného výpisu vyplývá, že v systému jsou 4 USB sběrnice a (nepočítáme-li jednotlivé "kořenové huby") jediné zařízení:
Microsoft 3-Button Mouse with IntelliEyeTM
100mA
(Dle specifikace
[5] je odběr udáván v 2mA jednotkách!)81h
- udává směr toku dat: Out
a číslo endpointu: 1
03h
- udává, že jde o zařízení s
interrupt mode přenosem.4B
10 framů
(Pro USB-1
zařízení to odpovídá 10ms)Pro připojenou myš jsme napsali krátký program1, který v "nekonečné smyčce" příjmá data z myši. Z výpisu jsme poté odhadli, význam jednotlivých bajtů, tedy vlastně komunikační protokol myši.
0 -7 10 0 0 -4 8 0 0 -5 7 0 0 -2 4 0 0 -1 1 0 0 1 -1 0 0 1 -1 0 0 -4 1 0 0 -2 0 0 0 0 1 0 0 -1 0 0 2 0 0 0 0 0 0 0 1 0 0 0 4 0 0 1 4 0 0 1 0 0 0 0 0 0 0 1 0 0 0 -1 0 0 0 -2 0 0 0 -2 0 0 0 -1 0 0 0 1 ...
výpis 2 - Data z myši
Význam dat je následující:
[1]
http://libusb.sourceforge.net
[2]
http://www.usb.org/developers/docs
[3]
http://www.linux-usb.org/usb.ids
[4]
http://www.xat.nl/en/riscos/sw/usb
[5]
http://www.beyondlogic.org/usbnutshell/usb2.htm
1. usbdev.c - Program pro "interrupt mode" čtení informací z USB zařízení (myši).