Referát z předmětu 36PZ
Úloha D: USB
Skupina
D: Duben, Fialka, Pechanec, Saidl
(zpět na seznam úloh)
Zadání
Úkolem této laboratorní úlohy je seznámit se se sběrnicí USB, pochopit její
strukturu z pohledu programátora a napsat velmi jednoduchý program, který bude
přijímat data ze zařízení připojeného na sběrnici.
Konkrétně se bude používat operační systém Linux a knihovna libusb. Nejprve je
třeba zkompilovat a spustit ukázkový program testlibusb.c a s jeho pomocí
zjistit informace o všech USB zařízeních přítomných v systému. Hlavní část úlohy
je nalézt zařízení poskytující data v režimu interrupt a napsat program, jež
umožní tato data přijmout a analyzovat.
Výpis zařízení
Zařízení připojitelných na USB sběrnici existuje mnoho různých tříd. Aby mohl
operační systém rozpoznat, o jaké zařízení se jedná, umožňuje komunikační
protokol na USB zjistit informace o připojených zařízeních.
Pomocí programu testlibusb jsme obdrželi výpis zařízení připojených do systému:
Zařízení: USB ROOT HUB (celkem 3x)
Třída: 9 - HUB
Zřízení: USB kamera (product id 0518)
Výrobce: OmniVision Technologies, Inc. (vendor id 05A9)
Maximální odběr: 250 mA
Třída: 255 - ostatní zařízení (kamery by měly spadat do třídy 6)
Počet rozhraní: 1
Počet alternativních nastavení: 8 (liší se velikostí
vysílaného paketu)
Velikost paketu: 0 - 896B
Počet koncových bodů: 1 (adresa 81h)
Režim přenosu dat: ?
Zřízení: USB myš(product id 0001)
Výrobce: neuveden (vendor id 0458)
Maximální odběr: 50 mA
Třída: 3 - HID - Human Interface Device
Podtída:
1.2 - myši
Počet rozhraní: 1
Počet alternativních nastavení: 1
Velikost paketu: 8B
Počet koncových bodů: 1 (adresa 81h)
Režim přenosu dat: Interrupt
Získávání dat ze zařízení
Pro získání dat byla vybrána USB myš, protože poskytuje data v režimu
interrupt, který je pro to nejvhodnější. Program na přijímání dat jsme vytvořili
upravením testovacího programu testlibusb.c. V programu jsme v cyklu
procházeli všechna připojená zařízení, dokud se nenarazilo na zařízení s vendor
id = 0458, čímž jsme nalezli myš. Tu jsme pak aktivovali pomocí funkce
usb_claim_interface a z koncového bodu na adrese 81h četli data do bufferu o
velikosti 8 bytů (8 bytů je maximální velikost paketu vysílaného použitou myší).
Získaná data jsme vypisovali v hexadecimálním tvaru.
příklad získaných dat - výpis hexadecimálně po osmi bytech na
řádek
1 0 0 62 2F 6C 64 2D
0 1 0 62 2F 6C 64 2D
1 0 0 62 2F 6C 64 2D
1 FF 0 62 2F 6C 64 2D
0 0 0 62 2F 6C 64 2D
2 0 0 62 2F 6C 64 2D
2 1 0 62 2F 6C 64 2D
0 0 0 62 2F 6C 64 2D
4 0 0 62 2F 6C 64 2D
4 FF 0 62 2F 6C 64 2D
0 0 0 62 2F 6C 64 2D
0 FD 0 62 2F 6C 64 2D
0 FC 0 62 2F 6C 64 2D
0 FE 0 62 2F 6C 64 2D
...
0 FE FD 62 2F 6C 64 2D
0 FE FD 62 2F 6C 64 2D
0 0 FA 62 2F 6C 64 2D
0 FF F8 62 2F 6C 64 2D
0 0 EC 62 2F 6C 64 2D
0 0 ED 62 2F 6C 64 2D
0 FE EB 62 2F 6C 64 2D
0 0 E0 62 2F 6C 64 2D
0 FF E3 62 2F 6C 64 2D
0 0 EE 62 2F 6C 64 2D
Analýzou získaných dat a toho, jak korespondují s pohyby myši jsme dospěli k následujícímu závěru. První byte z každého paketu nese informaci o stisknutí tlačítka - 1 znamená levé tlačítko, 2 pravé tlačítko a 4 prostřední tlačítko. Současný stisk více tlačítek se zřejmě projeví jako součet těchto hodnot (neověřená hypotéza). Druhý a třetí byte informují o pohybech myši ve směrech dvou souřadných os (v doplňkvém kódu). Posledních 5 bytů se nemění a zřejmě nemá u testované myši žádný váznam.
Závěr
V této laboratorní úloze jsme měli možnost zjistit, jak pracuje sběrnice USB.
Naučili jsme se pracovat s knihovnou libusb pod Linuxem a zjistili jsme, jakým
způsobem se zjišťují informace o jendotlivých připojených zařízeních. Podařilo
se nám také napsat a úspěšně spustit vlastní program, jež je schopen nalézt
konkrétní zařízení podle jeho čidentifikačního čísla a z tohoto zařízení číst
data. Pro čtení a následnou analýzu dat byla vybrána USB myš. Během odlaďování
programu bylo třeba několikrát ručně odstraňovat
ovladače mousedev
a hid,
které systém sám pro myš zavádí. Tyto ovladače bránily našemu programu v
činnosti a proto bylo třeba je před jeho spuštěním odstranit. Celkově není práce
s USB sběrnicí složitá, je pouze náročné zorientovat se ve velkém množství
údajů, jež jednotlivá zařízení poskytují.