Arduinoで使われているAVRでソフトウエアでUSBをサポートするためのV-USBというコードがあり時々使っているが、これを使ってAppleが昔作っていたADB(Apple Desktop Bus)のキーボードを使えるようにする変換モジュールを作ってみたがうまくできなかったので、メモを残しておきます。
ADBはApple IIgsから使われるようになった低速のキーボードなどをコンピュータにつなぐためのインターフェースです。MachintoshはSEから採用しました。このインターフェースは4線で数珠つなぎに接続する事ができました。Appleは初代iMacでUSBを採用してADBを止めました。
ADBはパソコンからキーボードなどの機器にコマンドを送ってキーボードの状態を拾いだしています。
Guide to the Macintosh®Family Hardwareより
コマンドは1bitおおよそ100uSで全体で1mSくらいとなりデータも1バイト1mSくらいとなります。
1はLoが35uSでHiが65uSで0がLoが65uSでHiが35uSとなります。
キーボードは1バイトのTalkコマンドで2バイトのデータが返ってくるので3mSくらいの処理になります。
この処理を実装してみたのですが、ときどき化けてしまいます。1と0の差が30uSなので10uS程度のバッファがあるのですがV-USBの割り込みがこれを越えてしまう事があるようです。100文字入力して1文字が化けるような状態で実用になりません。
githubにadb-v-usbという実装があって、V-USBの割り込みを待って処理するように実装されているようです。これのREADMEにV-USBには100uSな割り込み処理があるって書いてあります。コードはかなり複雑になってしまっています。
V-USBでタイミングクリティカルな実装は上記のように頑張んなければいけなくあまり向いていないのかもしれません。
ADB USB変換は製品や、オープンソースのいろいろな実装がありますが、adb-v-usbの人がUSBのハードウエアサポートがあるAVRでadb-usbというコードも作られていて、こちらはとくにトリッキーな事はしていなくて、AT90USB162で作ってみて、実用的に使えました。
Macintosh Classicに付いていたApple Keyboard IIが使えないので調べてみました。
Apple Keyboard IIはナショナルセミコンダクタのワンチップマイコンのINS8048を使っていて、DB0-DB7にパルスを発生してそれをP10-P17,P20-P26で受けてキーをスキャンします。クロックはセラロックで6MHzです。T1とP27がトランジスターを挟んでADBの信号線に接続されています。T0はジャンパーでスイッチになってます。
どうもINS8048が起動しなくなっているような感じです。まれにスキャン信号がでることもあるのですが、ほとんどダメです。経年劣化で故障してしまったのかもしれません。