2013年3月12日火曜日

ファーム作成

続いてファームの作成

ここまでV-USBReference 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 件のコメント:

コメントを投稿