【Nerves】M5Stack Core MP135にポーティングしてみた(KernelのBuild編)


[準備編](https://qiita.com/GeekMasahiro/items/dd214725bc1849b355ef)
[設定ファイル作成編](https://qiita.com/GeekMasahiro/items/17242bf1f030de91ed75)
[KernelのBuild編](https://qiita.com/GeekMasahiro/items/e1bb049144b314e0c413)　←いまココ
[試行錯誤編](https://qiita.com/GeekMasahiro/items/e26a185bf858b0b149df)

# kernel buildの設定

```nerves_defconfig```のkernelの設定は、M5の設定を使い、次の様な記述にしました。

```
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,STMicroelectronics,linux)v5.15-stm32mp-r2.1.tar.gz"
BR2_LINUX_KERNEL_DEFCONFIG="multi_v7"
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(LINUX_DIR)/arch/arm/configs/fragment-01-multiv7_cleanup.config $(LINUX_DIR)/arch/arm/configs/fragment-02-multiv7_addons.config $(NERVES_DEFCONFIG_DIR)/m5stack/linux-disable-etnaviv.config $(NERVES_DEFCONFIG_DIR)/m5stack/linux-enable-fbdev-emul.config $(NERVES_DEFCONFIG_DIR)/m5stack/linux-enable-m5stack.config $(NERVES_DEFCONFIG_DIR)/m5stack/fragment-03-systemd.config"
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT=y
BR2_LINUX_KERNEL_INSTALL_TARGET=y
BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="$(NERVES_DEFCONFIG_DIR)/m5stack/linux-dts/*"
BR2_LINUX_KERNEL_INTREE_DTS_NAME="stm32mp135f-coremp135"
```

Kernelは、STMicroelectronicsのリポジトリからダウンロードしています。
```nerves_system_osd32mp1```では、kernel.orgのLinux kernelを使用、```nerves_system_rpi4```は、raspberrypi提供のカーネルを使用していました。
kernel.orgのLinux kernelが使えれば、その方が良いかもしれませんが、ハードウエアに適したカーネルを使う事が重要だと思います。
今回は、このままで進めます。
カーネルの設定の方法は、```BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE```に記述する方法もありますが、M5の設定を踏襲して、```BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES```に記述する方法をとっています。

fragment-03-systemd.config等は、Nervesを使う場合は不要かもしれません。M5固有のハードウエアに関する記述は、残し、それ以外の設定は、Nervesとして必要なものに限定しても大丈夫だとおもいます。
予期しない問題があるかもしれないので、実績のあるM5の設定でまず動作させてみることにします。

# パッチのあて方

buildrootはパッケージのビルドを次の順に行います。

- パッケージのダウンロード
- パッケージの展開
- パッチのあてる
- パッケージのビルド

```nerves_defconfig```には、```BR2_GLOBAL_PATCH_DIR```という変数があり、ここにパッケージ名をディレクトリ名として、パッチを置く事で、パッチをあてる事ができます。

Nervesの設定では、
```
BR2_GLOBAL_PATCH_DIR="${BR2_EXTERNAL_NERVES_PATH}/patches"
```
となっています。

arm-trusted-firmwareとopteeに当てるパッチがあるので、```nerves_system_m5stack_core_mp135```に```patches```ディレクトリを作成して、パッチを保存します。
このパッチも適用されるように、パスを追加します。

```
BR2_GLOBAL_PATCH_DIR="${BR2_EXTERNAL_NERVES_PATH}/patches ${NERVES_DEFCONFIG_DIR}/patches"
```

```${NERVES_DEFCONFIG_DIR}```は、```nerves_system_m5stack_core_mp135```のディレクトリを意味しています。


# buildしてみる

mix firmwareを実行すると、buildrootのビルドが実行されます。

buildrootが成功すればfirmwareの作成まで実行されますが、開発中は、途中で止まる事も多々あるとおもいます。
その場合の対処方法を説明します。

buildrootは、```.nerves/artifacts```にビルドされたファイルが保存されます。
具体的には、次のようなディレクトリに保存されます。

```
/path/nerves_system_m5stack_core_mp135/.nerves/artifacts/nerves_system_m5stack_core_mp135-portable-0.0.1
```
このディレクトリに移動して、```make```を実行する事で、buildrootのビルドを再実行する事ができます。
再実行して、エラーメッセージを確認したりできます。

このポーティングでは、u-bootのプログラムでLCDディスプレイにNervesのロゴを表示するようにしました。
この対応で何度か、u-bootのビルドをやり直して試す必要がありました。
その時には、u-bootパッケージが、build/u-boot-custom/に展開されているので、このディレクトリを削除して、```make```を実行する事で、u-bootパッケージだけがビルドされ、ビルド時間を短縮できました。

他には、```make linux-rebuild``` を実行するとlinuxカーネルのリビルドを行えます。Linuxのドライバー部分だけ再作成したい時などに役立ちます。

buildのプロセスが完了できたら、```mix firmware```を実行して、firmwareを作成します。