概要
このプロジェクトは、RCadeのCRTディスプレイにPCの映像をUSB経由で表示するためのアダプタ開発記録です。 VGA信号の生成や非標準解像度対応、カラービット数の向上が主な課題。 Raspberry Pi RP2040やSTM32など複数のマイコンを活用した試行錯誤。 LinuxカーネルモジュールやGUDプロトコルの活用も検討。 最終的な目的は、柔軟かつ高品質なCRT出力を実現すること。
RCade用CRTアダプタ開発記
- Frank がRCade用にアーケード筐体を調達、 オリジナルCRT を残した構成
- Raspberry Pi で初期運用、より高性能なPCへの移行を目指す
- JAMMAコネクタ を介したCRT接続、VGA-JAMMA変換器を利用
- 非標準解像度 (例:336x262)対応の必要性
- 18ビットカラー からの画質向上要望
- USB接続 によるノートPC対応、PCI-eカード非使用
VGA信号とCRTディスプレイの仕組み
- VGA はアナログ信号で R/G/B・HSYNC・VSYNC を伝送
- CRT内部の 電子銃 と 偏向磁石 による走査制御
- HSYNC/VSYNC で走査タイミング同期、 フロント/バックポーチ で戻り時間確保
- 必要信号: R/G/B・HSYNC・VSYNC の正確なタイミング生成
RP2040のPIOを用いたVGA信号生成
- RP2040 の PIO(Programmable IO) でVGA信号生成に挑戦
- PIOは 1命令1クロック でGPIO制御可能、 カスタムプロトコル 実装に最適
- HSYNC/VSYNC/RGB 各信号を独立したPIOプログラムで制御
- 解像度やパラメータはハードコーディング、柔軟性は低いがPoCには十分
- 実機CRTでの動作確認 に成功、パターン描画で動作検証
Linuxカーネルモジュールによるフレームバッファ転送
- Linuxカーネルモジュール で フレームバッファ をUSB経由でRP2040に送信
- DRMレイヤ と連携し、正しい解像度・リフレッシュレートで表示成功
- 開発中に カーネルパニック頻発、デバッグに苦戦
GUDプロトコルの活用
- GUD(Generic USB Display) はUSBディスプレイアダプタ用プロトコル
- Linuxカーネルに公式対応、柔軟な機能広告・圧縮・差分転送に対応
- ドキュメント不足 のため、カーネルモジュールをリバースエンジニアリング
- RP2040向けにRustでGUDガジェット実装、Linux画像のCRT表示に成功
- 12ビットカラー まで対応、配線は最小限のPoC構成
技術的課題と制限
- USBフルスピード(FS) の帯域制限(11Mbps)で 10FPS未満
- カラービット数 や 解像度 の制約、 バッファアンダーフロー による同期ズレ
- カラーバンドや画面のズレ など、実装上のバグも確認
追加の試行錯誤
- GUDガジェットソフトウェア をPi ZeroやNixOSで動作検証
- Buildrootのバージョン問題 や VGAオーバーレイの移植失敗
- ユーザースペース実装 も検討するが、18ビットカラー制限に不満
STM32へのアプローチ
- USBハイスピード(HS) 対応の STM32 マイコンを検討
- 複数マイコン構成 (STM32→RP2040→VGA)は複雑化するため回避
- よりシンプルかつ高速な構成 を模索中
このプロジェクトは、 ハードウェア・ソフトウェア両面での挑戦 と、 非標準CRT出力の実現 を目指す貴重な開発記録です。今後も より高品質かつ柔軟なCRTアダプタ の完成に向けた試行錯誤が続く見込み。