2011年9月2日 星期五

HID Report Descriptor 教學#3

這是「HID Report Descriptor 教學」這系列的第三篇。這次要講的是 USB 鍵盤。

keyboard 範例

我們將製作一個標準鍵盤,標準鍵盤會包含 101 個按鍵、8 個組合鍵 (modifiers)、1 個 OEM 保留鍵以及 5 個指示燈 (LED Indicators)。也就是說,我們要送按鍵的資料給 host,這會需要:一個 bit 代表一個組合鍵,一個 byte 代表 OEM 保留鍵,而一個 byte 代表一個按鍵敲擊 (keystroke)。根據 HID Device Class Deinifition 文件,標準鍵盤似乎最多可以同時按下 6 個按鍵,但有沒效我想是作業系統說了算。所以,我們需要像這樣的資料結構:

Byte Description
0 Modifier keys
1 Reserved
2 Keycode 1
3 Keycode 2
4 Keycode 3
5 Keycode 4
6 Keycode 5
7 Keycode 6

其中,組合鍵包括從鍵盤左邊的 Ctrl、Shift、Alt、GUI (WIN 鍵) 到右邊的 Ctrl、Shift、Alt、GUI (WIN 鍵) 總共 8 個按鍵。而 Byte 1 是 OEM 保留鍵,一般是填 0。

另外,host 也可以送資料給鍵盤,用來控制鍵盤上的 LED,標準鍵盤上有 5 顆 LED (並非每個鍵盤都如此,大部份只有 Num Lock, Caps Lock 和 Scroll Lock 這三顆 LED),因此我們需要一個 byte 來儲存 LED 的設定資料:

Bit Description
0 Num Lock
1 Caps Lock
2 Scroll Lock
3 Compose
4 KANA
5-7 Constant

在 C 語言中資料結構會是這樣:

在我們的 report descriptor 中,首先定義組合鍵 (modifiers),總共是 8 個按鈕,從鍵盤左邊的 Ctrl 鍵一直到右邊的 GUI (WIN) 鍵:

組合鍵狀態不是 0 就是 1:

8 個組合鍵總共 8 個位元:

這個是要送給 host 的變數資料:

得到的結果為:

這些代表組合鍵。

接著是 OEM 保留鍵,佔 1 個 byte:

接下來是 5 顆 LEDs,佔 5 個 bits:

LED 狀態不是 0 就是 1:

從 Num Lock 到 Kana 這 5 顆 LEDs:

這是 host 送給鍵盤的變數資料:

於是我們得到下列結果:

這些代表 LEDs

其它 3 個位元是填充位元 (padding bits):

接著是 6 個按鍵的 keycodes,每個按鍵佔 1 byte,總共 6 個:

按鍵 keycode 最小值為 0,最大值為 101:

鍵盤所有按鍵的 keycodes 記錄在 HID Usage Table Ch10 這一章 (p.54)。

鍵盤包括從 "no event indicated" 到 "Keyboard Application" 這 101 顆鍵:

"no event indicated" 是指沒有任何鍵被按下,而 "Keyboard Application" 則是 Windows 95 的 WIN 鍵。

這個是要送給 host 的變數資料::

你得到底下的結果,這些代表 8 個組合鍵, 1 個 OEM 保留鍵和 6 個按鍵的資料:

最後告訴 host 這是鍵盤:

完成。

範例程式

要找一個簡單的 USB 鍵盤實作,可以參考 frank 寫的 USnooBie RFID USB Keyboard 這個範例:

 http://frank.circleofcurrent.com/cache/usnoobie_rfid_keyboard.htm

延伸閱讀

0 意見: