Saya mencoba sedikit mendidik diri saya tentang cara membuat deskriptor USB HID di C untuk proyek USB PIC32 yang ingin saya coba.
Saya telah mengunduh dokumen HID Usage Tables dari http://www.usb.org/developers/hidpage/ dan mencoba mencari tahu di mana nilai aktual diindikasikan untuk elemen berbeda di deskriptor HID.
Biarkan saya jelaskan dengan kutipan dari sampel yang saya lihat:
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)
// ...
Dari contoh di atas, jelas bahwa array BYTE terdiri dari pasangan kunci / nilai, jika saya boleh menyebutnya begitu. Misalnya baris ke-2: 0x05,0x01 menunjukkan kunci 0x05, yang merupakan Halaman Penggunaan , dan 0x01 adalah nilai yang menunjukkan Generic Desktop
Saya mencoba mencari tahu di mana nilai-nilai ini ditunjukkan dalam dokumen PDF Tabel Penggunaan HID. Misalnya, saya tidak dapat menemukan referensi itu
USAGE_PAGE == 0x05
dan misalnya
COLLECTION == 0xA1
Saya mencoba mencari PDF untuk 0xA1, tanpa hasil. Satu-satunya cara saya bisa mengetahui nilai-nilainya, adalah dengan melihat komentar pada contoh, atau dengan menggunakan Alat Descriptor USB dari tautan di atas.
Saya hanya ingin tahu, apakah saya benar-benar bodoh karena melewatkan dokumentasi referensi kunci / nilai ini?
Ada banyak contoh online, seperti misalnya tautan berikut: http://www.frank-zhao.com/cache/hid_tutorial_1.php
Tetapi bahkan referensi ini memuat banyak nilai string seperti END_COLLECTION == 0xc0
Di mana saya menemukan referensi untuk nilai-nilai ini? Apa yang saya lewatkan?
Jawaban:
Dokumentasi USB sangat mengerikan. Itu menderita generalisasi berlebihan, di mana mereka mencoba untuk membuat semuanya begitu umum dan umum sehingga sulit untuk mendapatkan dari dokumen ke aplikasi spesifik apa pun.
Format deskriptor terletak di dokumen yang disebut " Definisi Kelas Perangkat untuk HID " di tautan ke usb.org yang Anda berikan.
Hal penting yang Anda lewatkan adalah bahwa berbagai segmen (seperti 0x05) tidak didokumentasikan dengan awalan 0x . Bahkan, mereka umumnya menggambarkannya dalam biner mentah .
Misalnya, terkait dengan 0xA1:
Anda dapat melihat bahwa awalan biner
1010_00nn
menunjukkan bahwa itu adalah kumpulan, dan postfixnnnn_nn01
menunjukkan panjangnya 1 byte. Kemudian byte selanjutnya kemudian diartikan sebagai tipe koleksi, dalam hal ini tipe Aplikasi. Ini kemudian menetapkan konteks di mana byte lebih lanjut ditafsirkan, sampai parser deskriptor HID baik melihat tag koleksi lain, atau penanda koleksi akhir.Anda dapat melihat yang
END COLLECTION
ditentukan sebagai0b1100_00nn
, dengannn
diabaikan. Dari sinilah0xC0
asalnya.Anda juga dapat mulai melihat bagaimana argumen lain dikonstruksikan. Misalnya,
LOGICAL MINIMUM
adalah0x25
, atau0b0010_0101
. Dari itu, kita dapat melihat bahwa kita memiliki panjang data0bnnnn_nn01
, atau satu byte, dan specifier untukLOGICAL MINIMUM
is0b0010_01nn
Struktur untuk
USAGE PAGE
deskriptor adalah sama. Perintah untuk memilih halaman penggunaan adalah0000_01nn
, dannnnn_nn01
mengindikasikan panjangnya 1 byte. Saya kira, karena dokumentasi menyatakan bahwa penggunaan-halaman adalah 32 bit, bit atas diasumsikan nol, atau disimpulkan dari bagian lain dari dokumentasi. Saya sebenarnya tidak tahu bagaimana mereka ditentukan.Ada halaman bagus dari berbagai konstanta HID di sini .
Dan versi yang lebih baru dari sumber BSD di sini (Terima kasih, @crazysim!) ( HEAD terbaru , mungkin tidak bertahan lama).
sumber