エスリル NISSE ファームウェア改造ガイド (2)

エスリル ニューキーボード − NISSEファームウェアを自分用に改造するメモ。

4. Fn キーと Shift キーを入れ替えてみる

MPLAB X IDE を起動。前回終了時に開いていたプロジェクト「USB Device - HID - Keyboard」が自動的に開く。
Projects ツリーで Header Files と Source Files を眺める。関係しそうなのは Keyboard.h, KeyboardCommon.c, KeyboardJP.c, KeyboardUS.c あたりか。
ソースコードの識別子(変数名や関数名)の上で右クリック → Navigate - Go to Declaration/Definition で、その変数/関数の宣言/実装にジャンプできる。あと右クリック → Find Usages (Alt+[F7]) でその識別子の使用箇所一覧が出てくる。
app/main.c に main 関数がある。そこから app/app_device_keyboard.c の APP_KeyboardTasks 関数を経て、押されているキーごとに KeyboardCommon.c の onPressed 関数が呼ばれる。
そこから KeyboardUS.c の getKeyBase 関数が呼ばれ、同じ KeyboardUS.c に定義されている配列 matrixQwerty, matrixDvorak, matrixColemak, matrixJIS, matrixNicolaF を参照して、押されているキーのマトリクス上の行番号と列番号である row, column が key に変換される。
単純にキーを入れ替えるだけなら、これらの配列 matrix* を書き換えればよさそう。

static uint8_t const matrixQwerty[8][12] =
{
    KEY_LEFT_BRACKET, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_EQUAL,
    KEY_GRAVE_ACCENT, KEY_F1, 0, 0, 0, 0, 0, 0, 0, 0, KEY_F12, KEY_BACKSLASH,
    KEY_RIGHT_BRACKET, KEY_1, 0, 0, 0, 0, 0, 0, 0, 0, KEY_0, KEY_MINUS,
    KEY_CAPS_LOCK, KEY_2, KEY_3, KEY_4, KEY_5, 0, 0, KEY_6, KEY_7, KEY_8, KEY_9, KEY_QUOTE,
    KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, 0, 0, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P,
    KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_ESCAPE, KEY_APPLICATION, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON,
    KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_TAB, KEY_ENTER, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_SLASH,
    KEY_LEFTCONTROL, KEY_LEFT_GUI, KEY_FN, KEY_LEFTSHIFT, KEY_BACKSPACE, KEY_LEFTALT, KEY_RIGHTALT, KEY_SPACEBAR, KEY_RIGHTSHIFT, KEY_FN, KEY_RIGHT_GUI, KEY_RIGHTCONTROL
};

この並び順は https://www.esrille.com/keyboard/ja-jp/support.html の一番下に書いてあるキーマトリクスに対応している。絵で描くとこう。

とりあえず QWERTY 配列の左手だけ、KEY_FN と KEY_LEFTSHIFT を入れ替えてみよう。

    KEY_LEFTCONTROL, KEY_LEFT_GUI, KEY_LEFTSHIFT, KEY_FN, KEY_BACKSPACE, KEY_LEFTALT, KEY_RIGHTALT, KEY_SPACEBAR, KEY_RIGHTSHIFT, KEY_FN, KEY_RIGHT_GUI, KEY_RIGHTCONTROL

Ctrl+[S] で保存し、Run - Build Project でビルドする。
HIDBootloader.exe を起動。firmware/third_party/mla_v2013_12_20/apps/usb/device/hid_keyboard/firmware/MPLAB.X/dist/Esrille_New_Keyboard_with_Mouse/production/MPLAB.X.production.hex を NISSE キーボードに書き込む。
のどかを使ってスキャンコードを調査。新しい左 Fn キーが Fn キーとして働いていることを確認。Fn+[F1]〜[F9] の機能もちゃんと働いてることを確認。*1
よっしゃ!
うまくいったようなので、右手の KEY_RIGHTSHIFT と KEY_FN も入れ替える。他の matrix* も同様に書き換えて Fn キーの位置を全マトリクスで統一しておこう。
あと NumLock 時のマトリクスも、右 Fn キーを [0] として使っているので修正したほうがいい。

static uint8_t const matrixNumLock[8][5] =
{
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, KEYPAD_MULTIPLY, 0,
    KEY_CALC, 0, KEYPAD_EQUAL, KEYPAD_DIVIDE, 0,
    0, KEYPAD_7, KEYPAD_8, KEYPAD_9, KEYPAD_SUBTRACT,
    0, KEYPAD_4, KEYPAD_5, KEYPAD_6, KEYPAD_ADD,
    0, KEYPAD_1, KEYPAD_2, KEYPAD_3, KEY_ENTER,
//  0, KEYPAD_0, 0, KEYPAD_DOT, 0,
    0, 0, KEYPAD_0, KEYPAD_DOT, 0,
};

次回は Fn 面のマッピングを変えるよ。

*1:Fn+[F3] で QWERTY 以外の配列にすると Fn キーの位置が元に戻る。忘れると焦る。