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?
Odpowiedzi:
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:
Widać, że binarny prefiks
1010_00nn
oznacza, że jest to kolekcja, a postfiksnnnn_nn01
oznacza, ż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 COLLECTION
jest określony jako0b1100_00nn
, znn
ignorowaniem. Stąd0xC0
pochodzi.Możesz także zacząć widzieć, jak konstruowane są inne argumenty. Na przykład
LOGICAL MINIMUM
jest0x25
lub0b0010_0101
. Z tego wynika, że mamy długość danych0bnnnn_nn01
lub jeden bajt, a specyfikatorem dlaLOGICAL MINIMUM
jest0b0010_01nn
Struktura
USAGE PAGE
deskryptora jest taka sama. Polecenie wyboru strony użycia to0000_01nn
innnn_nn01
wskazuje, ż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ć).
źródło