ラズパイ5でAGL動いた

2024年のGW。ポチッとラズパイ5を購入しました。
普通ならばRaspberry Pi OSをインストールして動作確認すると思うところですが、Yoctoを使って更にはAGLを動かしてみます。

推敲が十分ではないので適宜修正していきます。(2024/5/6)

# できた内容
* AGL 17.0.2
* SDカードを使わずUSBメモリからの起動
* 公式アダプターを使わないで動作

# ハマったこと
* シリアルログがでない！
* USBから起動できない！

いずれも既知の情報で解決しました。

# ビルドの前に（ラズパイ5のYoctoおよびAGL対応）
ラズパイ4はすでにAGLで対応されており、ドキュメントも（それなりに）準備されています。AGL documentページ参照ください。

ラズパイ5のAGL対応状況はどうかというと、どうやら3/11に[コミット](https://git.automotivelinux.org/AGL/meta-agl/commit/?id=3fb5640211e4c3874036a6d4a61e852b348eb4ad "Add RaspberryPi 5 platform template") がありました。取り込まれたばかりです。

https://git.automotivelinux.org/AGL/meta-agl/commit/?id=3fb5640211e4c3874036a6d4a61e852b348eb4ad

### コミットはmasterブランチのみ！
しかし、パッチが取り込まれているのはmasterブランチのみです。他のブランチにはバックポートされていません。そのままmasterで進めてもよいのですが、4/30にYoctoの新しいLTS がリリースされたことにより、AGLのmasterブランチも新LTS (Scarthgap 5.0)にアップデートしています。
事前の動作確認を行った上で更新しているとはいえ、**yocto VerUp直後のmasterブランチほど不安定なものはない**ので、今回利用するのは極力避けるのがよいでしょう

さて、安定版のquillback ブランチを見てもラズパイ5対応のコミットは取り込まれていません。cherry-pickが必要です。幸いにして難しいコミットではなかったので単純なcherry-pickのみで問題ありませんでした。

### meta-raspberryも一応確認
本家のraspberrypi BSPであるmeta-raspberrypiを見てみます。2023/10月から対応が始まって24年の1月に取り込まれたようです。ですが、これもmaster ブランチのみ。

https://github.com/agherzan/meta-raspberrypi/pull/1237

探してみると、1コミットでバックポートしているPRがあり、kirkstoneにmergeされていました。そのまま使えそうです。

https://github.com/agherzan/meta-raspberrypi/pull/1271

AGLのmanifestで正しく更新されているかチェックします。AGL-repoを確認するときちんとメンテナンスされており、下のコミットで最新へ更新されいました。
https://git.automotivelinux.org/AGL/AGL-repo/commit/?h=quillback&id=cf01cbf2e6a5af5f96dfca1238e0f72e7a0562f6

AGL 17.0.1もしくは17.0.2を使えば大丈夫そうです。

# ビルド手順
1. AGL 17.0.2を取得して、
1. meta-aglでRPI5対応のパッチをcherry-pickします。さらに
1. USB起動のためのコミット[^1]をmeta-raspberrypiでcherry-pickします。 
1. 最後にbitbakeします

[^1]:1年前のGW成果 https://qiita.com/harunobukurokawa/items/0837944260a203aa2b39 （
ラズパイのyoctoイメージをUSBメモリから起動する）

```yocto
$ repo init -b quillback -m quillback_17.0.2.xml -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo
$ repo sync

# 
cd meta-agl
git cherry-pick -n 3fb56402 
cd ..

# ラズパイ USBメモリ対応をkirkstoneへ 
cd ../bsp/meta-raspberrypi/ 
git cherry-pick  4c033eb 
cd ../..

source meta-agl/scripts/aglsetup.sh -f -m raspberrypi5 -b build-raspberrypi5 agl-demo 
```

```
# local.conf(site.conf) に追加
CMDLINE_ROOT_PARTITION = "/dev/sda2" 
BOOT_MEDIA = "usb" 
```

### ビルド可能なimageを確認
今回は標準的なivi向けimageをビルドしたいと思います。`bitbake -s` を実行して有効なpackageを確認した際の結果は以下の通り。

```bash
build-raspberrypi5$ bitbake -s | grep ^agl-ivi- 
agl-ivi-demo-base                                     :1.0-r0 
agl-ivi-demo-base-flutter                             :1.0-r0 
agl-ivi-demo-control-panel                            :1.0-r0 
agl-ivi-demo-platform                                 :1.0-r0 
agl-ivi-demo-platform-crosssdk                        :1.0-r0 
agl-ivi-demo-platform-flutter                         :1.0-r0 
agl-ivi-demo-platform-flutter-simple                   :1.0-r0 
agl-ivi-demo-platform-html5                           :1.0-r0 
```

:::note
agl-ivi-demo-platform: Qtデモ（従来のAGLデモ） 
agl-ivi-demo-platform-flutter : 新UIデザイン(flutter)
agl-ivi-demo-platform-flutter-simple : 旧デザイン＋QtアプリのFlutter 
agl-ivi-demo-platform-html5 : HTML向けのCEF(Chromium) UIデモ
:::

### びっとべーく
```
bitbake agl-ivi-demo-platform-flutter
```
ビルドが完了すると、tmp/deploy/images/raspberrypi5/にファイルが作成されます。
今回は`agl-ivi-demo-platform-flutter-raspberrypi5-20240504084813.rootfs.wic.xz`を書き込みます。

### rpi-imageが便利
書き込みにはラズパイOSを書き込む時に使用する`rpi-imager`が便利です！

選択するOSでは「Use custome」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240142/528d1ce1-17c1-a8f3-3370-e42907b0c0c9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240142/5dc640ab-09c7-f0de-d0e3-1f546c35d040.png)

### いざ電源ON！のはずが動かない

#### シリアルログがでない！
meta-agl内で`"ENABLE_UART ?= "1"` が有効になっている。その結果、config.txtに`enable_uart=1`が指定されていることも確認済み。調べると、`dtparam=uart0_console`も追加する必要があるとのこと。これはmeta-raspberrypiでもレシピ対応されてない。
対応：config.txtに`dtparam=uart0_console`を追加
```
enable_uart=1  ## enable_uart=1はすでに記載済み
dtparam=uart0_console ## ★追記
```

#### USBから起動できない！
結論からいうと2️つの要因。
* 公式アダプター(5.1V/5A)を使ってないために電力不足となりUSB端子に電流供給されない
* fstabに/dev/mmcblk1p1が指定されており、起動時にSDカードを必要とされていた

1. USB電源供給
`config.txt`に`usb_max_current_enable=1`を追記。

```config.txt
usb_max_current_enable=1
```

参考：https://gigazine.net/news/20231109-raspberry-pi-5-usb-boot/

1. fstabの修正

/etc/fstabの一番下にある行（`/dev/mmcblk0p1 /boot   vfat    defaults`)をコメントアウトします。

```/etc/fstab
root@raspberrypi5:~# cat /etc/fstab
# stock fstab - you probably want to override this with a machine specific one

/dev/root            /                    auto       defaults              1  1
proc                 /proc                proc       defaults              0  0
devpts               /dev/pts             devpts     mode=0620,ptmxmode=0666,gid=5      0  0
tmpfs                /run                 tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
tmpfs                /var/volatile        tmpfs      defaults              0  0

# uncomment this if your device has a SD/MMC/Transflash slot
#/dev/mmcblk0p1       /media/card          auto       defaults,sync,noauto  0  0

#/dev/mmcblk0p1 /boot   vfat    defaults        0       0
```

:::note warn
一年前もハマった事象[^1]なのですが、Yocto単体ではこの指定はないため発生しません。なぜかAGLのみで発生します。
:::


# 結論
* ラズパイ5でAGL 17.0.2が動いた。
* SD起動であればmeta-agl の1パッチをバックポートするのみでOK。
* USB起動するにはいくつか修正等が必要。
* 非公式アダプターでも一応動いた。

# やり残し
* masterブランチ(scarthgap)での動作確認
    * これは動いているだろうと思うので優先度は一番低い。
* LXCコンテナデモ (kirkstone,scarthgap)
    * 17.0.2は問題なくできそうな予感です。
scarthgap（AGL master)は進めてみましょう
* config.txtのパッチ作成と投稿
    * meta-raspberrypiはレビューが厳しいので意外と手間と時間がかかります。。


# あとがき
* 非公式電源(5V/3A) + USBストレージは性能ガタ落ちを発見