USB(六)-HID(报告描述符的结构实现)

USB HID设备是通过报告(report)来传输数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机;输出报告是主机发送给USB设备。

报告描述符是用来描述一个报告的结构以及该报告里面的数据是用来干什么用?

报告

       报告里面包含的是所要传输的数据,数量为整数字节,被划分为一个个域。通常,输入报告是通过中断输入端点返回的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。通过报告描述符,USB主机分析出报告里面的数据所表示的含义,与普通的描述符一样,都是通过输入端点0来返回,主机使用获取报告描述符请求来获取报告描述符,注意这个请求是发送到接口的,而不是设备。

报告结构

报告描述与前面所遇到的描述符结构不一样,它并没有描述符长度和描述符类型等信息,而是由一个条目(item)组成的。

HID协议中规定了两种条目:短条码和长条目。条目前缀的结构如下:

                                                     

短条目由1字节的前缀后面跟上可选的数据字节组成。可选的数据字节可以为0字节、1字节、2字节或者4个字节。前缀的最低两位D1和D0为bSize,用来表示后面所跟踪的数据的字节数,0位0字节,1为1字节,2为2字节,3为4字节。D3和D2位bType,表示条目的类型,0为主(main)条目,1为全局(global)条目,2为局部(local)条目,3为保留值。bTag表示该条目的功能,具体请参看HID协议及HID用途表。

主条目总共有5个,分别为Input(输入)、Output(输出)、Feature(特性)、Collection(集合)和End Collection(关集合)。主条目用来定义或者分组报告的数据域。

全局条目主要用来选择用途页 ,定义数据域的长度,数量,报告ID等。全局条目在出现后对接下来的所有主条目都有效,除非遇到另外一个全局条目来改变它。常用的全局条目有:Usage Page(用途页)、Logical Minimum(逻辑最小值)、Logical Maximum(逻辑最大值)、Physical Minnimum(物理最小值)、Physical Maximum(物理最大值)、Report Size(数据域大小)、Report Count(数据域数量)和Report ID(报告ID)。其中,Report Size用来描述某个数据域有多少位;Report Count用来描述这样的数据域有多少个;Logical Minimum和Logical Maximum用来描述数据域的取值范围。

局部条目用来定义控制的条件,例如,该数据域的用途、用途大小值、用途最大值等。局部条目只在局部有效,遇到一个主条目后,它的效用结束了。常用的局部条目有:Usage(用途)、Usage Minimum(用途最小值)、Usage Maximum(用途最大值)。

例如:

/*    HID报告描述符                                            */
const uint8_t HID_ReportDescriptor[] = {
        // 全局条目,说明用途,0XFF自定义
        0x05, 0xFF, // USAGE_PAGE(User define)
        // 全局条目,说明用途,0XFF自定义
        0x09, 0xFF, // USAGE(User define)
        // 这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示该集合是一个应用          集合
        // 它的性质在前面有页用途和用途定义为普通桌面应用
        0xa1, 0x01, // COLLECTION (Application)

        // 全局条目,选择用途页1为普通桌面
        0x05, 0x01, // USAGE_PAGE(1)

        // 局部条目,说明用途的最小值为0
        0x19, 0x00, // USAGE_MINIMUM(0)

        // 局部条目,说明用途的最大值为255
        0x29, 0xFF, // USAGE_MAXIMUM(255)

        // 全局条目,说明返回的数据的逻辑值最小为0
        0x15, 0x00, // LOGICAL_MINIMUM (0)

        // 全局条目,说明返回的数据的逻辑值最大为255
        0x25, 0xFF, // LOGICAL_MAXIMUM (255)

        // 全部条目,说明每个数据域的长度为8字节
        0x75, 0x08, // REPORT_SIZE (8)

        // 全局条目,说明数据域的数量为32
        0x95, 0x40, // REPORT_COUNT (32)

        // 这是一个主条目。它说明这三个8位的数据域是输入用的,属性为:Data,Var,Abs
        0x81, 0x02, // INPUT (Data,Var,Abs)

        // 全局条目,选择用途页2为普通桌面
        0x05, 0x02, // USAGE_PAGE(2)

         // 局部条目,说明用途的最小值为0
        0x19, 0x00, // USAGE_MINIMUM (0)

         // 局部条目,说明用途的最大值为255
        0x29, 0xFF, // USAGE_MAXIMUM (255)

         // 全局条目,说明返回的数据的逻辑值最小为0
        0x15, 0x00, // LOGICAL_MINIMUM (0)

        // 全局条目,说明返回的数据的逻辑值最大为255
        0x25, 0xFF, // LOGICAL_MAXIMUM (255)

        // 全部条目,说明每个数据域的长度为8字节
        0x95, 0x08, // REPORT_COUNT (8)

        // 全局条目,说明数据域的数量为32
        0x75, 0x20, // REPORT_SIZE (32)  32字节命令

        // 这是一个主条目。它说明这三个8位的数据域是输出用的,属性为:Data,Var,Abs
        0x91, 0x02, // OUTPUT (Data,Var,Abs)
        // 关闭集合
        0xc0 // END_COLLECTION
};

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值