Chinaunix首页 | 论坛 | 博客
  • 博客访问: 379310
  • 博文数量: 61
  • 博客积分: 4650
  • 博客等级: 上校
  • 技术积分: 786
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-11 21:07
个人简介

少抱怨,多实干;

文章分类

全部博文(61)

文章存档

2017年(1)

2016年(13)

2015年(1)

2013年(2)

2011年(1)

2010年(3)

2009年(23)

2008年(17)

我的朋友

分类: 嵌入式

2016-01-08 10:02:08

Item Types一共有两种:
1. Short Items: 1-5字节;通常包含1 或0 个可选数据。
2. Long Items: 3-258个字节。

bSize: 有几个字节用来描述数据的属性,
0 = 前缀字节后面有0个字节来描述数据的属性,用来表示描述属性字节中的每个bit位的值均为0
1 = 前缀字节后面有1个字节来描述数据的属性,每个bit位针对不同的bType表示的意义不同,
 2 = 前缀字节后面有2个字节来描述数据的属性,每个bit位针对不同的bType表示的意义不同,
3 = 前缀字节后面有4个字节来描述数据的属性,每个bit位针对不同的bType表示的意义不同,




bType:(for short items)

0b00 -- Main Items
0b01 -- Global Items
0b10 -- Local Items
0b11 -- Reserved

Main Items:

bTag:
0b1000 ----Input
0b1001 ----Output
0b1011 ----Feature
0b1010 ----Collection
0b1100 ----End Collection

Data(for Main Items, Per Byte):
Input,Output,Feature Items的数据描述域的含义参考:6.2.2.5
Collection , End Collection Items的数据描述域的含义参考:6.2.2.6

Global Items:(6.2.2.7 Global Items)

该配置对后面所有数据有效,除非被新的Global Items的配置所覆盖。

bTag:
0b0000 ---- Usage Page
0b0001 ---- Logical Minimum
0b0010 ---- Logical Maximum
0b0011 ---- Physical Minimum
0b0100 ---- Physical Maximum
0b0101 ---- Unit Exponent
0b0110 ---- Unit (Unit values)
 0b0111 ---- Report Size
0b1000 ---- Report ID
0b1001 ---- Report Count
0b1010 ---- Push
0b1011 ---- Pop
            ---- other reserved

Local Items (6.2.28 Local Items)

bTag:
0b0000 ---- Usage
0b0001 ---- Usage Minimum
0b0010 ---- Usage Maximum
0b0011 ---- Designator Index
0b0100 ---- Designator Minimum
0b0101 ---- Designator Maximum
0b0111 ---- String Index
0b1000 ---- String Minimum
0b1001 ---- String Maximum
0b1010 ---- Delimiter

Local Item的作用域:



--------------------------------------
实例1:
--------------------------------------

    Physical Maximum (315) 46 3B 01 

0x013B46 = 0b00111011 01000110,可以得出
bType = 0b01,所以该Item为Global Item
bSize  = 0b10,所以后面的描述数据为2个字节
bTag  = 0b0100,所以数据内容的值为Physical Maximum,大小为0x013B,即315

--------------------------------------
实例2:
--------------------------------------
比如:
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 

这个item的值为0x0281 = 0b00000010 10000001, ->
  bSize  = 1表示后面只有一个字节的数据描述,即0x02;
  bType = 0表示Main Item
  bTag   = 0b10000 表示为Input


--------------------------------------
实例3:
--------------------------------------
下面数据为一个JoyStick的Report 描述符的数据(16进制数据),(颜色表示仅个人防止把数据看错位)我们来解析一下
05 01 09 04 A1 01 85 01 05 09 15 00 25 01 35 00 45 01 19 01 29 20 75 01 95 20 81 02 05 01 09 39 15 00
25 07 35 00 46 3B 01 65 14 75 04 95 01 81 42 81 01 65 00 09 30 26 FF 03 46 FF 03 75 0A 95 01 81
02 75
06 81 03 09 31 75 0A 81 02 75 06 81 03 09 36 75 0A 81 02 75 06 81 03 09 32 26 FF 3F 46 FF 3F
75 0E 81
02 75 02 81 03 09 35 75 0E 81 02 75 02 81 03 75 10 27 FF FF 00 00 47 FF FF 00 00 06 FF 00
09  01 09 02
09 03 09 04 09 05 95 05 81 02 26 FF 00 46 FF 00 75 08 95 0A 81 03 09 BB 95 23 91 02 85
02 09 06 81 02 C0  

Byte1: 05(0b00000101),bType=0b01,bSize=0b01,bTag=0b0000,所以它是GlobalItem中的Usage Page(在
《Device Class Defination for Human Interface Device (HID) 》中可以查到),且该item后面有一个数据域,
即一个字节,值是0x01,所以Usage Page=0x01,通过查看《HID Usage Tables 1.12》《3. Usage Pages》
关于Usage Page的定义可知,0x01表示Generic Desktop Controls,所以后面的数据是关于该类型的数据。至此,
这一个item定义结束,然后分析下一个Item.

Byte3:09(0b00001001),bType=0b10,bSize=0b01,bTag=0b0000,所以它是Local Items中的Usage,且Usage的值长度
为一个字节,值为04,即Usage=0x04, 该Usage也就是《HID Usage Tables 1.12》中的Usage ID,通过查看手册中的
《4. Generic Desktop Page (0x01)》可知道0x04 表示 Joystick,所以Usage=Joystick.好,该Item解析结束。

Byte5:A1(0b10100001),bType=0b00,bSize=0b01,bTag=0b1010,所以它是Main Items中的Collection,它有一个字节的数据,
值为0x01,即Application,所以Collection=Application.因为Collection是数据定义的开始,所以接下来的内容是数据属性相关
的定义,直到遇到End Collection标识为止。

Byte7:0x85(0b10000101),bType=0b01,bSize=0b01,bTag=0b1000,所以它是Global Item中的Report ID,且ID值占一个bSize(1个字节)
长度,值为0x01.

Byte9:0x05(0b00000101),bType=0b01,bSize=0b01,bTag=0b0000,所以该Item是Global Item中的Usage Page,且它有一个字节的数据,
值为0x9,表示Button,所以接下来定义的Page是Button控制量相关的数据属性。

Byte11:0x15(0b00010101),bType=0b01,bSize=0b01,bTag=0b0001,所以该Item定义的是Global Item中的Logical Minimum,值占一个字节
长度(bSize决定的),且值为0x15后面的0x00,所以该Page所定义的Button的Logical Minimum=0.

Byte13:0x25(0b00100101),bType=0b01,bSize=0b01,bTag=0b0010,定义的是Global Item中的Logical Maximum,值占一个字节,为0x01,
所以该Page所定义的Button的Logical Maximum=1.

Byte15: 0x35.......
Byte17: 0x45.......

Byte19: 0x19(0b00011001),bType=0x10,bSize=0x01,bTag=0x0001,定义了Local Item中的Usage Minimum,值占一个字节,为0x01.因为
该Page为Button,所以该Usage Minimum表示Button的array或bitmap的起始索引,为1。
Byte21:0x29,定义了定义了Local Item中的Usage Maximum=0x20,结合Usage Minimum可以知道该设备至少有1~32个Button,且其值
为0或1来表示(0表示弹起,1表示按下),至于在数据传输时是按数据还是按bitmap方式,则由其它item定义。
Byte23: 0x75(0b01110101),定义了Global Item的ReportSize=1,所以每个Button点1个bit.
Byte25: 0x95(0b10010101),定义了Global Item中ReportCount=0x20,所以上面1个bit宽度的Button一共32个。
Byte27:0x81(0b10000001),定义了MainItem中的Input=0x02;0x02描述了Button数据的属性:(Data,Array,Absolute,NoWrap,Linear,PreferredState,
NoNullPosition,0,BitField).到这里,我们知道了在设备给主机传输的数据流中首先(因为这些Button的数据属性在该描述符中被首先定义)传的是32个button的数据,类型为Bit Field的变量,每个Button占一个bit,值为0或1.
...
...
...后面的数据不在分析。

--------------------------------
6.2.2.5 Input, Output, and Feature Items
这一节是对数据域描述字节每个bit位含义的解释。


Report Size 和 Report Count 用来表示数据传输通道中的数据是bit位目和个数。如Report Size = 8 , Report Count=3 表示它所描述 的数据是一个8bit长度,共3个 组成的一个item.
-------------------------------------
HID报告描述符(Report Descriptor)脚本语言研读笔记2
文章来源:http://gliethttp.cublog.cn[转载请声明出处]
对HID Script脚本语言的理解:
Global item--全局项
Main item --主项
local item --局部项
  对于Main项,parser解释器,将顺序解释集合中的数据,并且,解释器解释完的数据,
将按Main项出现的先后顺序,主要是Input和Output项,顺序拼接生成对应的数据bit位,
解释器将以关键字Collection开始解释并拼接bit位信息,关键字End Collection将
结束paser解释器的工作,我把关键字Collection和关键字End Collection叫做"集合",
这样给他取个名字,以后说明起来也方便些,"集合"里边描述的就是最后生成的
由HID硬件设备1次性上发给pc的HID驱动程序的数据流了.在HID协议.pdf>中,(gliethttp)
关键字Collection和关键字End Collection都是Main item主项,对应的控制字分别为:
1010 00 nn和1100 00 nn,如果Collection后边有1个参数数据,那么即为:
1010 00 01=0xA1,如Collection(Application)
翻译成控制码后为:0xA1,0x01;0xA1的1表示有1个参数数据,0x01表示Application在HID
协议中规定的索引值为0x01,pc的HID驱动程序在parser解释器中会通过0x01得知,
是对Application进行数据流位生成,就是说HID报告描述符(Report Descriptor)
所描述的数据流是为了Application使用的,Application在HID协议.pdf>中包含
两种设备:mouse和keyboard,至于Collection(Application)里边描述的是mouse
还是keyboard,将具体的由Usage进一步限定,如:Usage(KeyBoard),也就是说明确
告诉pc的HID驱动程序的paser解释器,接下来的这段信息最后生成出来的bits位数据信息,
将交由pc的HID驱动程序中KeyBoard对应的API函数处理,当然这只是HID硬件设备开发者
给pc的HID驱动程序的paser解释器提供的一个建议值,比如我们做DDK下的HID驱动二次开发,
那么我们可以很随意,但是HID硬件设备开发者,建议使用的HID驱动程序API接口,最好遵守,
因为HID硬件设备开发者比DDK开发人员更清楚送上来的bit数据流的真正物理意义.
  Input和Output是用来真正生成bits位流数据域的关键字,他们描述的东西是最后通过
usb总线实实在在发送到pc或者从pc接收的数据位,当然这些bits数据流数据域所代表的意义
以及某段bits位们所代表的意思以及这些bits将交由pc上HID驱动程序的哪一个API接口
来做进一步解析(是mouse还是keyboard),需要其他描述符来描述,比如前边的Usage就是其中的1个描述符,
  如果一个HID设备同时提供2种不同的功能,那么就会分别生成2个bits位流数据域,
每个bits位流数据,将交由不同的驱动解析,比如,一个keyboard可能还集成了一个附属的鼠标功能,
那么键盘数据信息将由HID script脚本描述的keyboard对应bits数据位流传送,mouse数据将由
HID script脚本描述的mouse对应bits数据位流传送,但同一个Input管道怎么能传送两个独立的
数据流呢,答案很简单:不能,所以又引入了一个Report ID的概念,ID用来标识多条独立的bits数据流,
pc的HID驱动程序根据ID,将这些独立的bits数据流们路由到相应的API处理函数上去,
进而不同的bits数据流数据最终都能够被自己对应的API驱动函数正确接收并解析处理.
  对于2字节、4字节等多字节数据的传输,是按小端模式little-endian进行的.这
些多字节数据的最小值由Logical Minimum定义,最大值由Logical Maximum定义,如果两个值均为非负
值,那么bits位流数据就是无符号数,如果没有明确指定,那么作为有符号数处理,另外HID1.1协议
不允许传输浮点数据.
  硬件开发者应该时刻清除自己写的HID script脚本所描述的数据流将来应该由PC上的HID驱动程序
怎么使用,另外对于硬件开发者来说,对于不允许PC驱动修改的bit位数据,HID1.1协议制定者强烈建议
采用NULL数值,最好不要随便填其他值.
----------------------------------------------
Main item --主项当前一共5个:
1)Input
2)Output
3)Feature
4)Collection
5)End Collection
----------------------------------------------
Global item--全局项当前一共13个:
1)Usage Page
2)Logical Minimum ---var变量或array数组的逻辑最小值
3)Logical Maximum
4)Physical Minimum
5)Physical Maximum
6)Unit Exponent ---单位的指数值,是10的指数
7)Unit ---单位索引号:可以是时间单位、电流单位、电压单位和距离单位等等.
8)Report Size
9)Report ID ---数据流的ID值设置
10)Report Count
11)Push
12)Pop
13)Reseved ---保留
----------------------------------------------
local item --局部项当前一共11个:
1)Usage ---定义Uage Page下面某个功能item的起始索引值,比如Keyboard功能,LEDs功能等,
                       这也告诉pc的HID解释器,Input或Output变量或数组的相应生成数据位用来描述
                       Usage引用到的那个功能,如:用来描述Keyboard功能或LEDs功能等.
2)Usage Minimum ---定义与array或bitmap关联的usage定义的某个功能下的起始值
                       Usage作为Uage Page的一个子功能索引号,同时Usage自己也有很多子功能,或者
                       说有很多个子值,这里就是定义这些子值的范围值,之后和用Input或Output生成
                       bits位数据流,进行相应关联.(可以用多维数组来说明,可能会更明确一点)
                       如:Gliethttp[5][6][80],Gliethttp为最上层,5就是Usage Page(5),6就是在
                       前一个基础上Usage(6),当然在HID Descriptor Tool里边6有它的字符串名,即:
                       Usage(Keyboard),然后80就是Keyboard里边的一个索引取值,查找之后是:
            KeyBoard LeftArrow,所以Usage_Minimum(80)就等于Usage_Minimum(KeyBoard LeftArrow)
                       Usage的顺序先后和Report Count定义的bits位组的先后顺序依次一一对应,Usage Minimum和
                          Usage Maximum之间的Usage的索引值也将依次与Report Count定义的bits位组的先后顺序
                          依次一一对应上。
3)Usage Maximum ---定义与array或bitmap关联的usage的结束值
4)Designator Index
5)Designator Minimum
6)Designator Maximum
7)String Index
8)String Minimum
9)String Maximum
10)Delimiter
11)Reserved
local的作用范围不会延续到下一个Main item,下一个Main item开始的local值会
自动恢复到local的默认值;如果local item定义开始到下一个Main item之间的
Report Count=0,那么local item的属性值将作用在下一个Main item上(通常是Collection)
  以上部分内容来自HID协议.pdf>,部分内容是自己的揣测式理解,可能有不正确之处,要是能够拿到
HID Descriptor Tool工具的源码就能够清除pc的HID驱动程序下的parser解释器到底是
怎么处理以上关键字的了,linux里边可能有,如果大家打算再深入一些的话,我想你可以到linux
的源程序里边去看看,那里有parser解释器的全部源程序,不过对于我来说,以上的这些知识基本上
就够用了,再往往深入走,对我已经没有什么用了,所以就到这里;这2篇研读笔记是我在english文档中辛苦的总结,
希望能够对刚刚开始做HID这方面工作的同行们有一点点积极的作用(gliethttp).




阅读(6587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~