2020年4月30日木曜日

Key-Ichigo

IchigoBoyのフルキー版を考えてみました。

Key Ichigo キイチゴ キーボードソフト編

概要

コンセプトは「ポケットIchigoJam」です。
キーデコーダはATMEGA328Pを使う。
素直なキーマトリクスだとピン数が足りないので一工夫必要でした。
FirmwareはArduinoIDEでつくる。
キー配列はフルキー同等にする。(10キー無し)
LCDもつけてポケットPC化する。(Vidoeコネクタは残す)
ついでにMJとかROM、 センサー用コネクタとかも載せてIoTにも対応。
28ピンソケットは対応。5ピンソケットは位置がずれます。
10㎝角の基板に全部載せます。



最小構成

LINKなど。

猫にコ・ン・バ・ン・ワ のページを参考にさせて頂きました。
ps2dev を使うとマウスとキーボードをエミュレートできるらしいのですが、すでに作ったことがあるので、ライブラリは使わずにコーディングします。

自分でP/S2をプログラムしてみたいので仕様をこちらで拝見しました。
https://www.technoveins.co.jp/technical/keyboard/
https://www.avrfreaks.net/sites/default/files/PS2%20Keyboard.pdf

名前はFB友につけて頂きました。ソフトのトラブルも解決ヒントをFBのIchigoJam-Fanでいただいています。そちらもよろしければご覧ください。

以下、整理します。というより丸写し。

PCとの通信ハンドシェーク

  • PCがCLK=0にしている:PCがBUSY
  • CLK=1、DATA=0:PCからの送信要求
  • データ送信は、CLK=1のとき、データを出してキーボードからCLKを操作する。
今回は1キーのみの対応なので次のようなフローになります。複数のキーが押されたとき最初のキーが離れた時点で次のキーを受け付けるようになります。シフトやコントロールキーはいつでも応答します。

1キー打鍵キーボードの処理
  1. DATA=1ならキースキャンを開始する。
  2. DATA=0ならPCからコマンドを受信して処理し1に戻る。
  3. 押下を検知したら、そのスキャンコードを送信する。
  4. キーのリリースを待つ。タイムアウトしたらオートリピートコード送信する。
  5. 当該キーのリリースを検知したらリリースコードを送信する。
  6. スキャンを続けるか、または1に戻る。
  7. Shift,ALT,CTRLは1と4のところで押下をチェックして別途コードを送信する。

PC->キーボードへの命令

  • 0xed + 0x00~0x07 : LED点灯制御(未確認)
  • 0xee : ECHO Responce要求 (対応)
  • 0xef~0xf2, 0xf7~0xfd: Nop (未対応)
  • 0xf3 + 1byte : Set Typematic Rate/Delay(未対応)
  • F4 : Enable キースキャン開始 (ACK返信)
  • 0xf5:Default Disable、初期化しスキャン停止(未対応)
  • 0xf6:Set Default、初期化(未対応)
  • 0xfe:Resend 再送要求(未対応)
  • 0xff:Reset。リセットしACKを返す。その後セルフテストを開始。(ACKを返す)

キーボードからPCへのコマンド

  • 0x00:バッファオーバーフロー(バッファサイズ16バイト)(未対応)
  • 0xaa:BAT Completed。Basic Assurance Testが正常終了した。(未対応)
  • 0xee:ECHO RESPONCE。ECHOコマンドへの応答(対応)
  • 0xf0:Break code prefix
  • 0xfa:Ack。ECHO, RESEND以外のコマンドの正常受信に対する応答コード
  • 0xfc: BAT Failure(未対応)
  • 0xfd:セルフチェックでエラー発生(未対応)
  • 0xfe:PCに対する再送要求(未対応)
PCからのコマンドはF4とFFにACKを返します。EDもプログラムはしましたが、2バイト目の受信は動作未確認です。IchigoJamが使わなければいらないし。

さて、いくつかのメモです。
クロック周波数は10~16.7KHz( 周期100~ 60uS)です。送信時は80uSに調整しました。受信時は適当です。
キーボードからホストに送信するときは、CLK=1を確認してからデータを書いてクロックをLOWにしてHIGHに戻すことを繰り返します。SPIをプログラムで送信するのと同じです。

ホストからキーボードに送るプロトコルはこうなっています。
  クロックを作るのはキーボードが行う。
  HOST->DEVICEのスタートビットはHOSTが作る。
  PCからキーボードへのデータの送り方。
    PCは100uS以上クロックを0にする。
    PCはDATAをLOWにする。(スタートビットに見える)
    次にクロックを1にするとデータ送信要求状態となる。
    キーボードは10mS以内にデータ読み出しを開始する。
    
これで条件がわかりました。あとはせっせとコーディングします。
PCからのコマンドは全てスルーしても一応動きますので、自作されるかたはまずそれから試せばよいと思います。

>>ハードウエア編につづく(予定)

ソフト編補足 2020年5月2日

IchigoJamのモニタ出力のDefaultはNTSCなのです。KeyIchigoは128x64のLCDが搭載されていますが、そのままでは切り替えないとLCDは点きません。
そこで、キーボードコントローラにIchigoJamからリセットコマンドが送られたら通常のACKにつづけて「F1+SWITCH1,5+Enter」を送信するようにしました。
これで、電源を入れるとLCDが表示を始めるようになりました。