これをビルドします https://github.com/tanakamura/my_firmware/blob/main/d945gclf_helloworld/
できた rom
というファイルがファームウェアです。
これを焼きます。
このCH341Aとかいうのを用意します。
(本当はよくないです。CH341A は 5Vかけますが、SPI Flashに5Vかけるのは間違いらしいです。参考 : https://libreboot.org/docs/install/spi.html#do-not-use-ch341a 壊れたら困るマザボを使うときはやめましょう。raspi の spi などを使うとよいらしいです)
対応するマザーボードを用意します。ここで使っているプログラムは、D945GCLF(D945GCLF2でも可)とかいう今は売ってないマザーボードでしか動かないです。
PC ファームウェアプログラミングでは、マザーボード決め打ちでプログラムする必要があります。ハードルは高いですね。
(まあまだこれは特殊なことはしてないので、ich7 + smsc のsuperio積んでるマザボなら動く可能性ある)
CH341A のクリップで、SPI Flash をはさみます。D945GCLF2 の場合はここです。
この写真でいう、丸が付いてる部分(左上)を繋ぐようにします。(線が赤く塗ってあるのでそれを目印にします)
うまく接続できていれば、 flashrom
というプログラムで、SPI Flash ROM の中身にアクセスできます。
必ずバックアップをとります。
$ # original.rom というファイルに保存されます
$ sudo flashrom -p ch341a_spi -r original.rom
$ # D945GCLFの場合はチップ認識が自動でできないので指定がいる
$ # sudo flashrom -p ch341a_spi -r original.rom -c SST25LF040A
CH341Aのクリップはスーパー不安定なので、難易度は高いです。成功するまでクリップの接続をためしましょう。(CH341Aのクリップというかはんだ付けしてあるチップを外から挟もうというのがよくないです)
さっきビルドしたrom
を焼きます。
$ sudo flashrom -p ch341a_spi -w -c SST25LF040A -l init.layout -i init:rom
(最後の64KiBに書けばいいだけなので、範囲を書いたinit.layout
というファイルを使って書く時間を短縮してます)
シリアルケーブルを繋ぎます。え?シリアルケーブル持ってない?ファームウェア開発では必須なので必ず用意してください。USB-シリアル変換でも可。
minicom
などのシリアルが見れるプログラムでシリアルを見ます
$ LANG=C sudo minicom -D /dev/ttyS0
電源ON。
Hello, World!
Hello, World! の文字が見れましたね!