NoWayOS
JA
GitHub
メニュー閉じる

ビルドする

Raspberry Pi 5で動かす

何を買えばよいか、SDカードのビルドと書き込み方、ボードのシリアルログの読み方とチェックの仕方、そしてPi 5でシステムを無人で実行する方法や、HDMI画面でユーザーインターフェースを見る方法。

Raspberry Pi 5は、NoWayOSのリファレンスボードです。低価格で広く手に入り、最初のハードウェアテストもこのボードで行っています。QEMUで合格したシステムは、Pi上でも同じ期待出力ファイルを使い、ボードのシリアルログからチェックします。

ボードについての二つのルール。 PiのUARTには、5 Vのシリアルアダプターを決してつながないでください。3.3 Vのポートです。また、開発用ボードでは、Piのワンタイムプログラマブルメモリに書き込んだり、セキュアブートを有効にしたりしないでください。どちらも元に戻せません。make sdcardは、そのどちらかを行うconfig.txtや、ボードの電圧を変えるconfig.txtを拒否します。

必要なもの

品目 備考
Raspberry Pi 5 16 GBモデルで開発・テストしています。どのコマンドもボードをrpi5b_2gbと指定します。これはPi 5のメモリのうち最初の2 GBを使うseL4の構成で、ビルドはそのうち1 GB弱をseL4に与えます。そのため、2 GB、4 GB、8 GBのモデルでも何も変える必要はないはずですが、試してはいません
電源 公式の5 V・5 AのUSB-C電源か、それと同等のもの。電力が足りないPi 5は、ソフトウェアのバグのような振る舞いをします
microSDカード make sdcardがビルドするブートパーティション用
Raspberry Pi Debug Probe そのUARTケーブルが、Pi 5の3ピンのデバッグ用コネクタに合います。適切なケーブルがあれば、3.3 VのUSBシリアル変換アダプターならどれでも使えます
HDMIモニター、USBキーボードとマウス ユーザーインターフェース用。モニターは電源を入れる前につないでください。ファームウェアが画面を設定するのは起動時だけです。USBのブートプロトコル対応キーボードとマウスは使えますが、ハブはまだ使えません

SDカードをビルドする

make sdcard BOARD=rpi5b_2gb SYSTEM=hello

これで、カードのブートパーティションがbuild/rpi5b_2gb/hello/sdcard/に書き出されます。U-Boot、デバイスツリーとオーバーレイ、config.txt、seL4イメージloader.img、ライセンスファイル、そして後でカードをチェックするためのSHA256SUMSです。U-Bootは、コンテナの中でソースから再現可能な形でビルドされます。

カードに書き込む

macOSの場合

  1. diskutil listでカードを見つけます。external, physicalと表示され、カードの容量と同じものです。次の手順でそのディスク全体が消去されるので、番号を二度確かめてください。
  2. PIBOOTというラベルでフォーマットします。
diskutil eraseDisk FAT32 PIBOOT MBRFormat /dev/diskN
  1. ファイルをコピーし、すべてが無傷で届いたことを確かめます(すべて一致すれば、何も表示されません)。
cp -RX build/rpi5b_2gb/hello/sdcard/ /Volumes/PIBOOT/
dot_clean -m /Volumes/PIBOOT
(cd /Volumes/PIBOOT && shasum -a 256 -c SHA256SUMS | grep -v ': OK$')
  1. diskutil eject /dev/diskNで取り出し、Piに挿します。

Linuxの場合

同じ手順を、Linuxのツールで行います(プロジェクト自身のカードはmacOSで作っています)。

  1. lsblk -pでカードを見つけます。/dev/sdXや/dev/mmcblk0のような、カードの容量と同じディスクです。次の手順でそのディスク全体が消去されるので、名前を二度確かめ、そのパーティションがマウントされていれば、すべてアンマウントしてください。
  2. PIBOOTというラベルのFAT32パーティションをひとつ作ります(dosfstoolsとpartedが必要です)。
sudo parted --script /dev/sdX mklabel msdos mkpart primary fat32 1MiB 100% set 1 lba on
sudo mkfs.vfat -F 32 -n PIBOOT /dev/sdX1
  1. ファイルをコピーし、すべてが無傷で届いたことを確かめます(すべて一致すれば、何も表示されません)。
sudo mount /dev/sdX1 /mnt
sudo cp -r build/rpi5b_2gb/hello/sdcard/. /mnt/
(cd /mnt && sha256sum -c SHA256SUMS | grep -v ': OK$')
sudo umount /mnt
  1. Piに挿します。

シリアルコンソールをつなぐ

Debug Probeは、GPIOピンではなく、HDMIポートの間にあるPi 5の専用の3ピンのデバッグ用コネクタに挿します。通信速度は115200ボー、8N1です。プローブは、Macでは/dev/cu.usbmodem…として、Linuxでは/dev/ttyACM0などとして現れます(ユーザーがdialoutグループに入っている必要があります)。

Piの電源を入れる前にキャプチャを始めてください。ログひとつにつき、起動は一回です。

mkdir -p build/rpi5b_2gb/hello
(stty 115200 raw -echo; cat) < /dev/cu.usbmodemXXXX | tee build/rpi5b_2gb/hello/serial.log

この例のように、設定と読み取りはひとつのコマンドにまとめてください。macOSでは、ポートを二度目に開くと9600ボーに戻ってしまいます。Linuxでは、stty -F /dev/ttyACM0 115200 raw -echoでポートを設定し、cat /dev/ttyACM0で読み取ります。最後の期待される行が出たら、Ctrl-Cで止めます。

電源を入れると、U-Bootが3秒カウントダウンしてから、カードのloader.imgを起動します。代わりにU-Bootのプロンプトで止めるには、カウントダウン中にstopbootと入力します(止められるのはこの単語だけなので、何もつながっていないシリアル線が拾うノイズで、デバイスがU-Bootで止まってしまうことはありません)。

ログをチェックする

QEMUの出力をチェックするのと同じルールで、ボードのログをシステムの期待出力ファイルと照合します。

make check-serial SYSTEM=hello LOG=build/rpi5b_2gb/hello/serial.log

Pi専用の期待出力ファイルを持つシステムでは、BOARD=rpi5b_2gbを付けてください。

システムを無人で実行する

プローブをつないでおけば、make pi-runが、カードの差し替えも、ボードの前に人がいることもなしに、一連のシステムをボード上で実行します。これはコンテナの中ではなく、手元のマシン上で直接実行してください(Macでは、Podmanの仮想マシンからUSBシリアルデバイスが見えません)。そのマシンにはPython 3.11以降が必要で、使うのは標準ライブラリだけです。

make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS="hello ipc-demo isolation-test"

システムごとに、コンテナの中でイメージをビルドし、ボードをリセットし、シリアル線でイメージを送って無傷で届いたことを確かめ、ボードのウォッチドッグを有効にしてから起動します。各ログは届くそばからチェックされ、ウォッチドッグが次のシステムのためにボードをリセットします。入力するコマンドはすべてエコーバックされ、確定する前にチェックされます。ログはbuild/rpi5b_2gb/pi-run/に保存されます。

ユーザーインターフェースを見る

電源を入れる前にモニターをつないだ状態で、次を実行します。

make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS=ui-demo PI_WATCHDOG=15

これで、ユーザーインターフェースのスクリプト化されたセッションがHDMI画面上で動き、すべてのフレームのハッシュがチェックされます。人が見られるように、ウォッチドッグなしでシステムを動かしたままにするには、make pi-show PI_DEVICE=… SYSTEM=ui-demoを使います。ボードの電源を入れ直すまで動き続けます。

失敗したときは

最後に動いたイメージに戻り、シリアル線とブートチェーンをもう一度確かめてください。一度に二つ以上のことを変えるのは、その後です。U-Bootより前に何ひとつ表示されない場合は、プローブや配線を疑う前に、ブートローダーのBOOT_UART設定と、カードのconfig.txtにあるenable_uart=1を確認してください。