Universal Serial Bus

Laboratorní úloha z předmětu 36PZ

Martin Tůma

Zadání

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.

Úkoly

Výsledky měření

Sběrnice a zařízení

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

Komunikace s USB myší

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í:

Reference

[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

Přílohy

1. usbdev.c - Program pro "interrupt mode" čtení informací z USB zařízení (myši).