FreeBSD on RaspberryPi 4 Model B 接触篇

**2020/05/10 追記** [FreeBSD on RaspberryPi 4 Model B 発動篇](https://qiita.com/bsd-hacker/items/513449dab2a9b144373f) を書きました。

日本の技適認定が取れた [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) が流通するようになりました。
RS Components の先行予約アナウンスを見つけたので早速申し込み、[RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/)/4G を入手できました。
さて [FreeBSD](https://www.freebsd.org/) は動くかなと情報を集め始めましたが、明確に「RaspberryPi 4 で FreeBSD が動いた」という情報が見つかりません。
公式イメージもまだ作られていません。

Linux 系は [Raspbian](https://www.raspberrypi.org/downloads/raspbian/) など、いくつか公開されているので、この辺をもとにこねくり回せば動いたりしないかな、と思ってちょっとやってみました。

# 先に結論

「腐ってやがる... 早すぎたんだ」 orz

やはり、人類に [FreeBSD](https://www.freebsd.org/) on [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) は早すぎた様です。

kernel がロードされるところまで行きますが、kernel ロード後、画面がブラックアウトしてどういう状態になっているのかもわからない状態です。

まだいろいろ対応が必要そうなので、SDカードにイメージを焼いて起動、とはいきません。
[RaspberryPi](https://www.raspberrypi.org/) 4 Model B で [FreeBSD](https://www.freebsd.org/) が遊べるようになるには、まだ時間がかかりそうです。

[FreeBSD](https://www.freebsd.org/) は起動できませんでしたが、今後のために何をやったかを残しておくことにします。

# 方針
公式の [RaspberryPi](https://www.raspberrypi.org/) 4 Model B 用の SD カードイメージは作成されていません。
何らかの方法で SD カードイメージを作成する必要があります。

実は [FreeBSD](https://www.freebsd.org/) の arm64 用の SD カードイメージ作成は、ボードごとに設定を変えて kernel を作成するようにしていません。
すべて GENERIC Kernel になっています。
kernel も userland もボードごとに差が無いのなら、すでに存在している SD カードイメージを流用できそうです。

公式が作成している SD カードイメージとして、[PINE64](https://www.pine64.org/devices/single-board-computers/pine-a64/), [PINE64-LTS](https://www.pine64.org/devices/single-board-computers/pine-a64-lts/), [PINEBOOK](https://www.pine64.org/pinebook/), [RaspberryPi 3](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) があります。
このなかから選ぶなら、起動のしかたが同じ [RaspberryPi 3](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) 用のものがいいでしょう。

"[RaspberryPi 3](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) 用の SD カードイメージをベースにして、[RaspberryPi 4](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 用のものに入れ替えていく" という方針でいくことにします。

# 用意するもの
1. [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/)/4G 一式
2. RaspberryPI 3 Model B 用の FreeBSD current のイメージ
  - https://download.freebsd.org/ftp/snapshots/ISO-IMAGES/13.0/
    - https://download.freebsd.org/ftp/snapshots/ISO-IMAGES/13.0/FreeBSD-13.0-CURRENT-arm64-aarch64-RPI3-20191127-r355121.img.xz
3. 最新の RaspberryPi 用 firmware
  - https://github.com/raspberrypi/firmware.git
4. RaspberryPi 4 対応の u-boot
  - ports/sysutils/u-boot-rpi4/

## [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/)/4G 一式
まずは、[RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) の本体など一式が必要です。

用意するもの。
- 本体
- 電源
- micro HDMI ケーブル
- SDカード
    - サイズは 4GiB 以上
- USB キーボード
- HDMI入力のディスプレイ

キーボードとディスプレイ以外は、[KSY](https://raspberry-pi.ksyic.com/main/index) や [SWITCHSCIENCE](https://www.switch-science.com/) といったオンラインショップから秋葉原の[秋月電子](http://akizukidenshi.com/)や[千石電商](https://www.sengoku.co.jp/)といった実店舗でも手に入るようになっています。

私は [KSY](https://raspberry-pi.ksyic.com/main/index) で [Pi4 B 4GB ベース キット V1](https://raspberry-pi.ksyic.com/?ev=main.index&pdp.id=520) と [USB電源＋USB-Cアダプター](https://raspberry-pi.ksyic.com/?ev=main.index&pdp.id=499) を入手しました。
ついでにケースを [Physical Computing Lab](https://www.physical-computing.jp/) で [Raspberry Pi4用 DIYメタルケース](https://www.physical-computing.jp/product/1829) も買っておきました。
SDカードは手持ちの在庫から。
キーボードとディスプレイはそこらに落ちてたもの。

## [RaspberryPI 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) 用の FreeBSD current のイメージ
/usr/src/release/release.sh を使って自前で SD カードのイメージを作成してもいいのですが、[RaspberryPI 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) 用の SD カードイメージを利用することにしました。

[RaspberryPI 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) 用には 12-RELEASE のイメージもありますが、まだ対応されてない [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) で動かすことが目的なので [snapshots](https://download.freebsd.org/ftp/snapshots/ISO-IMAGES/) を使うことにします。

今回は一番新しい [FreeBSD-13.0-CURRENT-arm64-aarch64-RPI3-20191127-r355121.img.xz](https://download.freebsd.org/ftp/snapshots/ISO-IMAGES/13.0/FreeBSD-13.0-CURRENT-arm64-aarch64-RPI3-20191127-r355121.img.xz) を使うことにします。

```
cd /tmp
fetch https://download.freebsd.org/ftp/snapshots/ISO-IMAGES/13.0/FreeBSD-13.0-CURRENT-arm64-aarch64-RPI3-20191127-r355121.img.xz
```

## 最新の RaspberryPi 用 firmware
起動には [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 用の start*.elf 、 fixup*.dat 、 *.dtb が必要になります。
これらのファイルは、[https://github.com/raspberrypi/firmware/](https://github.com/raspberrypi/firmware/) から取得します。

```
mkdir -p /tmp/github.com/raspberrypi
cd /tmp/github.com/raspberrypi
git clone https://github.com/raspberrypi/firmware.git
```

## RaspberryPi 4 対応の u-boot
[RaspberryPI 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) 用の SD カードイメージに入っている u-boot は [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) に対応していません。
u-boot も [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 用のものが必要です。

u-boot は [u-boot の source code](https://www.denx.de/wiki/U-Boot/SourceCode) からコンパイルしてもいいのですが、最近 ports に入りました。
pkg binary も用意されているのでそちらを使います。

```
pkg install -y u-boot-rpi4
```

# SDカードイメージのでっちあげ方

必要なものがそろったら、SDカードイメージを作成していきます。

まずは、RaspberryPI 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) 用の SD カードイメージを書き込みます。

```
xzcat /tmp/FreeBSD-13.0-CURRENT-arm64-aarch64-RPI3-20191127-r355121.img.xz | dd of=/dev/da0 bs=64k
```

書き込みが終わったら FAT 領域のファイルを追加/変更するため mount します。

```
mount_msdosfs /dev/da0s1 /mnt
```

mount したら [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 用 の各種ファイルを追加/変更していきます。

```
cp /tmp/github.com/raspberrypi/firmware/boot/*.{dtb,dat,elf} /mnt/.
cp /tmp/github.com/raspberrypi/firmware/boot/bootcode.bin /mnt/.
cp /tmp/github.com/raspberrypi/firmware/boot/overlays/* /mnt/overlays/.
```

今回利用する u-boot は dtb ファイルを dtb/broadcom から探すようになっているようなので、dtb ファイルを所定の位置にコピーしておきます。

```
mkdir -p /mnt/dtb/broadcom
cp /tmp/github.com/raspberrypi/firmware/boot/*.dtb /mnt/dtb/broadcom/.
```

u-boot を [RaspberryPi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 用 のものに置き換えます。

```
cp /usr/local/share/u-boot/u-boot-rpi4/{metadata,u-boot.bin} /mnt/.
```

ファイルの追加/変更が終わったら unmount します。

```
umount /mnt
```

SD カードイメージの作成は以上です。

# できたSDカードイメージで起動するか確認
作成した SD カードを挿して電源を入れます。

u-boot が起動したようなメッセージが出てきますが、キーボードを認識してません。
Ethernet デバイスも認識できてない様です。

kernel をロードできますが、この時点でもキーボードを認識していないので loader の途中で止めることもできません。

kernel が起動してちょっとメッセージが出ますが、すぐにブラックアプトしてしまいます。

"[Raspberry Pi 4が起動しない（モニタが映らない）場合の設定方法](https://qiita.com/karaage0703/items/97808dfb957b3312b649)" が起きているのかと思って config.txt を変更してみましたが変化がないのでまだまだ [FreeBSD](https://www.freebsd.org/) 側の対応ができていない様です。

# [発動篇](https://qiita.com/bsd-hacker/items/513449dab2a9b144373f)に向けて
まずは、u-boot が起動した時点で USB キーボードを認識できるようにしないとどうにもなりません。
その次は、loader が起動した時に USB キーボードを認識して一時停止できるようにし、起動時のパラメータや kernel module の追加などを行えるようにする必用があります。
その次は single user mode での起動で、その次は各種デバイスの対応で...
道のりは長そうです。

たぶん、他の誰かの対応の方が早いんじゃないかな...
誰かいい情報を持ってたら教えてください。

誰かが対応してくれるのを待つのもいいですが、せっかくなので自分であれこれいじりまわしてみるのもいいんじゃないかと思います。

# 追記

[FreeBSD on RaspberryPi 4 Model B 発動篇](https://qiita.com/bsd-hacker/items/513449dab2a9b144373f) を書きました。

今後は [FreeBSD on RaspberryPi 4 Model B 発動篇](https://qiita.com/bsd-hacker/items/513449dab2a9b144373f) を参照してください。