天天看点

基于STM32F103的USB学习笔记11 - 报表描述符

报表描述符是HID设备中的一个描述符,是描述一个报表以及报表里面的数据是用来干什么的。通过它,USB Host可以解析出报表里面的数据所表示的含义。它通过控制输入端点0返回,Host使用获取报表描述符命令来获取报表描述符,注意这个请求是发送到Interface,而不是设备。一个报表描述符可以描述多个报表,不同的报表通过Report ID来区分,Report ID在报表最前面,即第一个byte。而当报表描述符中没有规定Report ID时,报表中就没有ID字段,开始就是数据。

报表描述符是报表描述项目(Item)的集合,每一个描述项目都有相对统一的数据结构,项目很多,通过编码实现。

1.项目

a)短项目,

基于STM32F103的USB学习笔记11 - 报表描述符

第一个字节为项目头,分3个部分:bSize/bType/bTag。

bSize: 短项目的数据字节数由bSize的值定义,bSize为0、1、2、3时Data部分的字节数分别为0、1、2、4个字节。

bType: 短项目的项目类型由bType定义,bType为0、1、2时分别为Main、Global和Local类型。

bTag: 用来表示该项目的功能.

例如一个短项目

0x05,          

0x01,

字节0x05表示bSize = 1, bType = 1(Global), bTag = 0,字节0x01就是1个字节的数据。

b)长项目

基于STM32F103的USB学习笔记11 - 报表描述符

2. 项目类型bType

Main类项目用于定义报表描述符中的数据项。也可以组合其中的若干数据项成为一个集合。Main项目可以分为带数据的Main项目和不带数据的Main项目。带数据项的Main用于生成报表中的数据项,包括Input、Output和Feature项目。不带数据的Main项目不生成报表中的数据项,包括Collection和End Collection项目。

0x81,          

0x02,

Global类项目实现对数据的描述,用来识别报表并且描述报表内的数据,包括数据的功能、最大与最小允许值以及数据项的大小与数目等。改变由Main类项目生成的项目状态表。Global类项目描述对后续的所有项目有效,除非遇到有新的Global类项目。

    0x05,          

    0x01,

    0x09,          

    0x02,

    0xA1,          

    0x01,

    0x09,          

    0x01,

    0xA1,          

    0x00,

    0x05,          

    0x09,

Local类项目定义控制的特征,这一类项目的作用域不超过下一个Main项目,所以在每一Main项目之前可能有多个Local项目。Local项目用于描述后面的Input、Output和Feature项目。

    0x05,          

    0x01,

    0x09,          

    0x02,

    0xA1,          

    0x01,

    0x09,          

    0x01,

    0xA1,          

    0x00,

基于STM32F103的USB学习笔记11 - 报表描述符
基于STM32F103的USB学习笔记11 - 报表描述符

在这些项目中,Usage Page用来指定设备的功能,而Usage项目用来指定个别报表的功能。Usage Page项目相当于是HID的子集合,Usage相当于是Usage Page的子集合。

USB官网有一个HID描述符的生成工具,dt.exe(https://www.usb.org/document-library/hid-descriptor-tool)。里面有很多HID的例子,打开joystk.hid.

基于STM32F103的USB学习笔记11 - 报表描述符

可以点击菜单中的“Parse Descriptor”,弹出的界面有各个数据的意义

基于STM32F103的USB学习笔记11 - 报表描述符

然后使用Save As可以生成H文件。(注意:STM32 USB例程JoyStick是用鼠标的描述符改的)。

报表描述符不是USB的标准描述符,所以获取该描述符的动作不是在Device_Property里面,需要在Device_Property的usbClassDataSetup中获取。