Di mana saya mencari nilai untuk membangun deskriptor HID USB?

10

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?

josef.van.niekerk
sumber
Sepertinya saya harus menggunakan Alat Descriptor USB untuk membuat deskriptor HID. :)
josef.van.niekerk

Jawaban:

20

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: masukkan deskripsi gambar di sini

Anda dapat melihat bahwa awalan biner1010_00nn menunjukkan bahwa itu adalah kumpulan, dan postfix nnnn_nn01menunjukkan 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 COLLECTIONditentukan sebagai 0b1100_00nn, dengan nndiabaikan. Dari sinilah 0xC0asalnya.

Anda juga dapat mulai melihat bagaimana argumen lain dikonstruksikan. Misalnya, LOGICAL MINIMUMadalah 0x25, atau 0b0010_0101. Dari itu, kita dapat melihat bahwa kita memiliki panjang data 0bnnnn_nn01, atau satu byte, dan specifier untuk LOGICAL MINIMUMis0b0010_01nn

masukkan deskripsi gambar di sini

Struktur untuk USAGE PAGEdeskriptor adalah sama. Perintah untuk memilih halaman penggunaan adalah 0000_01nn, dan nnnn_nn01mengindikasikan 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).

Connor Wolf
sumber
Apa yang saya butuhkan. Terima kasih banyak atas jawaban mendalamnya. Ini sangat membantu! ;)
josef.van.niekerk
1
@ josef.van.niekerk - Tidak masalah. Sudah lama sebelum saya menggali ke dalam standar USB, dan mereka sama buram seperti yang saya ingat.
Connor Wolf
Saya minta maaf atas pelanggaran berat tetapi tautan ke USB.org tidak berfungsi lagi.
Rob van der Veer
1
@RobvanderVeer harus diperbaiki sekarang.
hoosierEE
1
Haruskah "halaman bagus berbagai konstanta HID" diubah ke versi file yang lebih baru dari sumber FreeBSD? ?
crazysim