關於USBHID協議以及鼠標鍵盤描述符的解釋【轉】


轉自:https://blog.csdn.net/jiujiujiuqiuqiuqiu/article/details/47277685

一.HID設備識別

前面有提到關於SCSI協議的USB設備實現。現在來談談USBHID設備。HID全稱Human Interface Device。HID協議里增加了HID描述符和報告描述符,以及特定的關於HID的類請求。HID設備的通信是通過報表來進行的。據說,報告描述符是USB設備中最難的描述符了。關於HID描述符可以參考HID協議。接下來我們談談報告描述符。

二.報告描述符

每一個HID設備都有自己的報告描述符。報告描述符有三種類項目:Main類項目,Global類項目,Local類項目。具體看下表
Global作用域是遇到下一個同名Global,Local作用域是遇到下一個Main(Input,Output,Feature)。Usage Min-Max表示有幾種功能,Logical Min-Max表示有幾種狀態。每個報告描述符都有報告ID,報告ID是用來區別復合設備的。在報告描述符里沒有寫報告ID,默認報告ID是0。USB的控制端點可以進行Input,Output,Feature項目的傳輸,
中斷端點可以進行Input,Output傳輸。

三.鼠標和鍵盤的報告描述符

(1)鍵盤的報告描述符
  1. 0x05,0x01,// Global Generic Desktop
  2. 0x09,0x06,// Local KeyBoard
  3. 0xA1,0x01,// Main app collection
  4. 0x05,0x07,// Global KeyBoard
  5. //////////////////////////////////第1字節
  6. 0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)
  7. 0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)
  8. 0x15,0x00,// Global Logical Min
  9. 0x25,0x01,// Global Logical Max
  10. 0x95,0x08,// Global ReportCount
  11. 0x75,0x01,// Global ReportSize
  12. 0x81,0x02,// Main Input(Data,Var,Abs)
  13. //////////////////////////////////第2字節
  14. 0x95,0x01,// Global ReportCount
  15. 0x75,0x08,// Global ReportSize
  16. 0x81,0x03,// Main Input(Cnst,Var,Abs)
  17. //////////////////////////////////第3-8字節
  18. 0x95,0x06,// Global ReportCount
  19. 0x75,0x08,// Global ReportSize
  20. 0x15,0x00,// Global Logical Min
  21. 0x26,0xff,0x00,//Global Logical Max
  22. 0x19,0x00,// Local Usage Min
  23. 0x29,0x65,// Local Usage Max
  24. 0x81,0x00,// Main Output(Data,Ary,Abs)
  25. ////////////////////////////////1字節輸出報告
  26. 0x15,0x00,// Global Logical Min
  27. 0x25,0x01,// Global Logical Max
  28. 0x95,0x05,// Global ReportCount
  29. 0x75,0x01,// Global ReportSize
  30. 0x05,0x08,// Global LED
  31. 0x19,0x01,// Local Usage Min
  32. 0x29,0x05,// Local Usage Max
  33. 0x91,0x02,// Main Output(Data,Var,Abs)
  34. ////////////////////////////////補足上面變成1個字節
  35. 0x95,0x01,// Global ReportCount
  36. 0x75,0x03,// Global ReportSize
  37. 0x91,0x03,// Main Output(Cnst,Var,Abs)
  38. 0xc0 // Main End collection
鍵盤的描述符共有8字節的輸入報告和1字節的輸出報告。
8字節輸入報告:第1字節特殊按鍵,第2字節保留常量,第3-8字節普通按鍵。鍵值可以參考USB HID to PS/2 Scan Code Translation Table.
1字節輸出報告:這1個字節總共用了5bits使用3bits常量來補足成1個字節。5bits用來點亮特殊鍵盤上的Led燈,比如鍵盤的大小寫,數字鍵,小鍵盤的LED燈。
如果不給鍵盤配置OUT端點,那么鍵盤的1字節輸出報告將由控制端點的SetReport進行傳輸。
(2)鼠標描述符
  1. 0x05,0x01, // Global Generic Desktop
  2. 0x09,0x02, // Local Mouse
  3. 0xa1,0x01, // Main app collection
  4. 0x09,0x01, // Local Pointer
  5. 0xa1,0x00, // Main phy collection
  6. 0x95,0x03, // Global ReportCount
  7. 0x75,0x01, // Global ReportSize
  8. 0x05,0x09, // Global Button
  9. 0x19,0x01, // Local Usage Min
  10. 0x29,0x03, // Local Usage Max
  11. 0x15,0x00, // Global Logical Min
  12. 0x25,0x01, // Global Logical Max
  13. 0x81,0x02, // Main Input(Data,Var,Abs)
  14. 0x95,0x01, // Global ReportCount
  15. 0x75,0x05, // Global ReportSize
  16. 0x81,0x03, // Main Input(Cnsr,Var,Abs)
  17. 0x95,0x03,0x75,0x08, // Global ReportCount Global ReportSize
  18. 0x05,0x01, // Global Generic Desktip
  19. 0x09,0x30, // Local X
  20. 0x09,0x31, // Local Y
  21. 0x09,0x38, // Locak Wheel
  22. 0x15,0x81, // Global Logical Min
  23. 0x25,0x7f, // Global Logical Max
  24. 0x81,0x06, // Main Input(Data,Var,Rel)
  25. 0xc0, // Main End collection
  26. 0xc0 // Main End collection
鼠標描述符有4字節輸入報告。第1個字節前3位表示左右中三鍵,后面3個字節分別表示X軸,Y軸,滑輪。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM