Bir USB HID tanımlayıcısı oluşturmak için değerleri nerede ararım?


10

Denemek istediğim bir PIC32 USB projesi için C'de bir USB HID tanımlayıcısı oluşturma konusunda kendimi biraz eğitmeye çalışıyorum.

HID Kullanım Tabloları belgesini http://www.usb.org/developers/hidpage/ adresinden indirdim ve HID tanımlayıcıdaki farklı öğeler için gerçek değerlerin nerede belirtildiğini anlamaya çalışıyorum.

Baktığım örnekten bir alıntıyla açıklayayım:

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)
  // ...

Yukarıdaki örnekte, BYTE dizisinin anahtar / değer çiftlerinden oluştuğu açıktır, eğer bunu çağırabilirsem. Örneğin, 2. satır: 0x05,0x01 , Kullanım Sayfası olan 0x05 anahtarını gösterir ve 0x01, Genel Masaüstü'nü gösteren değerdir

HID Kullanım Tablosu PDF belgesinde bu değerlerin nerede olduğunu anlamaya çalışıyorum. Örneğin, hiçbir referans bulamıyorum

USAGE_PAGE == 0x05

ve örneğin

COLLECTION == 0xA1

PDF'yi 0xA1 için aramayı denedim, sonuç yok. Değerlerin ne olduğunu öğrenebilmemin tek yolu ya örneğin yorumlarına bakmak ya da yukarıdaki bağlantıdan USB Tanımlayıcı Aracını kullanmaktır .

Sadece merak ediyorum, bu anahtar / değer referans dokümanlarını kaçırdığım için tamamen şaşkın mıyım?

Çevrimiçi aşağıdaki gibi birçok örnek vardır: http://www.frank-zhao.com/cache/hid_tutorial_1.php

Ancak bu bile END_COLLECTION == 0xc0 gibi bir dizi dize değerine gönderme yapıyor

Bu değerler için referansı nerede bulabilirim? Neyi kaçırıyorum?


Görünüşe göre HID tanımlayıcısını oluşturmak için USB Tanımlayıcı Aracını kullanmam gerekecek. :)
josef.van.niekerk

Yanıtlar:


20

USB belgeleri oldukça korkunç. Aşırı jenerikleştirmeden muzdariptir, burada her şeyi o kadar genel ve genel yapmaya çalışırlar ki, dokümanlardan herhangi bir belirli uygulamaya geçmek zor.

Tanımlayıcı biçimi, sağladığınız usb.org bağlantısında " HID için Aygıt Sınıfı Tanımı " adlı belgede bulunur .

Eksik olan kritik nokta, çeşitli segmentlerin (0x05 gibi) 0x önekiyle belgelenmemiş olmasıdır . Aslında, onları genellikle ham ikili olarak tanımlarlar .

Örneğin, 0xA1 ile ilgili olarak: resim açıklamasını buraya girin

Bunu görebilirsiniz ikili öneki 1010_00nnolduğunu belirtir bir koleksiyon ve postfix olduğununnnn_nn01 o 1 bayt uzunluğunda olduğunu belirtir. Daha sonra sonraki bayt, toplama türü, bu uygulama türü olarak yorumlanır. Bu daha sonra, HID tanımlayıcı ayrıştırıcısı başka bir toplama etiketi veya bir uç toplama işaretçisi görene kadar diğer baytların yorumlandığı bağlamı ayarlar.

Bunun göz ardı edilerek olarak END COLLECTIONbelirtildiğini görebilirsiniz . Burası nereden geliyor.0b1100_00nnnn0xC0

Ayrıca diğer argümanların nasıl oluşturulduğunu görmeye başlayabilirsiniz. Örneğin, LOGICAL MINIMUMbir 0x25ya da 0b0010_0101. O, biz bir veri-uzunluğuna sahip olduğunu görebilirsiniz 0bnnnn_nn01veya bir bayt ve için belirtici LOGICAL MINIMUMDİR0b0010_01nn

resim açıklamasını buraya girin

USAGE PAGETanımlayıcının yapısı aynıdır. Kullanım sayfasını seçme komutu 0000_01nnvennnn_nn01 bunun 1 bayt uzunluğunda olduğunu belirtir. Dokümanların kullanım sayfalarının 32 bit olduğunu belirttiğinden, üst bitlerin sıfır olduğu veya belgelerin başka bir kısmından çıkarıldığı varsayılır. Aslında nasıl belirtildiklerini bilmiyorum.

Burada çeşitli HID sabitlerinin iyi bir sayfası var .

Ve burada BSD kaynaklarından daha yeni bir sürüm (Teşekkürler, @crazysim!) (Son HEAD , uzun sürebilir).


Tam ihtiyacım olan şey. Derin cevap için çok teşekkür ederim. Gerçekten çok yardımcı olur! ;)
josef.van.niekerk

1
@ josef.van.niekerk - Sorun değil. USB standartlarına girmeden önce bir süre geçti ve hatırladığım kadar opak.
Connor Wolf

Mezarlık için özür dilerim ama USB.org bağlantısı artık çalışmıyor.
Rob van der Veer

1
@RobvanderVeer şimdi düzeltilmelidir.
hoosierEE

1
Bu "çeşitli HID sabitlerinin iyi sayfası" , FreeBSD kaynaklarından bu dosyanın sonraki bir sürümüyle değiştirilmeli mi? ?
crazysim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.