6.terminalとdisplayの構造
いろいろ調べた結果のまとめ
確認に使ったmicroPython用ドライバ(再掲)
https://github.com/zenodante/PicoCalc-micropython-driver
このドライバの構造は大まかに以下
pico_files/modules
ドライバの Python インタフェース部分
picocalcdisplay/picocalcdisplay.c
Cで記述してある display ドライバ本体
vtterminal/vtterminal.c
Cで記述してある VT100 エミュレータライバ本体
displayモードはデフォルトの 4bit/pixel を前提にしている
このpicocalcdisplayとvtterminalが連携して動作している。
ざっくり書くと
displayがframebufferを確保し、teriminalが標準入出力データを横取り(dupterm)して文字bitmapを作成し framebuffer に書き込む。
1.display driver
初期化時に framebuffer を確保しアドレスを返す。
RGB565だと 204KB必要だが標準の4bitモードだと51kBで済む。
このメモリにデータを書いておけば、自動的にLCDに転送される。
リフレッシュ有効・無効の切り替え可。WiFiを使う場合はリフレッシュ無効にする必要あり。
画面モードとは無関係に LCD は RGB565 になっている。
CPU負荷の都合か、LCDへのデータ転送は Picoの core1 を占有して実行している。
(自分でコア1を使いたいときはどうすればいい??)
core1の動作は以下
1. framebuffer から64ピクセル分のデータ読み出す
2. カラーテーブル(LUT)を参照し、RGB565に変換
3. 64x2バイトの Linebuffer にコピー
4. Linebuffer をDMA転送でSPI経由LCDへ送る
以後、繰り返し
RGB565の場合は framebuffer を直接変換なしでLCDへ送る。これが画面が乱れる原因。
terminal は framebuffer が 4bitモードを前提としてデータを書きこむためアドレスがずれる。
色数が多いモードなら画面が乱れるだけだが、色数が少ないモードだとメモリ破壊を起こす。