原创 【转】USB/HID设备报告描述符详解3

2011-1-10 21:49 3556 12 13 分类: MCU/ 嵌入式

Bit Field/Buffered Bytes:主项目的数据格式要以字节为单位,不足构成字节时自动填充成字节则设Buffered Bytes。
最后来谈谈主项目的其它二个卷标:Collection 和End Collection。以鼠标而言,在实体上是一个指针(pointer),只是应用为计算机鼠标﹔而这个指针含有三个按键和二个平移轴X 和Y。所以指针的报告是由不同格式的数据所构成,因而需要用到Collection 和End Collection 将几个Input 项目集结成一组,其用途为指针,再用Collection 和End Collection 将指针括起来说明其应用为鼠标。
卷标End Collection 没有跟随任何资料。但是卷标Collection 跟随一个字节的数据,例如指针的数据名为Physical,而鼠标的为Application。所有Collection的数据名称与代码如表7:
表7:报告集合的名称与代码
  Physical Application Logical Report Named Arrary Usage Modifier Usage Switch Reserved Vendor-defined
代码 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07-0x7f 0x80-0xff
用途 CP CA CL   Nary US UM    


Collection 的数据名称很难有一个准则来给定,Universal Serial Bus HID Usage Tables文档中将各种用途的用途种类(usage type)列出,使用者必须依据用途种类来指定Collection 的数据名称,例如鼠标,键盘和游戏杆的用途种类为CA,所以要用Collection (Application),而指针为CP,所以用Collection (Physical)。
编码
报告描述符的项目编码有二种:短项目和长项目。长项目仅是保留给未来使用,所以不作介绍。短项目的编码形式如下:
Bits 23 22 21 20 19 18 17 16  15 14 13 12 11 10 9 8  7 6 5 4         3 2         1 0
[data] [data] bTag bType bSize


Bytes        2                    1                        0
最低字节分别标注项目大小(bSize),项目类别(bType),和项目卷标(bTag)﹔
其中bTag 占4个位,其余二者各占2个位。BSize 用来指出项目的数据所需字节的数目,该数目仅可以为0(当bSize=0),1(当bSize=1),2(当bSize=2),和4(当bSize=3)﹔注意不可以为3个字节。大部分的卷标仅需一个字节的数据﹔全局项目的卷标Unit 比较特殊有可能最多用到4 个字节来表示其资料。
标签代码bTag 已经于前章的表1 中描述,例如Input 的标签代码『0x8?』中8 即为bTag 之值﹔再如标签Feature 之bTag=11,而Unit 之bTag=6。主项目之bType=0,全局项目之bType=1,而区域项目之bType= 2。所以在前章的表1 中的主项目卷标代码中的『?』可以改为『00nnB』,全局项目的可以改为『01nnB』,而区域项目的可以改为『10nnB』,其中nn 代表bSize。
实际范例
这里举一个Device Class Definition for Human Interface Device 文件的附录E 中的整合鼠标的键盘装置的范例。这个装置只有一个组态描述符,但是这个组态具有二个接口,一个为键盘接口(接口编号为0x00),另一个为鼠标接口(接口编号为0x01)。每一个接口都有一个自己的中断型输入端点,输出则都靠内定的控制型端点0。这个整合鼠标的键盘装置的标准描述符,请参考附件中的『USB 标准描述符之技巧』文件。在该文中所使用的范例即为整合鼠标的键盘装置,只是仅列出一个接口描述符(即编号为0x00 的键盘接口),另一个编号为0x01 的鼠标接口在该文中没有列出,读者可以自行参考本文所附的描述符程序代码descriptor.asm(即在标记为interface_descriptor01,hid_descriptor01,和endpoint_descriptor01 处)。
表8:范例的输入报告格式
键盘(输入报告) 鼠标(输入报告)
Byte 7 6 5 4 3 2 1 0 Byte 7 6 5 4 3 2 1 0
0 Modifier keys 0 Pad Buttons
1 Reserved 1 X displacement
2 Keycode 1 2 Y displacement
3 Keycode 2    
4 Keycode 3    
5 Keycode 4    
6 Keycode 5    
7 Keycode 6    


表9:范例的输出报告格式
键盘输出报告
Byte 7 6 5 4 3 2 1 0
0 Pad LED’s


这个范例有输入报告和输出报告,其中输入报告有二组,一组属于键盘接口,另一组属于鼠标接口。表8 列出输入报告的数据格式。而输出报告只有键盘接口需要,表9 为输出报告的数据格式。因为有二个接口,所以有二个报告描述符,分属于不同的界面,二个报告描述元都列于表10 中。键盘的报告描述元中整个报告集合的用途为(Generic Desktop: Keyboard),由于键盘用途属于应用性,所以标签Collection 的资料名为Application。由于单独键本身的用途类页不再是Generic Destop,而是Keyboard(注意Keyboard 也可为用途类页),所以在项目Collection(Application)下重新声明用途页Usage Page (Keyboard)。根据Universal Serial Bus HID Usage Tables 文件,鼠标是指针的一种,只是应用为计算机的鼠标,所以报告的内层集合的用途为(Generic Desktop: Pointer),外层的应用性集合的用途为(Generic Desktop: Mouse)。注意鼠标的按钮和位移轴又分属不同的用途类页,所以在内层集合中还要重新声明用途类页。按钮的用途类业为Buttons,而二个位移轴所属的用途类业为Generic Desktop。
表10:报告描述符范例
键     盘 鼠      标
项  目 编 码 项   目 编 码
Usage Page (Generic Desktop), 0x0105 Usage Page (Generic Desktop), 0x0105
Usage (Keyboard), 0x0609 Usage (Mouse), 0x0209
Collection (Application), 0x01A1 Collection (Application), 0x01A1
Usage Page (Keyboard), 0x0705 Usage (Pointer), 0x0109
Usage Minimum (224), 0xE019 Collection (Physical), 0x00A1
Usage Maximum (231), 0xE729 Usage Page (Buttons), 0x0905
Logical Minimum (0), 0x0015 Usage Minimum (1), 0x0119
Logical Maximum (1), 0x0125 Usage Maximum (3), 0x0329
Report Size (1), 0x0175 Logical Minimum (0), 0x0015
Report Count (8), 0x0895 Logical Maximum (1), 0x0125
Input (Data, Variable, Absolute), 0x0281 Report Size (1), 0x0175
Report Size (8), 0x0875 Report Count (3), 0x0395
Report Count (1), 0x0195 Input (Data, Variable, bsolute), 0x0281
Input (Constant), 0x0181 Report Size (5), 0x0575
Usage Minimum (0), 0x0019 Report Count (1), 0x0195
Usage Maximum (101), 0x6529 Input (Constant), 0x0181
Logical Minimum (0), 0x0015 Usage Page (Generic Desktop), 0x0105
Logical Maximum (101), 0x6525 Usage (X), 0x3009
Report Size (8), 0x0875 Usage (Y), 0x3109
Report Count (6), 0x0695 Logical Minimum (-127), 0x8115
Input (Data, Array), 0x0081 Logical Maximum (127), 0x7F25
Usage Page (LEDs), 0x0805 Report Size (8), 0x0875
Usage Minimum (1), 0x0119 Report Count (2), 0x0295
Usage Maximum (5), 0x0529 Input (Data, Variable, Relative), 0x0681
Logical Minimum (0), 0x0015 End Collection, 0xC0
Logical Maximum (1), 0x0125 End Collection 0xC0
Report Size (1), 0x0175    
Report Count (5), 0x0595    
Output (Data, Variable,Absolute), 0x0291    
Report Size (3), 0x0375    
Report Count (1), 0x0195    
Output (Constant), 0x0191    
End Collection 0xC0    


 
从表8 看出,键盘的输入报告中最低的8位分别代表键盘上的8个修饰键(亦即左和右边的Control 键、Shift 键、Alt 键、和Windows 键),平常每位的值为0,当对应的修饰键被压下时则位值为1。键盘报告描述符中第一个Input 项目必须声明这8位的格式。这8个修饰键为用途类页Key Codes 中的第224 个键到第231 键,所以用Usage Minimum (224)和Usage Maximum (231)来声明。每一个按键的逻辑值不是0 就是1,所以用Logical Minimum(0)和Logical Maximum (1)
来声明。很显然的,每一个键占用一个数据位,而共需8个位,因此ReportSize ( 1),而Report Count (8)。请特别注意,最低位对应到Usage Minimum 的声明,而最高位所对应的为Usage Maximum 的数据内容。这8 个位值是可变的数据,每一个位是独立的变量,提供的值不须与前次的值有相对关系。总结而言,该8位的主项目必须为Input (Data, Variable, Absolute)。
键盘的输入报告中次高的字节被保留,该字节的值无意义,也不需更新,所以用Input (Constant)来填充(padding)。而最高的6 个字节则是最近同时被压下的6 个按键之代码。这个键盘装置有101 个键,而报告格式的最高的6 个位组中任何一个字节都可以代表101 个键之任一键,所以这101 键再加上无键被压下状态(代码为0x00)构成一组操作数组,这个装置允许同时压下6个键。
键盘报告描述符中Input (Data, Array)即在声明这6个字节的数据格式,注意这个数据格式的逻辑值声明和用途代码声明具有相同的数据值(即0 和101)。
键盘有一个输出报告,长度为1个字节,但是只用到最低5个位来代表五个LED 的操控,所以最高的3个位需要用Output (Constant)项目来填充。输出报告的用途类页不再是Key Codes,而是Page of LEDs,所以要重新声明Usage Page,而主项目为Output (Data, Variable, Absolute)。这个项目的数据内容如同输入报告的最低8位所声明的主项目之数据内容,不再作说明。因为键盘接口的端点描述符只有声明一个中断型输入端点,所以输出报告需要依赖内定控制型端点0来传送。输入报告由声明的输入端点作中断型输入传输,当然也可以依需要用内定控制型端点0来作控制型读入传输。
鼠标的报告描述符的输入数据格式中最低的一个字节只有最低3个位有意义,其分别对应到鼠标上的三个按钮,用途类页为Buttons。其它二个字节的用途为(Generic Desktop: X)和(Generic Desktop: X),分别对应到鼠标X 轴和Y 轴的位移操控。这二个位移值得逻辑范围为-127 到127,即一个字节可以表示最大范围。位移的数值是相对值,所以主项目为Input (Data, Variable, Relative)。

本文来自: (www.91linux.com) 详细出处参考:http://www.91linux.com/html/article/program/cpp/20090417/16506_3.html

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-7-22 13:31

不错的资料,谢谢作者了!!!

相关推荐阅读
huotingtu_505472073 2014-01-12 22:18
嵌入式程序员面试问题集锦
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意...
huotingtu_505472073 2011-04-14 23:24
【转】一种实用的步进电机驱动电路
1 引言步进电动机是一种将电脉冲信号转换成角位移或线位移的精密执行元件,由于步进电机具有控制方便、体积小等特点,所以在数控系统、自动生产线、自动化仪表、绘图机和计算机外围设备中得到广泛应用。微电子学的...
huotingtu_505472073 2011-04-14 23:22
【转】几种微型电机驱动电路分析
 以下所述电路用于3V供电的微型直流电机的驱动,这种电机有两根引线,更换两根引线的极性,电机换向。该驱动电路要求能进行正反转和停止控制。 电路一: 如下图所示,这电路是作者最初设计的电路,P1.3、P...
huotingtu_505472073 2011-02-18 19:57
【转】集成运放组成的电压比较器
1. 功能及应用:主要用来判断输入信号电位之间的相对大小,它至少有两个输入端及一个输出端,通常用一个输入端接被比较信号Ui,另一个则接基准电压VR 定门限电压(或称阀值)的UT。输出通常仅且仅有二...
huotingtu_505472073 2011-01-26 08:05
【转】直流无刷电动机工作原理与控制方法12
研究结果表明,在半导体薄片上产生的霍尔电动势E可用下式表示: 式中RH ——霍尔系数(  );IH——控制电流(A);B——磁感应强度(T);d——薄片厚度(m);p——材料电阻率(Ω*s);...
huotingtu_505472073 2011-01-26 07:55
【转】直流无刷电动机工作原理与控制方法1
序言   由于直流无刷电动机既具有交流电动机的结构简单、运行可靠、维护方便等一系列优点,又具备直流电动机的运行效率高、无励磁损耗以及调速性能好等诸多优点,故在当今国民经济各领域应用日益普及。   一个...
EE直播间
更多
我要评论
1
12
关闭 站长推荐上一条 /3 下一条