HID報告描述符(Report Descriptor)腳本語言研讀筆記2 | |
|
|
來源: ChinaUnix博客 日期: 2007.09.26 20:24 (共有條評論) 我要評論 | |
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). |
HID報告描述符(Report Descriptor)腳本語言研讀筆記2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.