1、hid协议报告描述总结HID报告描述符主要内容整理刚刚接触USB(HID)时对【报告描述符】感到难于理解,因此就更无从下手。下面根据2个主要的协议文本整理出一些常用信息,不完整,备忘。 主要参考文本: 【协议文本1】:Device Class Definition for Human Interface Devices (HID)Ver1.11 【协议文本2】:Universal Serial Bus HID Usage TablesVer1.12每个协议文本后面的附录都有很多例子可供参考借鉴。0、主要术语与概念(1)报告(Report):HID设备与主机交换信息的单位(报告字节数似乎没有限制
2、);(2)报告描述符(Report Description):用许多【项目】说明报告的格式与【用途】;(3)用途(Usage):用于指出报告中某个数据域的意义或目的,32bit。高16bit用途页(Usage Page)指出用途的大类,低16bit用途ID(Usage ID)指出用途大类下的子用途;(4)项目(Item):报告描述符用于说明数据域的某种属性的数据,有短项目和长项目之分,短项目15B,长项目3255B;(5)共有3种类型的项目:主项目、全局项目(Global)、局部项目(Local);(6)主项目(Main Item)共有5个,其中的Input、Output和Feature会产生
3、实际的数据域并附带说明其操作特性(见2.1);其余2个Collection和End Collection是一对括号,其间的内容构成一个【集合】,用于限定集合中信息的整体特性;(7)全局项目(Global Item):说明其后主项目产生的数据域的某方面特性,一旦说明一直有效,除非遇到一个新的全局项目说明改变其值;(8)局部项目(Local Item):说明其后主项目产生的数据域的某方面特性,但只对其后的一个主项目有效;(9)可以认为所有用【全局项目】说明的各种数据域特性构成一个【全局状态表】,随着新的【全局项目】出现,该表在不断变化。可以使用【全局项目】中的【push】和【pop】将该表入栈或者
4、出栈,以简化描述符。(10)项目后的【可选数据字节】可以采用简短方式给出(不够该数据的实际位数),此时认为省略了高有效位且它们的值为0。(11)一个产生多个数据域(Report Count1)的主项目之前有一个以上的【用途】时,每个【用途】与一个数据域依次对应,如果数据域个数(Report Count)超过【用途】的个数,则剩余的数据域都对应于最后一个【用途】。1、短项目格式 (更多细节请参见协议文本1:p26)前缀字节说明bTag项目标签指出该项目的具体意义,见后续说明bType项目类型【00】=主项目,【01】=全局项目,【10】=局部项目,【11】=保留bSize可选数据字节数【00,0
5、1,10,11】=(0,1,2,4)字节长项目很少使用,忽略。2、主项目分类(更多细节请参见协议文本1:p28)主项目说明项目标签前缀字节取值Input输入1000 00 nnOutput输出1001 00 nnFeature特征1011 00 nnCollection集合开始1010 00 nnEnd Collection集合结束1100 00 nn(nn为bSize【可选数据字节数】,后同)2.1 【输入】【输出】【特征】项目的后续数据说明(更多细节请参见协议文本1:p30)Bit取值01说明 (0/1)8Bit FieldBuffered Bytes位域/字节填充(不足8位填充成8位)7
6、Non VolatileVolatile主机不可改变/可改变状态值,只用于Feature项目6No Null PositionNull State 没有【无效(空)状态】/有【无效(空)状态】5Preferred StateNo Preferred无操作时回复原位(如按键或游戏杆)/不回复原位4LinearNon Linear线性/非线性3No WrapWrap卷绕/非卷绕,【卷绕】指最大最小值首尾相连2AbsoluteRelative绝对值/相对值1ArrayVariable每个字段(Report Size)独立触发操作/所有字段(Report Size* Report Count)触发一个
7、操作0DataConstant变量/常量如果Bit8为0,则可以只给出1字节的低8位数据。2.2 【集合开始】项目后的【集合类型】字节说明(更多细节参见协议文本1:p33)集合类型缩写取值说明PhysicalCP0x00用于包含单个几何点的控制ApplicationCA0x01用于包含多种报告、多种应用LogicalCL0x02用于包含多种不同结构的报告数据Report0x03用于包含一个单独的报告(含有报告ID)Named ArrayNary0x04Usage SwitchUS0x05Usage ModifierUM0x06Reserved0x07 0x7F(保留)未来扩展0x80 0xFF
8、(保留)用户自定义3、全局项目分类(更多细节参见协议文本1:p35)项目标签前缀字节取值说明Usage Page用途页0000 01 nnLogical Minimum逻辑最小0001 01 nn Logical Maximum逻辑最大0010 01 nnPhysical Minimum物理最小0011 01 nnPhysical Maximum物理最大0100 01 nnUnit Exponent 单位指数(以10为底)0101 01 nn Unit 单位值0110 01 nn Report Size报告大小(Bit)0111 01 nn 数据域bit数Report ID报告ID1000 0
9、1 nn取值1255Report Count 报告数量1001 01 nn数据域重复次数Push全局状态表入栈1010 01 nn Pop全局状态表出栈1011 01 nnReserved保留1100 01 nn 1111 01 nn全局项目设置的参数会影响其后的所有主项目,直到该参数被重新设置。3、局部项目分类(更多细节参见协议文本1:p40)项目标签前缀字节取值说明Usage用途0000 10 nnUsage Minimum用途最小0001 10 nn许多个用途的(起始值)Usage Maximum用途最大0010 10 nn许多个用途的(结束值)Designator Index指示器ID
10、0011 10 nnDesignator inimum 指示器最小0100 10 nnDesignator aximum 指示器最大0101 10 nnString Index串ID0111 10 nnString Minimum串最小1000 10 nnString Maximum串最大1001 10 nnDelimiter分隔符1010 10 nnReserved保留1010 10 nn 1111 10 nn局部项目设置的参数只影响其后的一个主项目。4、用途页代码 (更多细节参见协议文本2:p14)代码用途页说明00Undefined 未定义01Generic Desktop Contro
11、ls通用桌面控制02Simulation Controls仿真控制03VR Controls虚拟现实控制04Sport Controls运动控制05Game Controls游戏控制06Generic Device Controls通用设备控制07Keyboard/Keypad键盘08LEDsLED阵09Button按钮0AOrdinal顺序0BTelephony电话0CConsumer消费0DDigitizer数字化仪0EReserved保留0FPID Page人体接口设备10UnicodeUincode码11-13Reserved保留14Alphanumeric Display字符显示15
12、-3fReserved保留40Medical Instruments医学设备41-7FReserved保留80-83Monitor pages监控器页84-87Power pages 电源页88-8BReserved保留8CBar Code Scanner page条形码页8DScale page天平8EMagnetic Stripe Reading (MSR) Devices 磁条阅读设备8FReserved Point of Sale pages90Camera Control Page照相机控制页91Arcade Page92-FEFFReserved保留FF00-FFFFVendor-
13、defined用户自定义5、【通用桌面控制】用途页下的部分主要用途Usage ID (更多细节参见协议文本2:p26)用途ID用途名用途类型说明00Undefined未定义01PointerCP(物理集合)指针定位02MouseCA(应用集合)鼠标03Reserved保留04JoystickCA(应用集合)游戏摇杆05Game PadCA(应用集合)游戏板06KeyboardCA(应用集合)键盘07KeypadCA(应用集合)键板(数字小键盘)08Multi-axis ControllerCA(应用集合)多轴控制器09Tablet PC System ControlsCA(应用集合)平板计算机
14、系统控制0A-2FReserved保留30XDV(动态值)X坐标31YDV(动态值)Y坐标32ZDV(动态值)Z坐标33RxDV(动态值)X轴旋转34RyDV(动态值)Y轴旋转35RzDV(动态值)Z轴旋转36SliderDV(动态值)滑动条37DialDV(动态值)刻度盘38WheelDV(动态值)旋钮39Hat switchDV(动态值)碰触开关6、其他注意事项(1)一个最小的报告描述符至少应包含: Input(或者OutputFeature) Usage Usage Page Logical Minimum Logical Maximum Report Size Report Count
15、(2)报告描述符至少要有一个顶层(Application)集合,集合可以嵌套。(3)报告不能跨越顶层集合。(4)除了最长的报告,顶层集合中的其他报告必须以【短包】(short packet?)终结;所有没有达到【端点】的【最大包长度(wMaxPacketSize)】的报告也必须以【短包】(short packet?)终结。(5)整个报告长度必须是字节的整数倍。(6)项目说明的数据域不能跨越超过4字节,即最长的数据域32bit必须开始于字节边界。7、几个报告描述符的例子(来源于网络)(1)一个红外触摸屏的例子【包含2种不同的报告,REPORT_ID (1) ,REPORT_ID (2)】/126
16、 byte 0x05, 0x01, / USAGE_PAGE (Generic Desktop) 0x09, 0x02, / USAGE (Mouse) 0xa1, 0x01, / COLLECTION (Application) 0x09, 0x01, / USAGE (Pointer) 0xa1, 0x00, / COLLECTION (Physical) 0x85, 0x01, / REPORT_ID (1) 0x05, 0x09, / USAGE_PAGE (Button) 0x19, 0x01, / USAGE_MINIMUM (Button 1) 0x29, 0x03, / USA
17、GE_MAXIMUM (Button 3) 0x15, 0x00, / LOGICAL_MINIMUM (0) 0x25, 0x01, / LOGICAL_MAXIMUM (1) 0x75, 0x01, / REPORT_SIZE (1) 0x95, 0x03, / REPORT_COUNT (3) 0x81, 0x02, / INPUT (Data,Var,Abs) 0x75, 0x05, / REPORT_SIZE (5) 0x95, 0x01, / REPORT_COUNT (1) 0x81, 0x01, / INPUT (Cnst,Ary,Abs) 0x05, 0x01, / USAG
18、E_PAGE (Generic Desktop) 0x09, 0x30, / USAGE (X) 0x09, 0x31, / USAGE (Y) 0x15, 0x81, / LOGICAL_MINIMUM (-127) 0x25, 0x7f, / LOGICAL_MAXIMUM (127) 0x75, 0x08, / REPORT_SIZE (8) 0x95, 0x02, / REPORT_COUNT (2) 0x81, 0x06, / INPUT (Data,Var,Rel) 0xc0, / END_COLLECTION 0xc0, / END_COLLECTION 0x05, 0x01,
19、/ USAGE_PAGE (Generic Desktop) 0x09, 0x02, / USAGE (Mouse) 0xa1, 0x01, / COLLECTION (Application) 0x09, 0x01, / USAGE (Pointer) 0xa1, 0x00, / COLLECTION (Physical) 0x85, 0x02, / REPORT_ID (2) 0x05, 0x09, / USAGE_PAGE (Button) 0x19, 0x01, / USAGE_MINIMUM (Button 1) 0x29, 0x03, / USAGE_MAXIMUM (Button
20、 3) 0x15, 0x00, / LOGICAL_MINIMUM (0) 0x25, 0x01, / LOGICAL_MAXIMUM (1) 0x75, 0x01, / REPORT_SIZE (1) 0x95, 0x03, / REPORT_COUNT (3) 0x81, 0x02, / INPUT (Data,Var,Abs) 0x75, 0x01, / REPORT_SIZE (1) 0x95, 0x05, / REPORT_COUNT (5) 0x81, 0x03, / INPUT (Cnst,Var,Abs) 0x05, 0x01, / USAGE_PAGE (Generic De
21、sktop) 0x09, 0x30, / USAGE (X) 0x15, 0x00, / LOGICAL_MINIMUM (0) 0x26, 0xff, 0x07, / LOGICAL_MAXIMUM (2047) 0x75, 0x10, / REPORT_SIZE (16) 0x95, 0x01, / REPORT_COUNT (1) 0x81, 0x02, / INPUT (Data,Var,Abs) 0x09, 0x31, / USAGE (Y) 0x15, 0x00, / LOGICAL_MINIMUM (0) 0x26, 0xff, 0x05, / LOGICAL_MAXIMUM (
22、1535) 0x75, 0x10, / REPORT_SIZE (16) 0x95, 0x01, / REPORT_COUNT (1) 0x81, 0x02, / INPUT (Data,Var,Abs) 0xc0, / END_COLLECTION0xc0 / END_COLLECTION (2)使用绝对坐标的鼠标报告描述符DB 05H, 01H /USAGE_PAGE (Generic Desktop) DB 09H, 02H /USAGE (Mouse) DB a1H, 01H /COLLECTION (Application) DB 09H, 01H / USAGE (Pointer)
23、 DB a1H, 00H / COLLECTION (Physical) DB 05H, 09H / USAGE_PAGE (Button) DB 19H, 01H / USAGE_MINIMUM (Button 1) DB 29H, 03H / USAGE_MAXIMUM (Button 3) DB 15H, 00H / LOGICAL_MINIMUM (0) DB 25H, 01H / LOGICAL_MAXIMUM (1) DB 75H, 01H / REPORT_SIZE (1) DB 95H, 03H / REPORT_COUNT (3)DB 81H, 02H / INPUT (Da
24、ta,Var,Abs) DB 75H, 01H / REPORT_SIZE (1) DB 95H, 05H / REPORT_COUNT (5) DB 81H, 03H / INPUT (Cnst,Var,Abs) DB 05H, 01H / USAGE_PAGE (Generic Desktop) DB 09H, 30H / USAGE (X) DB 15H, 00H / LOGICAL_MINIMUM (0) DB 26H, 55H, 05H / LOGICAL_MAXIMUM (1365) DB 35H, 00H / PHYSICAL_MINIMUM (0) DB 46H, 55H, 0
25、5H / PHYSICAL_MAXIMUM (1365) DB 75H, 08H / REPORT_SIZE (16) DB 95H, 02H / REPORT_COUNT (1) DB 81H, 02H / INPUT (Data,Var,Abs) DB 09H, 31H / USAGE (Y) DB 15H, 00H / LOGICAL_MINIMUM (0) DB 26H, ffH, 02H / LOGICAL_MAXIMUM (767) DB 35H, 00H / PHYSICAL_MINIMUM (0) DB 46H, ffH, 02H / PHYSICAL_MAXIMUM (767
26、) DB 75H, 08H / REPORT_SIZE (16) DB 95H, 02H / REPORT_COUNT (1) DB 81H, 02H / INPUT (Data,Var,Abs) DB c0H / END_COLLECTIONDB c0h / END_COLLECTION8、为支持多点触控增加的HID规范参考文本Digitizer Drivers for Windows Touch and Pen-Based Computers。为支持多点触控(例如Windows7),HID又在数字化仪用途页(0x04,Digitizer)下面增加了下面的几个新的【用途】。可以接受多点输入值
27、的【顶层应用集合用途ID】分别为:0x01(数字化仪)、0x02(手写笔)、0x04(触摸屏)和0x05(触摸板)。名称说明类型用途IDContact identifier触摸IDDV (动态值)0x51Configuration配置CA(应用集合)0x0EDevice mode设备模式DV (动态值)0x52Device settings设备设置CL(逻辑集合)0x23Device identifier设备IDDV (动态值)0x53Contact count触点数DV (动态值)0x54Contact count maximum最大触点数DV (动态值)0x55其中: 【触摸ID】用于区分
28、不同的触摸点; 【触点数】用于指出实际有效的触摸点数; 【最大触点数】用于指出设备支持的最大触点数(只读,用Feature声明); 【设备ID】用在报告描述符中存在多个【顶层数字化仪集合】时区分不同的设备。(1)【配置】应用集合、【设备设置】逻辑集合和【设备模式】用于描述【配置报告】顶层集合,该Feature报告用于win7操作系统改变(重新配置)设备模式。设备模式包括:0x00鼠标、0x01单点触控、0x02多点触控。(通常缺省的设备模式应该为鼠标,以便支持win7之前的操作系统)。(2)多点触摸报告通常具有一个【顶层数字化仪集合】,其中包含若干个【内层指针(finger)逻辑集合】,每一个逻辑集合报告一个触点信息。【触点数】和【最大触点数】处于顶层数字化仪集合中。(3)触点信息逻辑集合中必须包含的用途有:【X】(用途页0x01,用途0x30)、【Y】(用途页0x01,用途0x31)、【触摸ID】(用途页 0x0D,用途0x51)、【碰触开关】(用途页0x0D,用途0x42)和【进入范围标
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1