VT2040という見つけた。 かっこいい。 中身がどうなっているか知りたかったので、コードを読む事にした。

コード読みメモを以下に書く。

  • 複数のレポジトリに別れてる。
  • git submoduleで参照してる。
  • 参照はシンボリックリンクでなされていて、ソース内では直接使ってはない。
  • 良くみると、VT2040-fontが複数の場所にsubmoduleで入ってる。
  • かなり小さい
    % cat *.c *.h | wc
     2026    9944   72913
    
  • しかも、これデータを含んでる。
    • フォント(258行)
    • スプラッシュスクリーン画像(121行)
    • unicode処理テーブル(299行)
  • vt2040.c
    • メイン処理
    • 57行
    • 各種初期化
    • メインループ
      • シリアルから入力されたのを画面に出す
      • キー入力をシリアルに出す
    • スプラッシュスクリーンは文字列絵なのか。
  • serial.c
    • 99行
    • PIO使ってるみたい。
  • lcd.c
    • 225行
    • メインの処理はcore1_mainの中に書かれてる。
      • デュアルコア!
    • これもPIO使ってる。
    • CSはLOW固定してる。
    • RSTはHIGH固定してる。
    • ガンマカーブ補正って書いてあるけど、何だろうこれ。
      • 他のサンプルにもあった。
    • バックライトはPWM
      • あかるさは二乗してる。
    • rotateはLCD側でできるんだな。
    • メインのコア側から通知がきたら2回描画する。
      • 何で2回なんだろう?
    • データとコマンドで速度を変えてる。
      • しかもデータシートよりオーバークロックしてるとコメントがある。
      • 思ったよりギリギリなのかな。
    • 描画ループ
      • 行分 24回
      • 列分 80回
      • 6回(たぶん1文字の横幅?)
      • 0x3000000 2バイトずつ右シフトして0になるまで。
        • 最も内側のこれわからんな。
        • あ、フォントの縦か。
    • 画面縦でも横でもない凄い出力順だな。
      • 左上(0,0)から(0,13)、(1,0)から(1,13)、(2,0)から(2,13)….(480,0)から(480,13)、 (0,14)から(0,27)…(480,14)から(480,27)、 … (0,299)から(0,311)…(480,299)から(480,311)
  • font.h
    • 258行
    • たぶんフォントデータ
    • int32が6個1行で256セット入ってる。
    • font_exporter.html
      • 108行
      • font.hを作る。
      • canvasに書いて、生成
      • アンチエイリアスしてる。
      • 1ピクセルを2bitに入れてる。
      • 縦13ピクセルを26bitに入れて1つのint32として出してる。
      • 横6ピクセル分セットにして出力
      • 文字分繰り返す
    • 左端1列が白いフォントを使ってるから、最初の桁は0が多い。
    • なるほど、1行分のウインドウ内だけ書き込みとかできるのかな。
  • key.c
    • 117行
    • GPIOを読んで、unicode文字コード+カスタムコードを出す。
    • 1msおきにスキャンして、押されてたらkey_msesテーブルをインクリメントする。
    • shiftはここでは、レイヤ切り替え。
    • こもモジュールは文字コードを返すので、シフトもレイヤ。
    • Ctrl+Shift+Xみたいな文字入力はできなさそう。
  • term.c
    • 686行
    • メインディッシュ
    • term_chars 画面上の文字が入ってる配列
    • term_attrs それぞれの文字の属性が入ってる配列
      • 前景色4bit 背景色3bit 下線1bit
    • フラグがいっぱい
      • カーソル位置
      • カーソルが表示されてるか
      • DEC graphics
        • shift
      • カーソル制御
      • 改行文字
      • タブ位置
      • それらを一時保存する領域(エスケープシーケンスにそういうのがある)
    • ステートによって次の文字を受けとる関数をポインタに入れてる。
    • テキストvramっぽいものに結果を入れてる。
    • ついでに、キーボードから来たコードポイントをutf-8にするのもやってる。