ここまでV-USBのReference Projectsの中からHIDKeysを試してみた。
今度はV-USB Human Interface Devicesからrump - The Model Mを参考にしてみる。
前に書いたがパソピアのキーボードは逆流防止用のダイオードが付いていないので、ゴーストキーの問題がある。
このrumpの良いところは、ゴーストキー対応とチャタリング対応がされている点
まずはHIDKeysをベースに「usbconfig.h」を書きかえる。
usbFunctionWrite()を使うので、「USB_CFG_IMPLEMENT_FN_WRITE」に1をセット
#define USB_CFG_IMPLEMENT_FN_WRITE 1
Device IDとVender Name、Device Nameは適当にセットして、Sub ClassとProtocolをセット。
#define USB_CFG_INTERFACE_SUBCLASS 0x01 /* Boot-device subclass */
#define USB_CFG_INTERFACE_PROTOCOL 0x01 /* Keyboard protocol */
USB Report Descriptorは64をセット
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 64 /* total length of report descriptor */
つぎにrumpから「main.c」を丸ごとコピー
日本語キーボードにするため、USB Report Descriptorを一部修正。
const PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION
};
これを修正しておかないと、「ろ」「無変換」「前候補」あたりのキーが認識しない。。
あと、パソピアはキースキャンラインが12行なのと、AVRとスキャンラインの配線が違うので、そのあたりのコードを修正しておく。
更に欲張ってLEDもつけてみる。
150Ωを挟んで、以下のように配線をしてみる。
PB4: NumLock LED
PB5: CapsLock LED
PB6: ScrollLock LED
PB7: Kana LED
hardwareInit()でポートB設定をしとくのと、scankeys()の中でPB4~7を消さないようにちょっと修正。PB4~7はusbFunctionWrite()の中でセットする。
続いてrumpから「ibm_1391401.h」をコピー
スキャンラインが12行なので定義を変更
#define NUMROWS 12
enum keycodesが101キーまでしかないので、無変換キー(139)あたりまで追加しておく。
キーマップは次回
0 件のコメント:
コメントを投稿