ฉันจะค้นหาค่าสำหรับการสร้างตัวบ่งชี้ USB HID ได้ที่ไหน


10

ฉันพยายามที่จะให้ความรู้กับตัวเองเล็กน้อยเกี่ยวกับการสร้างตัวอธิบาย USB HID ใน C สำหรับโครงการ USB PIC32 ที่ฉันต้องการลอง

ฉันได้ดาวน์โหลดเอกสารตารางการใช้งาน HID จากhttp://www.usb.org/developers/hidpage/และพยายามที่จะระบุว่าค่าจริงจะถูกระบุไว้อย่างไรสำหรับองค์ประกอบต่าง ๆ ในตัวบอกสถานะ HID

ให้ฉันอธิบายด้วยข้อความที่ตัดตอนมาจากตัวอย่างที่ฉันกำลังดู:

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

จากตัวอย่างข้างต้นเป็นที่ชัดเจนว่าอาร์เรย์ BYTE ประกอบด้วยคู่ของคีย์ / ค่าถ้าฉันอาจเรียกมันว่า ตัวอย่างเช่นบรรทัดที่ 2: 0x05,0x01หมายถึงคีย์ 0x05 ซึ่งเป็นหน้าการใช้งานและ 0x01 เป็นค่าที่ระบุGeneric Desktop

ฉันพยายามหาว่าค่าเหล่านี้ระบุไว้ในเอกสาร PDF ตารางการใช้งานของ HID ตัวอย่างเช่นฉันไม่พบการอ้างอิง

USAGE_PAGE == 0x05

และตัวอย่างเช่น

COLLECTION == 0xA1

ฉันลองค้นหา PDF สำหรับ 0xA1 แล้วไม่มีผลลัพธ์ วิธีเดียวที่ฉันสามารถค้นหาว่าค่าคืออะไรโดยการดูความคิดเห็นของตัวอย่างหรือโดยใช้เครื่องมือ USB Descriptorจากลิงค์ด้านบน

ฉันแค่สงสัยว่าฉันหลงทางทั้งหมดที่ขาดเอกสารอ้างอิงคีย์ / ค่านี้หรือไม่?

มีตัวอย่างมากมายออนไลน์อย่างเช่นลิงค์ต่อไปนี้: http://www.frank-zhao.com/cache/hid_tutorial_1.php

แต่แม้นี้จะอ้างอิงการโหลดค่าสตริงเช่นEND_COLLECTION == 0xc0

ฉันจะหาข้อมูลอ้างอิงสำหรับค่าเหล่านี้ได้จากที่ใด ฉันพลาดอะไรไป


ดูเหมือนว่าฉันจะต้องใช้เครื่องมือ USB Descriptor เพื่อสร้าง HID descriptor :)
josef.van.niekerk

คำตอบ:


20

เอกสาร USB ค่อนข้างแย่มาก มันทนทุกข์ทรมานจากการสร้างรูปแบบที่มากเกินไปซึ่งพวกเขากำลังพยายามทำให้ทุกอย่างเป็นเรื่องธรรมดาและเป็นเรื่องยากที่จะได้รับจากเอกสารไปยังแอปพลิเคชันเฉพาะ

รูปแบบตัวอธิบายตั้งอยู่ในเอกสารที่ชื่อว่า " Device Class Definition for HID " ที่ลิงค์ไปยัง usb.org ที่คุณให้ไว้

สิ่งสำคัญที่คุณกำลังขาดหายไปคือว่าส่วนต่างๆ (เช่น 0x05) ไม่ได้เป็นเอกสารที่มีคำนำหน้า 0x ในความเป็นจริงพวกเขามักอธิบายไว้ในไบนารีดิบ

ตัวอย่างเช่นเกี่ยวกับ 0xA1: ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถเห็นว่าคำนำหน้าไบนารี1010_00nnบ่งชี้ว่าเป็นชุดสะสมและ postfix nnnn_nn01ระบุว่ามีความยาว 1 ไบต์ จากนั้นไบต์ที่ตามมาจะถูกตีความว่าเป็นชนิดของการเก็บรวบรวมในกรณีของแอปพลิเคชันประเภทนี้ จากนั้นตั้งค่าบริบทที่มีการตีความไบต์เพิ่มเติมจนกว่าตัวแยกวิเคราะห์ตัวบอกสถานะ HID จะเห็นแท็กคอลเลกชันอื่นหรือตัวทำเครื่องหมายการรวบรวมสิ้นสุด

คุณจะเห็นว่าEND COLLECTIONถูกระบุว่าเป็น0b1100_00nnโดยnnไม่สนใจ นี่คือที่0xC0มาจาก

คุณยังสามารถเริ่มต้นเพื่อดูว่าข้อโต้แย้งอื่น ๆ นั้นถูกสร้างขึ้น ยกตัวอย่างเช่นLOGICAL MINIMUMเป็นหรือ0x25 0b0010_0101จากนั้นเราจะเห็นว่าเรามีความยาวข้อมูล0bnnnn_nn01หรือหนึ่งไบต์และตัวระบุสำหรับLOGICAL MINIMUMคือ0b0010_01nn

ป้อนคำอธิบายรูปภาพที่นี่

โครงสร้างของUSAGE PAGEdescriptor เหมือนกัน คำสั่งเพื่อเลือกหน้าการใช้งานคือ0000_01nnและnnnn_nn01ระบุว่ามีความยาว 1 ไบต์ ฉันเดาว่าเนื่องจากเอกสารระบุว่าหน้าการใช้งานเป็น 32 บิตบิตบนจะถือว่าเป็นศูนย์หรืออนุมานจากส่วนอื่นของเอกสาร จริง ๆ แล้วฉันไม่รู้ว่าพวกเขาระบุไว้อย่างไร

มีหน้าที่ที่ดีของค่าคงที่ HID ต่างๆที่นี่

และเวอร์ชันที่ใหม่กว่าจากแหล่ง BSD ที่นี่ (ขอบคุณ @crazysim!) ( HEADล่าสุดอาจไม่ใช่ครั้งสุดท้าย)


สิ่งที่ฉันต้องการ ขอบคุณมากสำหรับคำตอบในเชิงลึก มันช่วยได้มากจริงๆ! ;)
josef.van.niekerk

1
@ josef.van.niekerk - ไม่มีปัญหา ไม่นานมานี้ก่อนที่ฉันจะขุดลงในมาตรฐาน USB และพวกมันก็ทึบอย่างที่ฉันจำได้
Connor Wolf

ฉันขอโทษสำหรับการขุดหลุมฝังศพ แต่ลิงก์ไปยัง USB.org ไม่ทำงานอีกต่อไป
Rob van der Veer

1
@RobvanderVeer ควรได้รับการแก้ไขแล้ว
hoosierEE

1
ควร "เปลี่ยนหน้าดีของค่าคงที่ HID ต่างๆ" เป็นไฟล์รุ่นที่ใหม่กว่าจากแหล่ง FreeBSD หรือไม่ ?
crazysim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.