Raspberry Pi Picoは、USBホスト機能もあるのでキーボードを接続することができます。
ところが、USBコネクタは1つしかないのでプログラムを書き込んだら(OTGケーブル経由で)キーボードと差し替えなければなりません。
切り替えるハードを作ればちょっとは楽かもしれませんが、どちらにせよUSB経由でprintfする機能は使えなくなります。
もう一つ増設できたらなぁ、と思って検索するとありました。

https://github.com/sekigon-gonnoc/Pico-PIO-USB

これを使えば解決すると思いますが、PIOをほとんど使い切ってしまうのが難点です。
キーボードを繋いだら画面も作りたいので、これは使えません。
そこで、ハブ機能のないキーボード専用に最低限のリソースで動作するものを作りました。

以前、FPGAでPC-8001を作る計画で専用のプロセッサを書き起こして接続したのと同じようなことをPicoで実装します。
ありがたいことに、当時参考にした、いしかわさんのページが現存しました。

https://www.asahi-net.or.jp/~qx5k-iskw/robot/usbhost.html

この情報をもとに実装しました。
上記ページではAVRのbit bangingですが、今回はPicoの最大の特徴と言ってもいいPIOを使います。
PIOを使えば簡単に正確なタイミングが作れます。
最初、USBバスリセットはgpio_put()で、パケットのやりとりはPIOからするように実装しました。
しかし、pio_gpio_init()でPIOから出力するGPIOを設定したあとはgpio_put()は使えないんですね。
# gpio_get()は使えます
仕様を理解するまで試行錯誤が続きます。

実装を進めても、なかなか動いてくれません。
オシロだけじゃちょっと分からないなぁ、安いロジアナ買おうかなぁと思いながら、再度上記ページをよく読み直しました。
すると、キーボードがデータを返し終わってからホストがACKを返すまでは割と厳しい時間制限があることが書かれていました。
受信時はISRがいっぱいになってから引き取っていたのですが、それでは間に合わないのです。
そこで、(D+とD-合わせて)2ビットずつ引き取って、EOPを検出したら即、次の処理に移るようにし、ACKを返す前にprintf()するのもやめると安定して動作するようになりました。
キーボードからのデータを受信できただけで嬉しくなる、マイコン開発の楽しいところです。

PIOはステートマシン1つと16インストラクションで済みました。
余ったPIOを使って画面出力を作ります。
従来、CRTC相当の機能はマイコンだけでは厳しく、専用ICかCPLDなどが必要だったものが、PIOで実現できるのですから便利なものです。
世の中にはPicoでDVI出力なんていうのも存在します。

https://github.com/Wren6991/PicoDVI

ただ、252MHzにオーバークロックする必要があるようです。
オーバークロックせずにモノクロでいいので文字数をいっぱい出したい場合どこまで可能か検討しました。
ピクセルを出力する部分のpioasmは以下のように、2クロック/ループになります。
loop:
        out pins, 1
        jmp x--, loop
VGAなどの各種タイミングは以下のサイトにありました。

http://tinyvga.com/vga-timing

XGA(1024x768)だとドットクロックが65MHzなのでシステムクロックは130MHzとなり、定格(?)の133MHz以内になります。
VRAMもRAMの半分以下で済むのでビットマップをそのまま保持します。
CPUはVSync割込みでDMAの再設定をするだけで、あとはDMAとPIOだけで画面出力するので簡単です。

http://vdmgr.g2.xrea.com/rpipico_vga.html

を参考にさせていただきました。
PIOのプログラミングは、担当するピンを基にステートマシンを分け、irq命令で互いにタイミングを取るなど、パズル要素が高くてとても面白いものです。

VGA(640x480),8色も試せるようにRGBは別々に配線しました。
モノクロの場合、分配する必要がありますが、ドットクロックは落とせません。
そこで一旦別のピンに出力し、それを(贅沢に)ステートマシンを3つ使ってRGB各ピンにコピーしています。
# まずRに出力、RをGにコピー、GをBにコピーとするとコンバージェンスがずれたブラウン管のような表示を作れます。

printf()はデバッグ用にそのまま残し、画面表示用にxprintf()を使わせていただきました。

http://elm-chan.org/fsw/strf/xprintf_j.html

フォントは下記のものを使わせていただきました。

M+ BITMAP FONTS
http://mplus-fonts.sourceforge.jp/mplus-bitmap-fonts/index.html

ビルドのしかた

$ ./mkfont.pl
$ mkdir build
$ cd build
$ cmake ..
$ make
実行すると、キャラクタ表示、グラフィック表示、キー入力のテストができます。
vga.pioの
#define XGA
をコメントアウトすると640x480x8色になります。



写真は、コンポジットビデオで色を付ける実験をした残骸があります。
クロックディバイダで作る「約」14.318MHzではうまく色がつかず、外部クロックを用意するのも面倒なのでVGAに変更した経緯があります。



https://github.com/kwhr0/Pico-XGA-USB

このページの情報は自由に使用できますが、いっさいの保証もサポートもありません。
何らかの損害を受けたとしても、免責とします。