bDeviceSubClass : 子类型代码(由USB分配).如果bDeviceClass值是0,一定要设置为0.其它情况就跟据USB-IF组织定义的编码. bDeviceProtocol : 协议代码(由USB分配).如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为FFH. bMaxPacketSize0 : 端点0最大分组大小(只有8,16,32,64有效). idVendor : 供应商ID(由USB分配). idProduct : 产品ID(由厂商分配).由供应商ID和产品ID,就可以让操作系统加载不同的驱动程序.
bcdDevice : 设备出产编码.由厂家自行设置.
iManufacturer : 厂商描述符字符串索引.索引到对应的字符串描述符. 为0则表示没有. iProduct : :产品描述符字符串索引.同上.
iSerialNumber : 设备序列号字符串索引.同上.
bNumConfigurations : 可能的配置数.指配置字符串的个数
2、配置描述符:配置描述符定义了设备的配置信息,一个设备可以有多个配置描述符 typedef struct _USB_CONFIGURATION_DESCRIPTOR_ {
BYTE bLength,
BYTE bDescriptorType, WORD wTotalLength, BYTE bNumInterfaces, BYTE bConfigurationValue, BYTE iConfiguration, BYTE bmAttributes, BYTE MaxPower
}USB_CONFIGURATION_DESCRIPTOR; bLength : 描述符大小.固定为0x09.
bDescriptorType : 配置描述符类型.固定为0x02.
wTotalLength : 返回整个数据的长度.指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小.
bNumInterfaces : 配置所支持的接口数.指该配置配备的接口数量,也表示该配置下接口描述符数量.
bConfigurationValue : 作为Set Configuration的一个参数选择配置值. iConfiguration : 用于描述该配置字符串描述符的索引.
bmAttributes : 供电模式选择.Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒. MaxPower : 总线供电的USB设备的最大消耗电流.以2mA为单位.
3、接口描述符:接口描述符说明了接口所提供的配置,一个配置所拥有的接口数量通过配置描述符的bNumInterfaces决定
typedef struct _USB_INTERFACE_DESCRIPTOR_ {
BYTE bLength,
BYTE bDescriptorType, BYTE bInterfaceNumber,
BYTE bAlternateSetting, BYTE bNumEndpoint, BYTE bInterfaceClass, BYTE bInterfaceSubClass, BYTE bInterfaceProtocol, BYTE iInterface
}USB_INTERFACE_DESCRIPTOR;
bLength : 描述符大小.固定为0x09.
bDescriptorType : 接口描述符类型.固定为0x04. bInterfaceNumber: 该接口的编号.
bAlternateSetting : 用于为上一个字段选择可供替换的位置.即备用的接口描述符标号. bNumEndpoint : 使用的端点数目.端点0除外. bInterfaceClass : 类型代码(由USB分配). bInterfaceSunClass : 子类型代码(由USB分配). bInterfaceProtocol : 协议代码(由USB分配). iInterface : 字符串描述符的索引
4、端点描述符:USB设备中的每个端点都有自己的端点描述符,由接口描述符中的bNumEndpoint决定其数量
typedef struct _USB_ENDPOINT_DESCRIPTOR_ {
BYTE bLength,
BYTE bDescriptorType, BYTE bEndpointAddress, BYTE bmAttributes,
WORD wMaxPacketSize, BYTE bInterval
}USB_ENDPOINT_DESCRIPTOR;
bLength : 描述符大小.固定为0x07.
bDescriptorType : 接口描述符类型.固定为0x05. bEndpointType : USB设备的端点地址.Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT.Bit6-4,保留.BIt3-0:端点号.
bmAttributes : 端点属性.Bit7-2,保留.BIt1-0:00控制,01同步,02批量,03中断. wMaxPacketSize : 本端点接收或发送的最大信息包大小.
bInterval : 轮训数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255.
5、字符串描述符:其中字符串描述符是可选的.如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0. typedef struct _USB_STRING_DESCRIPTION_ {
BYTE bLength,
BYTE bDescriptionType, BYTE bString[1];
}USB_STRING_DESCRIPTION;
bLength : 描述符大小.由整个字符串的长度加上bLength和bDescriptorType的长度决定. bDescriptorType : 接口描述符类型.固定为0x03. bString[1] : Unicode编码字符串.
2.2.1 USB HID相关描述符 1) 关于HID
USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球、电话拨号设备、VCR遥控等等设备。另外,使用HID设备的一个好处就是,操作系统自带了HID类的驱动程序,而用户无需去开发很麻烦的驱动程序,只要直接使用API调用即可完成通信。所以很多简单的USB设备,喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。
所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道与主机通信。控制管道主要用于以下3个方面:
? 接收/响应USB主机的控制请示及相关的类数据
? 在USB主机查询时传输数据(如响应Get_Report请求等) ? 接收USB主机的数据 中断管道主要用于以下两个方面:
? USB主机接收USB设备的异步传输数据
? USB主机发送有实时性要求的数据给USB设备
从USB主机到USB设备的中断输出数据传输是可选的,当不支持中断输出数据传输时,USB主机通过控制管道将数据传输给USB设备。 2) HID描述符与USB标准描述符关系
主要有3个HID设备类特定描述符:HID描述符、报告描述符、实体描述符。除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:
? 设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三个字段的值必须
为零。
? 接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,
为1表示HID设备符是一个启动设备(Boot Device,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。如果为0则只有在操作系统启动后才能识别并使用您的HID设备),bInterfaceProtocol的取值含义如下表所示:
表2-1、HID接口描述符中bInterfaceProtocol的含义
bInterfaceProtocol的取值(十进制) 0 1 2 3~255 含义 NONE 键盘 鼠标 保留 HID设备类特定描述符与USB标准描述符的关系可以参照下图:
图1 HID描述符的关联关系
3)HID相关描述符详细介绍 A、HID描述符
HID描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。HID设备描述符主要描述HID规范的版本号、HID通信所使用的额外描述符、报表描述符的长度等。表2所示为HID描述符的结构:
表2-2、USB HID类描述符的结构
偏移量 0 1 2 bLength bDescriptorType bcdHID 1 1 2 域 大小 值 描述 数字 常量 数字 数字 数字 常量 数字 常量 数此描述符的长度(以字节为单位) 描述符种类(此处为0x21即HID类描述符) HID规范版本号(BCD码),采用4个16进制的BCD格式编码,如版本1.0的BCD码为0x0100,版本为1.1的BCD码为0x0110 硬件目的国家的识别码(BCD码)(见表3) 支持的附属描述符数目 HID相关描述符的类型,取值见表3 报告描述符总长度 用于识别描述符类型的常量,使用在有一个以上描述符的设备 描述符总长度,使用在有一个以上描述符的设备 4 5 6 7 9 10 bCountryCode bNumDescritors bDescriptorType 1 1 1 wDescriptorLength 2 bDescriptorType 1 wDescriptorLength 2 字 bcdHID:设备与其描述符所遵循的HID规范的版本号码,此数值是4个16进位的BCD格式字符。例如版本1.1的bcdHID是0110h。
bCountryCode:硬件目的国家的识别码。如果不说明,该字段为0。
bDescriptorType:HID描述符附属的描述符的类型(报表或实体)。每一个 HID都必须至少
支持一个报表描述符。一个接口可以支持多个报表描述符,以及一个或多
个实体描述符。
表2-3、HID相关描述符类型定义
描述符类型值 0x21 0x22 0x23 HID相关描述符类型 HID描述符 报表描述符 实体描述符 C) 报表描术符 报表描述符定义了执行设备功能的数据格式和使用方法。
报表描述符和USB的其他描述符是不一样的,它不是一个简单的表格,报表描述符是USB所有描述符中最复杂的。报表描述符非常复杂而有弹性,因为它需要处理各种用途的设备。报表的数据必须以简洁的格式来储存,这样才不会浪费设备内的储存空间以及数据传输时的总线时间。
实际上可以这样理解,报表内容的简洁,是通过报表描述符全面的、复杂的数据描述实现的。
报表描述符必须先描述数据的大小与内容。报表描述符的内容与大小因设备的不同而不同,在进行报表传输之前,主机必须先请求设备的报表描述符,只有得到了报表描述符才可正确解析报表的数据。
报表描述符是报表描述项目(Item)的集合,每一个描述项目都有相对统一的数据结构,项目很多,通过编码实现。
(1)项目
报表描述符由描述HID设备的数据项目(Item)组成,项目的第一个字节(项目前缀)由三部分构成,即项目类型(item type)、项目标志(item tag)和项目长度(item size)。其中项目类型说明项目的数据类型,项目标签说明项目的功能,项目长度说明项目的数据部分的长度。
HID的项目有短项目和长项目两种,其中短项目的格式如下图。
图8-3 HID报表短项目格式
短项目的数据字节数由bSize的值定义,bSize为0、1、2、3时Data部分的字节数分别为0、1、2、4个字节。短项目的项目类型由bType定义,bType为0、1、2时分别为Main、Global和Local类型。
长项目可以携带较多的数据,其格式如下图。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库stm32 USB模块的HID设备开发(4)在线全文阅读。
相关推荐: