Gdzie szukać wartości do budowania deskryptora HID USB?

10

Próbuję się trochę nauczyć na temat tworzenia deskryptora HID USB w C dla projektu PIC32 USB, który chcę podjąć.

Pobrałem dokument Tabele użytkowania HID ze strony http://www.usb.org/developers/hidpage/ i próbuję dowiedzieć się, gdzie wskazane są rzeczywiste wartości dla różnych elementów deskryptora HID.

Pozwól mi wyjaśnić fragmentem próbki, na którą patrzę:

ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={{
  0x05,0x01,        // USAGE_PAGE (Generic Desktop)
  0x09,0x05,        // USAGE (Game Pad)
  0xA1,0x01,        // COLLECTION (Application)
  0x15,0x00,        //   LOGICAL_MINIMUM(0)
  0x25,0x01,        //   LOGICAL_MAXIMUM(1)
  0x35,0x00,        //   PHYSICAL_MINIMUM(0)
  0x45,0x01,        //   PHYSICAL_MAXIMUM(1)
  // ...

Z powyższego przykładu jasno wynika, że ​​tablica BYTE składa się z par klucz / wartość, jeśli mogę to tak nazwać. Na przykład druga linia: 0x05,0x01 wskazuje klucz 0x05, który jest stroną użytkowania , a 0x01 to wartość wskazująca ogólny pulpit

Próbuję dowiedzieć się, gdzie te wartości są wskazane w dokumencie PDF HID Table of Use. Na przykład nie mogę znaleźć żadnego odniesienia do tego

USAGE_PAGE == 0x05

i na przykład

COLLECTION == 0xA1

Próbowałem przeszukać plik PDF pod kątem 0xA1, bez rezultatu. Jedynym sposobem, w jaki mogę dowiedzieć się, jakie są wartości, jest zapoznanie się z komentarzami z przykładu lub użycie narzędzia USB Descriptor z powyższego łącza.

Zastanawiam się, czy jestem całkowicie głupi, że brakuje mi dokumentacji referencyjnej dotyczącej klucza / wartości?

Istnieje wiele przykładów online, na przykład następujący link: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Ale nawet to odwołuje się do mnóstwa wartości ciągów, takich jak END_COLLECTION == 0xc0

Gdzie znajdę odniesienie do tych wartości? czego mi brakuje?

josef.van.niekerk
źródło
Wygląda na to, że będę musiał użyć narzędzia USB Descriptor do zbudowania deskryptora HID. :)
josef.van.niekerk

Odpowiedzi:

20

Dokumentacja USB jest dość okropna. Cierpi z powodu nadmiernego uogólnienia, gdzie starają się, aby wszystko było tak ogólne i ogólne, że trudno jest dostać się z dokumentacji do jakiejkolwiek konkretnej aplikacji.

Format deskryptora znajduje się w dokumencie o nazwie „ Device Class Definition for HID ” pod linkiem do podanego adresu usb.org.

Najważniejszą rzeczą, której brakuje, jest to, że różne segmenty (takie jak 0x05) nie są udokumentowane przedrostkiem 0x . W rzeczywistości opisują je ogólnie w postaci binarnej .

Na przykład w odniesieniu do 0xA1: wprowadź opis zdjęcia tutaj

Widać, że binarny prefiks 1010_00nnoznacza, że ​​jest to kolekcja, a postfiks nnnn_nn01oznacza, że ​​ma on 1 bajt. Następnie kolejny bajt jest interpretowany jako typ kolekcji, w tym przypadku typu Application. To ustawia kontekst, w którym interpretowane są kolejne bajty, dopóki parser deskryptorów HID nie zobaczy innego znacznika kolekcji lub znacznika końcowego kolekcji.

Możesz zobaczyć, że END COLLECTIONjest określony jako 0b1100_00nn, z nnignorowaniem. Stąd 0xC0pochodzi.

Możesz także zacząć widzieć, jak konstruowane są inne argumenty. Na przykład LOGICAL MINIMUMjest 0x25lub 0b0010_0101. Z tego wynika, że ​​mamy długość danych 0bnnnn_nn01lub jeden bajt, a specyfikatorem dla LOGICAL MINIMUMjest0b0010_01nn

wprowadź opis zdjęcia tutaj

Struktura USAGE PAGEdeskryptora jest taka sama. Polecenie wyboru strony użycia to 0000_01nni nnnn_nn01wskazuje, że ma on 1 bajt. Sądzę, że skoro dokumentacja stwierdza, że ​​strony użytkowania mają 32 bity, przyjmuje się, że górne bity mają wartość zero lub są wywnioskowane z innej części dokumentacji. Właściwie nie wiem, jak są określone.

Jest tam dobra strona z różnymi stałymi HID tutaj .

I najnowsza wersja ze źródeł BSD tutaj (Dzięki, @crazysim!) (Najnowszy HEAD , może nie trwać).

Connor Wolf
źródło
Dokładnie to, czego potrzebowałem. Dziękuję bardzo za szczegółową odpowiedź. To naprawdę bardzo pomaga! ;)
josef.van.niekerk
1
@ josef.van.niekerk - Nie ma problemu. Minęło trochę czasu, zanim zagłębiłem się w standardy USB, a są one tak nieprzejrzyste, jak zapamiętałem.
Connor Wolf,
Przepraszam za grabież, ale link do USB.org już nie działa.
Rob van der Veer,
1
@RobvanderVeer powinien zostać teraz naprawiony.
hoosierEE
1
Czy ta „dobra strona różnych stałych HID” powinna zostać zmieniona na późniejszą wersję tego pliku ze źródeł FreeBSD? ?
crazysim