• 关于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 绘制所有线条、散点等 可用的标记符号(marker)
    Maximal InformMaximal Information Coefficient (MIC)最大互信息系数详解与实现 https://blog.csdn.net/FontThrone/article/details/85227239
    python画图,等间距坐标距离表示不等间距数据值
    机器学习数据库 http://archive.ics.uci.edu/ml/datasets.php https://www.openml.org/d/179
    Matplotlib.pyplot.plot图形符号、风格及颜色简写形式速查表https://blog.csdn.net/Treasure99/article/details/106044114/
    Pycharm 2017.3 永久激活教程https://www.bilibili.com/read/cv11643882/
    学习资源http://imada.huel.edu.cn/resource.html# 数据库/机器学习/安全领域顶会论文
    Python的知识点 plt.plot()函数细节
    原因是标题默认输出英文,如果输出中文,要对字体进行调整。需要在程序定义前输入:
    会讲故事助你成功
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/9265154.html
Copyright © 2020-2023  润新知