chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

RP2350を使ってDVI信号を出したい

背景:PIOを調べていて生成できるクロックの上限は75MHzと理解した*1。もっと高い周波数のシリアルを出せる方法として、HSTXというハードが搭載されるのを知った。HSTXはDVI信号を出力するためにRP2350で追加されたと知り、DVI信号を出してみたいと思った。WaveshareのHDMIコネクタのついた評価ボード(RP2350-PiZero Development Board)を買った。
アプローチ:Waveshareマイコンのデモで、DVI出力サンプルが提供されており、これを動かしてみる。最終的には、MicroPythonからDMA/HSTXレジスタを操作してDVI出力させたい
取り組み:

まずは、、DVI信号(TMDS)がどうなっているのかを理解する。仕様書を読み解かず、生成AIに丸投げなので、裏を取った方がいいけど、、とりあえず、640x480の画像を出したければ以下のようなパターンで信号を作ればよいと*2


同期用固定パターンの10bit列

画像領域は、1ピクセル RGB(8bitx3)で構成され、色ごとに8bit->10bitにTMDSエンコードをすると。10bitエンコードした状態で、クロック、B、G、Rの4つのバッファを作っておいて、4chのDMAで4つのバッファからHSTXに連続転送したら、DVI信号が出力されて絵が出るはず。
DMAとHSTXさえ動けばあとはマイコンは何もしないと思われ、MicroPythonでも制御レジスタを直接操作したらDMA/HSTXのハードを制御しつつグラフィック描画できるのでは??と期待。ただ、640 x 480 x 2byte x 4 の領域が確保できるのか?? MicroPython だとこのサイズは無理そうな気がするが。。リングバッファにするなら、アライメントも考える必要がある。

■追記
いろいろ調べるうちに理解が深まり、WaveshareのRP2350-PiZero Development BoardではHSTXからDVI信号が出せないことが分かった。そもそもピン配置が違うのであった。Waveshareの評価ボードはオーバークロックしたPIOによるDVI信号ソリューションで動かすのが前提で設計されているらしかった。以下はHDMI端子の接続情報

HSTXはGPIO12-19に出力されており、HDMI端子はこれらのピンと接続されている必要がある。
RP2350の仕様書より

SwitchScienceには、抵抗とHDMI端子だけで構成されるDVI出力用の拡張ボードが販売されているようなので、これを買って、HSTXからの出力をデジタルTVに接続したらいいのだが、、フレームバッファのメモリが足りなさすぎる。多分分かっている人は、Pixel深度を調整したり、縦横方向にデータを複製して省サイズでなんとか表示させられるのだろうけど、自分はそこまで分かっていない。だったら、、最初から外付けPSRAMのついたAdafruitの方がトラブル少ないのではとも思える。ただ、、Adafruitの基板は、本体のボードと、HDMI端子のボードは別パーツになっていてその間はフラットケーブルでつなぐ構造になっています。ちょっと大げさというか、収まり悪いというか。。一枚のボードに収まっていたら悩まずに買うのだけど。
コストを抑えつつ、DVI出力する方法として、、今回購入したWaveshareのRP2350-PiZero Development Boardに、PSRAMをハンダ付けして、メモリを増やす。ボード上のHDMIは使わず、SwitchScienceが販売している拡張ボードを使ってDIV出力すると。この方法だと、HDMIボード(900円ぐらい)だけの追加で済む。

■参考資料、URL
DVIの仕様書
Digital Visual Interface DVI Revision 1.0

https://www.waveshare.com/wiki/RP2350-PiZero
サンプルコードはGithub ではなく、ZIPファイルをWikiページから直接DLするようになっている・・・
https://files.waveshare.com/wiki/RP2350-PiZero/RP2350-PiZero.zip

PSRAMを追加する解説動画
youtu.be

MicroPython RP2350 HSTX Demos · GitHub

*1:システムクロックは150MHzだけどset命令, またはsidesetでCLK出すとして、L/Hの2命令必要で、システムクロックの1/2になるから

*2:本当にフロントポーチ、バックポーチが今もあるのか不明。アナログ時代は必須だったけど、デジタル時代では減らす方に変わっているらしい