ファームウェア
今回60%キーボードを作るにあたって、新規に作ったのがキーマトリックス情報からキー番号に変換部分です。 その他は、親指シフト変換器 (USB版)等から持ってきて流用しています。
生のキースイッチは、「チャタリング処理」→「キーマトリックス情報取得」→「キー番号変換」→「押し順処理」→「キースタック」 を行うと、通常は次のUSBのUsage IDへ変換できるようになります。
今回は、「同時打鍵処理」や「1キー3文字処理」,「ローマ字コード変換」等色々処理が入ります。
キースキャン処理は、約1mS間隔で行っています。 チャタリングは、10mS以上掛かる場合もあり安定するまで何回も確認します。
他の60%キーボードのファームウェアは、見ていないので正確なところは分かりませんが大きくは変わらないと思います。
同時打鍵処理について
この処理は、キーボード側で処理すべき機能です。
スペースバーと他のキーが同時に押されたら、スペースバーをシフトキーに置き換える処理をします。
NICLA規格にあるような厳密なキー判定はしていません。 基本的に、「二つのキーが一定時間内に押された時、 何方かが親指シフト用のキー番号だったらそのキー番号を キースタックの最初に保存して残ったキー番号を次に保存します。」 そして同時打鍵フラグを立てます。
親指シフト用のキー番号は、左右二つあります。のでフラグも二つです。
親指シフト用のキーが離されるまで同時打鍵フラグは、立ち続けます。
後は、USBのUsage ID変換時に「親指シフト用のキー番号」と「同時打鍵フラグ」を見てシフトキーのUsage IDに変換します。
押し続けてキーリピートにも対応します。 親指シフト用のキーだけ押し続けて文字を変える事もできます。 当然シフト付きになります。
同時打鍵は、「1キー3文字処理」に関係なく動作します。
1キー3文字処理
この処理は、文字表示なのでホスト側で処理すべき機能です。
シフトが押されていない時、出力するUsage IDと 右シフトが押された状態の出力するUsage IDと 左シフトが押された状態の出力するUsage IDの 三つの変換テーブルを使用します。
ただ、現行のドライバの文字表示に合わせ、複数のUsage IDを送る必要があるので一寸面倒です。 シミュレーションしているので、複数キーを押したとき意図しない文字が出ます。
ローマ字コード変換処理
この処理は、文字表示なのでホスト側で処理すべき機能です。
日本語のかな入力の様に扱えます。
NICLA配列等日本語入力時のエミュレーションに使います。 キー番号をかな変換テーブルを通してローマ字コードの変換テーブルに渡す2段構造で、 複数のUsage IDをホストに送ります。
その他の処理
USBキーボードの通信処理
言わずと知れた、USBキーボードの要です。 PIC18F系のUSBマイコンならまあ動くでしょう。 一応マイクロチップ社のサンプルを見て自作してます。
HIDブートローダ
上と同じく一応マイクロチップ社のHIDブートローダを見て自作してます。 ただし、C言語からアセンブラ言語にして容量を減らしています。
上記 通信処理・ブートローダは、他で散々やっているので問題はないと思います。
各設定をEEPROMへ保存・読出し機能
現在未実装です。
US配列相当/JP配列相当や各処理のON/OFF設定等切り替えの情報を保存する機能です。 今は決め打ちで各処理を既定しています。 (機能設定だけでHIDブートローダを使うのは勿体ないです。)
USBデータ通信処理
現在未実装です。
親指シフト変換器にも実装した、キーコードをホスト側から入れ替える機能です。 HIDブートローダが有れば要らないかもしれません。
ちょっとした問題点
ベンダーID・プロダクトID
上記IDが無いという問題ではないのです。
マイクロチップ社のキーボードデモのIDを使う予定でプログラムを組んでいました。 が"PIC18F4553"のMPUを指定してコンパイルしブートローダで書き込み、キーボードを動作させると… 開発環境の「MPLAB X IDE」が終了するし起動もできない。 この状態でもキーボードの動作には、問題は確認されず。
キーボードデモのID以外のマイクロチップ社のプロダクトIDを指定すると問題なし(終了しない)。 この事が分るまで2日掛かった。 仕方がないので、現在ところ無難と思う「V-USB,USB Keyboard」のベンダーID・プロダクトIDを使用しています。