HID报告描述符(Report Descriptor)脚本语言研读笔记1
文章来源:http://gliethttp.cublog.cn[转载请声明出处]
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型数据的间接管道.
以上是我[gliethttp]近3天的零散的研读心得,其他的继续研读中,说实话,english文档确实比较难啃, 就那些语句的逻辑关系就搞的人头大,tnnd,不过还好,兴趣还算足,还能勉强的出现津津有味的情况...
|