エスリル 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 キーの位置が元に戻る。忘れると焦る。

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

エスリル ニューキーボード − NISSE の Fn キーの位置が使いにくい。設定では Fn キーの位置は変更できないので、ファームウェアを自分用に改造する。開発環境は Windows 7 (64 bit)。

1. 開発環境のセットアップ

Microchip 社の MPLAB X IDE と MPLAB XC8 Compiler を使う。あと Microchip Libraries for Applications も必要。

罠注意!

インストール作業はディスプレイのスケーリングを 100% にして行うこと! 高解像度ディスプレイ利用者は特に注意。

これを忘れるとインストーラが固まる。うちの環境でディスプレイスケーリングの問題が起きたのは XC8 Compiler だけだったが、この会社のインストーラは信用できないので、最初から最後までディスプレイスケーリング 100% の環境でインストールした方がよさそう。

MPLAB X IDE
  1. https://www.microchip.com/pagehandler/en-us/family/mplabx/ の Downloads タブから MPLAB® X IDE v3.20 をダウンロード。
  2. MPLABX-v3.20-windows-installer.exe を実行。
  3. C:\Program Files (x86)\Microchip\MPLABX\v3.20\ にインストール。
MPLAB XC8 Compiler
  1. https://www.microchip.com/pagehandler/en-us/devtools/mplabxc/ の Downloads Archive タブから MPLAB XC8 Compiler v1.34 をダウンロード。
    • 執筆時点では最新版 v1.35 が最新版だが、v1.35 を使うと問題がある(後述)。今のところ v1.34 を使っておいた方が無難。
  2. xc8-v1.34-full-install-windows-installer.exe を実行。
  3. インストール先は C:\Program Files (x86)\Microchip\xc8\v1.34 で OK。
  4. Compiler Settings で Update MPLAB IDE to use the XC8 compiler for all existing C18 (mcc18) projects と Use XC8 for the C18 Linker, Librarian and Assembler にチェック。
    • Compiler Settings 画面で文字がちらついてたらアウト! ディスプレイのスケーリングを 100% にすること。このまま進めると次の Installing 画面でインストーラが固まる。
  5. PRO ライセンスは不要。Next をクリック。
Microchip Libraries for Applications
  1. http://www.microchip.com/pagehandler/en-us/devtools/mla/ の Current MLA タブから Microchip Libraries for Applications をダウンロード。
  2. mla_v2015_08_10_windows_installer.exe を実行。
  3. インストール先は C:\Program Files (x86)\Microchip\mla\v2015_08_10 で OK。
設定確認
  1. MPLAB X IDE を起動。
  2. Tools - Options - Embedded - Build Tools に XC8 が登録されてることを確認。
XC8 Compiler v1.35 を使う場合

XC8 v1.35 から Peripheral Libraries (plib) が同梱されなくなった*1ので、これを別途インストールする必要がある。

  1. https://www.microchip.com/pagehandler/en-us/devtools/mplabxc/ の Downloads タブの下の方から PIC18F Legacy Peripheral Libraries v1.0 をダウンロード。
  2. peripheral-libraries-for-pic18-v2.00rc3-windows-installer.exe を実行。
  3. インストール先を C:\Program Files (x86)\Microchip\xc8\v1.35 に修正してインストール。

2. ソースコードの取得とコンパイル

ファームウェアソースコードhttps://github.com/esrille/new-keyboard にある。

  1. GitHub にログインしてソースコードを Fork する。GitHub のアカウントを作りたくない人は Zip でダウンロードしてもいいけど。
  2. MPLAB X IDE を起動。
  3. File - Open Project で、ダウンロードしたソースツリーの firmware\third_party\mla_v2013_12_20\apps\usb\device\hid_keyboard\firmware\MPLAB.X を開く。
  4. 通常型とポインティングデバイス内蔵型は、同じプロジェクトだが異なるコンフィグレーションになっている。コンフィグレーションの切り替えはツールバーのドロップダウンリストで行う。ビルドはコンフィグレーション別に行う必要がある。
  5. Projects ツリーの USB Device - HID - Keyboard を右クリック → Build でビルドする。
  6. BUILD SUCCESSFUL (total time: 43s) とか表示されたら成功。ソースツリーの次の場所にファームウェアの .hex ファイルが生成されている。
    • 通常型は firmware\third_party\mla_v2013_12_20\apps\usb\device\hid_keyboard\firmware\MPLAB.X\dist\Esrille_New_Keyboard\production\MPLAB.X.production.hex
    • ポインティングデバイス内蔵型は 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
XC8 Compiler v1.35 を使った場合
  • ビルド時に ../src/system_config/esrille_new_keyboard/system.c:57: error: (141) can't open include file "plib/usart.h": No such file or directory というエラーが出て失敗したら、Legacy Peripheral Libraries をインストールし忘れている。C:\Program Files (x86)\Microchip\xc8\v1.34\include\plib フォルダの中に .h ファイルが存在することを確認。あと一応、File - Project Properties の XC8 linker の Link in Peripheral Library にチェックが入っていることも確認。
  • なんか Warning が出てるのが気になる。特に後者は気になる。
../../../../../../../../src/KeyboardUS.c:115: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardUS.c:130: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardJP.c:397: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardJP.c:401: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardJP.c:405: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardJP.c:420: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardJP.c:434: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardJP.c:448: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/Mouse.c:85: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/Mouse.c:103: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:181: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:184: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:187: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:190: warning: (1404) unsupported: The Read_b_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:207: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:221: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:235: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
../../../../../../../../src/KeyboardCommon.c:249: warning: (1404) unsupported: The Busy_eep routine is no longer supported. Please use the MPLAB X MCC.
Warning: firmware/third_party/mla_v2013_12_20/apps/usb/device/hid_keyboard/firmware/MPLAB.X/dist/Esrille_New_Keyboard_with_Mouse/debug/MPLAB.X.debug.elf contains code that is located at addresses that do not exist on the PIC18F4550.
Code incompletely loaded.
  • .hex ファイルの中身も v1.34 でビルドしたものとは異なる。NISSE キーボードにロードしてみたら、とりあえず動いているようだけど…?

3. ファームウェアの書き込み

https://www.esrille.com/keyboard/ja-jp/support.html の一番下に書いてあるとおり。

  1. NISSE キーボードの USB ケーブルを抜き、Esc キーを押しながらケーブルを挿し直す。赤ランプが点滅する。
    • USB ハブを介するとダメみたい。PC 本体の USB ポートに直結すること。
  2. C:\Program Files (x86)\Microchip\mla\v2015_08_10\apps\usb\device\bootloaders\utilities\bin\win\HIDBootloader.exe を実行。
    • Device not detected. Verify device is attached and in firmware update mode. と表示されたらダメ。NISSE キーボードを接続し直す。
  3. File - Import Firmware Image で、さっきビルドしたファームウェアの .hex ファイルを開く。
  4. Program - Erase/Program/Verify Device でファームウェアを NISSE キーボードに書き込む。
  5. Program - Reset Device で NISSE キーボードをリセットする。


これでようやくスタートラインに立った。次回からいよいよソースコードをいじるよ。

エスリル Nisse 使用開始

とりあえず設定↓

esrille nisse
rev. 5
ver. 0.18
copyright 2013-2015 esrille inc.
f2 pc
f3 jp
f4 roma
f5 d0
f6 cj
f7 atok
f8 c-c
f9 off
pad 3

この設定で送出されるキーコード↓

さて、こいつをどうしてくれよう…。Nisse のキモであるところの FN キーがファームウェアそのままじゃイマイチだから、いつかはファームウェア書き換えなきゃいけない。けど、とりあえずは Nodoka だけでなんとかするべ。

謹賀新年

2015年! あけましておめでとうございます。
日々の書き込みは Twitter に移行してこのブログは放置状態ですが、まだちゃんと管理はしています。
物書きが本業になるとブログを書くほどのクリエイティビティが脳内に残らないんだぜ…。
というわけで生存報告でした。

第二世代 GCE (ゴロ寝コンピューティング環境)

なぬ、ブログ書くの1年ぶりだと? 我が家のゴロ寝コンピューティング環境がおととい世代交代したのだが…これは先代から説明しないといかんかのう。

第一世代 GCE (2012年)


今の部屋に引っ越してきてすぐ構築したもの。ポイントは、二段ベッドを買って自分は下段に寝ること。上段にパソコンやプリンタなどの大物を置き、ベッドの枠はモニタアームやスピーカなどをネジ留めするためのハードポイントとして活用する。

エルゴトロン 45-243-026サンワサプライ CR-LA302 を適当な木材でくっつけて、モニタが下向きになるようにした。モニタは手持ちの NEC LCD2490WUXi2 を使用。総コスト約 68,000 円。
これを1年4か月、それなりに快適に使ってきたのだけど、やはりいくつかの問題点が。

  • モニタが分厚いので、ベッド面からのクリアランスが意外と小さく、画面が近い。後日エルゴトロンの延長アーム 45-289-026 を噛まして嵩上げしたけど、それでも画面全体が視野に入りきらない感じ。
  • ぶっちゃけ邪魔。寝転がってしまえば問題ないとはいえ、ベッドに出入りするときぶつからないように注意が必要。実際何度かぶつけた。
  • 文字入力が面倒。キーボードを腹の上に載せて打てばいいのだけど、それだと寝返り打てないし、ちょっと検索ワードを書くためだけにキーボードを引っ張ってくるのも面倒。けっきょくスクリーンキーボードを画面に出してトラックボールでカチカチやることに。

これらの問題点を解決するべく、第二世代 GCE の構築に踏み切った。

第二世代 GCE (2013年)


ポイントはアーム廃止・小型軽量化・タッチパネル導入の3点。まず、頭上のクリアランスを確保するために、モニタ設置場所を足元側へ移動し、ゴロ寝コンピューティングするときは自分が反転することとした。これにより、枕元 (写真左) 側の上空は完全なフリースペースになった。

デッドスペースを最小化するため、構造物はできるだけシンプルに。ホームセンターで買ってきた 298 円の 2x4 材をベッド上段の枠に渡し (スノコの足と足の間)、中央にサンワサプライ CR-LA302 を木ねじで固定しただけ。そして肝心のモニタはシャープ LL-S201A を購入。世にも珍しい国産 UV2A パネル搭載の 20 型タッチディスプレイ、きっとデジタルサイネージ向け。厚さ 25.2mm、重さ 2.3kg という軽薄ぶりは他に匹敵するものがない。マットレス表面からパネル中心までの鉛直距離 70cm。総コスト約 54,000 円。
ファーストインプレッションとしては…

  • タッチパネルとゴロ寝コンピューティングの相性は抜群。タッチキーボードも GUI 操作もペンでスラスラ。しかしトラックボールも依然として必要。
  • この視聴距離で 20 インチ画面はやや小さい。23インチぐらいでもよさそう。
  • LL-S201A のパネルは画素が斜めに並んでいる?ようで、ギラツキが気になる。視聴距離の近いテレビ用途には向いてなさそう。
  • LL-S201A の最低輝度は十分暗く、夜間視聴用途にも適する。

というわけで、ゴロ寝コンピューティング環境については大幅な改善に成功。液晶パネルについてはさらなる探求が期待される結果となった。
LG 23ET63V-W はどうだろう…?

お買い物はこちらから