您的位置:首页 > 其它

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

2013-12-15 20:46 239 查看
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型数据的间接管道.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: