HID报告描述符(Report Descriptor)脚本语言研读笔记1


  HID的Report Descriptor报告描述符已经不是简简单单的描述某个值对应某个固定意义了 ,
它已经能够组合出很多种情况 , 并且需要pc上的HID驱动程序提供parser解释器来对
描述的设备情形进行重新解释 , 进而组合生成出本HID硬件设备独特的数据流格式 ,
所以我觉得可以把它理解为 - - 报告描述符脚本语言 - - HID script , 虽然它确实简单了点 , 但是
我觉得这么称呼报告描述符的这种行为能力 , 比较爽一些 , 而且似乎也算是贴切 ( gliethttp ) .

  作为HID脚本语言 , 它有它的独特的语言关键字定义 :
Global item - - 全局项
Main item  - - 主项
local item  - - 局部项
Push  - -state table中的所有 局部 项值入栈
Pop  - -所有入栈的 局部项值出栈 到state table
. . . 还有很多 , 可以参见 < HID协议 . pdf >

  用户通过HID script专有脚本描述语言定义的Report Descriptor报告描述符 , 由usb设备端提供 ,
之后由pc上的HID专有parser解释器对usb提供的报告描述符进行处理 , 之后
pc对usb设备将要上传的数据成分会一清二楚 .

  最后由用户通过Report Descriptor的script专有脚本描述语言 , 个性定制出来的
将要被usb一次性发送的数据流 , 会交由pc操作系统指定的HID驱动程序中相应的API函数
( 鼠标数据处理函数或者键盘数据处理函数 ) 对数据串中的相应bits们进行解释 ,
最后影响到pc操作系统 ( 鼠标单击、移动或者键盘数据 )

  对于HID设备的定义 , 需要注意 :
HID的类码 , 是定义在接口描述符中的 , 至于接口描述符中的 , 子类码 , 其值不是用来区分mouse
或者keyboard的 , 因为HID设备形形色色 , 五花八门 , HID协议制订者们 , 不希望 , 使用简单的子类码来
区分各种HID设备 , 而是采用一种更加灵活的方式 - - - "报告描述符" , 原因很简单 : 多么好的规定 ,
随着产品应用中的不断创新和花样翻新 , 都会最后限定住用户对协议更丰富、更个性、更灵活的需求 ,
所以使用 "报告描述符" 专用脚本语言 , 让用户来自己定义他们的HID设备都有什么数据、以及这些
数据各个bit都有什么意义 , 之后位于pc上的HID驱动程序将通过parser解释器 ,
用户使用HID专用脚本语言描述的数据情形 - - "报告描述符" ,进行数据拼接 ,
最后pc的HID驱动程序将明确的知道 , usb设备上传过来的数据的各个bit位的意义 ,
进而将相应意义下的bits位们 , 送到pc上HID驱动程序对应的API接口上进行bits数据处理 ,
这些API可能是用于mouse的X、Y坐标管理的 , 也可能是用于keyboard的 - LED指示灯管理的 .

  因为HID "报告描述符" 脚本语言的parser解释器代码比较大 , 所以对于BIOS来说不太现实 ,
因此需要把HID设备的接口描述符中的子类码值设置为1 ,
进而能够在BIOS启动时识别并使用你的HID硬件设备 , 当然前提是 , 你用HID脚本语言描述的
mouse或者keyboard的数据流格式必须和BIOS固定的格式相符才行 ,
如果设置为0 , HID硬件就不提供BIOS支持 ,
所以我们的HID硬件设备只有当进入pc操作系统 , 并且pc操作系统的HID驱动加载完成之后 ,
才能被识别和使用 , 不过对于嵌入式系统 , 尤其我 [ gliethttp ] 的at91rm9200板子来说 , 没有多少意义 ,
因为这里说的BIOS是PC的BIOS , at91rm9200不提供那么复杂的BIOS , 仅仅提供传递信息参数的uboot之类 ,
所以完全没必要设置成1 .

  HID设备的接口描述符中的接口协议部分用来宏观定义设备类型 ,
1 - - keyboard设备
2 - - mouse设备
因为HID有了 "报告描述符" 脚本语言 , 所以设备的所有具体信息都可以用脚本来描述 ,
所以从这个角度来说 , 接口描述符中的接口协议部分也没有存在的意义 ,
至于需不需要定义 , 那就看你做的HID设备是否支持BIOS了 ,
只有当BIOS启动标志位置位1时 , 接口描述符中的接口协议部分才有意义 , 因为BIOS中的代码
将使用这个位值 , 来判断接入到pc主板上的是mouse设备 , 还是keyboard设备 ,
进而BIOS将决定 , 由HID设备送上来的被BIOS限定好格式的数据流 ,
该交由mouse数据处理程序做 , 还是交由keyboard数据处理程序做 .

  HID设备必须具备控制管道 - - : 端点0 ,
和至少一个IN管道 - - 用来传递HID设备数据 ,
至于host主机输出到HID设备中的OUT型数据 , 可以通过OUT管道专门传送 ,
也可以间接通过控制管道的OUT通道传输 ,
所以当我们定义了OUT管道后 , 枚举之后 , pc的HID驱动就会通过该OUT管道
传递 , 如果我们没有定义OUT管道 , 那么控制管道的OUT通道就将作为传递
OUT型数据的间接管道 .
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值