USB协议HID设备

USB基础协议
USB HID协议
补充一下报告描述符

在这里插入图片描述

  • 报告描述符必须包括以下各项来描述控件的数据(所有其他项都是可选的)。
  • 报表描述符由一个一个的 Item 构成,Item 分为了两种,多为Short Item
    在这里插入图片描述
截取键盘部分报告描述符
    /* keyboared */
    0x05, 0x01, // USAGE_PAGE (Generic Desktop)
    0x09, 0x06, // USAGE (Keyboard)
    0xa1, 0x01, // COLLECTION (Application)
    0x85, 0x01, // Report ID (1) <-- 之后的上报键值依赖此 ID
    0x05, 0x07, // USAGE_PAGE (Keyboard)
    0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00, // LOGICAL_MINIMUM (0)
    0x25, 0x01, // LOGICAL_MAXIMUM (1)
    0x75, 0x01, // REPORT_SIZE (1)
    0x95, 0x08, // REPORT_COUNT (8)
    0x81, 0x02, // INPUT (Data,Var,Abs)
    0x95, 0x01, // REPORT_COUNT (1)
    0x75, 0x08, // REPORT_SIZE (8)
  • 其中HID描述符可以用软件生成和解析,有了注释就很明确了
  • 根据Device Class Definition for human interface device文档26页
    请添加图片描述
  • 报文中的0x05 0x01,其中0x05为控制标识符 0x01为数据
    • 由此可知 bsize为1,btype为1,btag为0
  • 想要知道0x05代表什么,看他的btag高四位+btype的两位。0000 01
    • 在文档的25页 35页 40页与item tag对比
    • 或直接在文档搜索0000 01
  • 最后可以在35页对比出来,为Usage Page,其余的对比方法类似。
  • 参数后面就有对该参数的解释,跟着的数据是什么意思。
  • HID Usage Tables文件编码对应0x05 Usage Page后面跟的数据
Report上报

请添加图片描述

  • Report报文比较简单,可以看看57页的Example
  • Report ID和Report Data组成,报文位长度为Report Size * Report Count
上报举例
报告描述符
    /* consumer */
    0x05, 0x0C,        // Usage Page (Consumer)
    0x09, 0x01,        // Usage (Consumer Control)
    0xA1, 0x01,        // Collection (Application)
    0x85, 0x02,        //   Report ID (2)  <-- 之后的上报键值依赖此 ID
    0x19, 0x00,        //   Usage Minimum (Unassigned)
    0x2A, 0x3C, 0x03,  //   Usage Maximum (0x033C)
    0x15, 0x00,        //   Logical Minimum (0)
    0x26, 0x3C, 0x03,  //   Logical Maximum (828)
    0x95, 0x01,        //   Report Count (1)
    0x75, 0x18,        //   Report Size (24)
    0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0x05, 0x01,        //   Usage Page (Generic Desktop Ctrls) 用途页0x01(普通桌面)
    0x19, 0x00,        //   Usage Minimum (Undefined)   用途最小值0x00(未定义)
    0x29, 0x83,        //   Usage Maximum (Sys Wake Up) 用途最大值0x83(系统唤醒)
    0x15, 0x00,        //   Logical Minimum (0)
    0x25, 0x83,        //   Logical Maximum (-125)
    0x75, 0x08,        //   Report Size (8)
    0x95, 0x01,        //   Report Count (1) 输入1字节数据
    0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
    0xC0,              // End Collection
进行分析
  • 首先可以看到Report ID为0x02,上报数组的第一字节为0x02

  • 其次可以看到Report Count (1)和Report Size (24),数组往后延申24位,即三个字节

    • Usage Page为0x0C,Consumer Page

    • Usage的值为定义与数组或位图关联的起始用法。Logical的值为变量或数组项将报告的最大值。

    • Input修饰这三个字节,(数据、数组、Abs、无换行、线性、首选状态、无空位置)

  • 再其次是Report Count (1)和Report Size (8),数组往后延申8位,即一个字节

    • Usage Page为0x01,Generic Desktop Page
  • 上报总体数据应该为02 00 00 00 00

查找功能
  • 现在只看三个字节的部分,即Usage Page为0x0C的部分,后一个字节的方法相同

  • 打开HID Usage Tables文件,打开Consumer Page (0x0C),可以看到很多Usage ID

  • 通过定义按钮,发送Usage ID实现功能,例如将一个按键定义为Play/Pause功能,则按键按下将数组第一个字节赋值为0xCD,等待上报即可。

  • 按下后发送02 CD 00 00 00,松开发送02 00 00 00 00。

Usage Types类型(简单翻译)
  • CA:仅在应用程序级集合中使用的Usage。
  • CL:应用于逻辑集合的Usage。逻辑集合可用于进一步定义它们所包含的项或控件的用途。
  • NAry:为了简化应用程序查找一组选择器的过程,无论是定义为数组字段还是位图,选择器集都可以通过将它们包装在逻辑集合中并将Usage应用于集合来命名。
  • OSC:一次控制是一个按钮,触发一个单一的事件或行动。
  • RTC:重新触发控件是一个按钮,只要它被断言,就会触发重复事件。0到1转换启动第一个事件。1到0转换启动则另一个事件将发生。
  • OOC:开/关控制从0到-1的转换生成关闭条件,从0到+1的转换生成打开条件。
  • MC:瞬间控制是一个基本的按钮。一个例子是鼠标按钮。
  • Sel:选择器可以以多种方式实现:Array[1](一组中的一个选择),Array[n](一组中的n个选择)(例子为键盘)或位图(一组中的任何选择)。
  • LC:在许多情况下,线性值的控件被实现为一对递增/递减旋钮或滑块的线性控件。其中−n递减值,+n递增值,断言0时不发生变化。
  • DV:动态值是包含与控件关联的值的n位字段。关联的主项将设置数据和变量标志。动态值主项必须声明为Data。

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值