zoukankan      html  css  js  c++  java
  • 关于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轴,滑轮。
  • 相关阅读:
    Python学习
    我的计算机网络复习笔记(第一章)
    理解DES算法
    彻底理解RSA加密算法
    扩展欧几里得算法求模的乘法逆元
    python的deque(双向)队列详解
    对于暴力枚举的一些优化方法的题解
    python中的多(liu)元(mang)交换 ,赋值
    python定义函数后跟->的意义
    直接暴力做分糖问题
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/9265154.html
Copyright © 2011-2022 走看看