2011年8月29日 星期一

HID Report Descriptor 教學#1

什麼是 HID Report Descriptor?

HID report descriptor 的用途是定義 reports 的資料格式與使用目的,包括:device 支援多少個 reports, report 的大小,還有 report 中每個 byte 與 bit 的用途。例如,如果是 mouse device,資料會是 mouse movements (滑鼠的移動) 與 button clicks (滑鼠按鍵動作) ;如果是鍵盤,資料會是 keystrokes (按鍵), modifiers (組合鍵或稱輔助鍵) 與 LED Indicators (指示燈) 的輸出狀態。所以,application 只要解讀 report descriptors 便可以知道 report 中的資料是做何種操控 (control) 之用。

HID report descriptor 可以包含多個 reports,而 report 的種類可以分成三種:Input, Output 與 Feature reports。Host 會用 Input report 收資料、用 Output report 送資料,而 Feature report 則是雙向的。

HID 文件

http://www.usb.org/developers/hidpage/ 這個頁面中有很多 HID 相關的文件,其中,底下這兩份文件比較重要,是學習 HID 必讀的文件:

HID descriptor tool

同一個頁面上有一支工具,叫做 HID descriptor tool:

這支工具可以用來幫助你產生 report descriptor,是每個寫 report descriptor 的工程師必備的,因為自行翻閱 HID Usage Tables 查表對應代碼以純手工的方式寫 report descriptor 是很累的一件事,用這支工具會省下不少工夫。

HID descriptor tool 內附一些 report descriptors 的範例,在同一個資料夾中副檔名為 .hid 的檔案即是。HID descriptor tool 可以輸出多種格式的檔案,包括 .txt, .inc, .h 等,在打開「另存新檔 ("File > Save as")」這個視窗的時候 ,就可以選擇輸出檔的格式。

以 mouse 為例,打開 mouse.hid 後會看到:

image
▲ HID Descriptor Tool

點選 "File > Save As" 開啟「另存新檔」視窗:

image

在「存檔類型」中選擇 "Header File (*.h)",按下「儲存」鈕,就會產生包含 reports descriptor 的 mouse.h 檔,內容如下:

Report descriptors 的寫法為何,且看下回分解。

延伸閱讀

4 意見:

Gary Goole Blogger 提到...

感謝分享

coopermaa 提到...

最近對 USB 感興趣,看了一些入門書,所以我就順手寫篇心得。
不客氣啊。歡迎常來。

芭蕉葉上聽雨聲 提到...

我們既然已經能夠用Arduino模擬USB裝置, 那麼要如何做才能讓這裝置在插入電腦之後螢幕出現要求安裝驅動程式的畫面?
這個驅動程式可能是用C、VB或Flash寫的, 它主要是用來與這個USB裝置互通訊息的.

coopermaa 提到...

如果是 HID 裝置的話,因為 Windows 已經有內建 Driver,所以 USB 裝置在插入電腦時應該就不會出現要求安裝驅動程式的畫面。

如果是自訂類別的裝置的話,那就可能需要寫驅動程式。
不過,就算是 HID 的裝置,也是可以用 C, VB 來跟 USB 裝置互通訊息的喔。(Flash 我就不確定了)。

你可以參考 V-USB examples for Arduino 這篇:
http://coopermaa2nd.blogspot.com/2011/10/v-usb-examples-for-arduino.html

在這篇中的 hid-data 跟 hid-custom-rq 這兩個範例就示範了用 C 程式跟 USB 裝置互通訊息的方法。