2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > USB(六)-HID(报告描述符的结构实现)

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

时间:2024-05-27 16:42:54

相关推荐

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)// 局部条目,说明用途的最小值为00x19, 0x00, // USAGE_MINIMUM(0)// 局部条目,说明用途的最大值为2550x29, 0xFF, // USAGE_MAXIMUM(255)// 全局条目,说明返回的数据的逻辑值最小为00x15, 0x00, // LOGICAL_MINIMUM (0)// 全局条目,说明返回的数据的逻辑值最大为2550x25, 0xFF, // LOGICAL_MAXIMUM (255)// 全部条目,说明每个数据域的长度为8字节0x75, 0x08, // REPORT_SIZE (8)// 全局条目,说明数据域的数量为320x95, 0x40, // REPORT_COUNT (32)// 这是一个主条目。它说明这三个8位的数据域是输入用的,属性为:Data,Var,Abs0x81, 0x02, // INPUT (Data,Var,Abs)// 全局条目,选择用途页2为普通桌面0x05, 0x02, // USAGE_PAGE(2)// 局部条目,说明用途的最小值为00x19, 0x00, // USAGE_MINIMUM (0)// 局部条目,说明用途的最大值为2550x29, 0xFF, // USAGE_MAXIMUM (255)// 全局条目,说明返回的数据的逻辑值最小为00x15, 0x00, // LOGICAL_MINIMUM (0)// 全局条目,说明返回的数据的逻辑值最大为2550x25, 0xFF, // LOGICAL_MAXIMUM (255)// 全部条目,说明每个数据域的长度为8字节0x95, 0x08, // REPORT_COUNT (8)// 全局条目,说明数据域的数量为320x75, 0x20, // REPORT_SIZE (32) 32字节命令// 这是一个主条目。它说明这三个8位的数据域是输出用的,属性为:Data,Var,Abs0x91, 0x02, // OUTPUT (Data,Var,Abs)// 关闭集合0xc0 // END_COLLECTION};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。