【Nerves】M5Stack Core MP135にポーティングしてみた(設定ファイル作成編)


[準備編](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)

# レポジトリの作成

M5Stack CoreMP135のCPUは、STM社のSTM32MP135DAE7です。本家でサポートしている、OSD32MP1のCPUが、STM32MP1をベースにしたもので近そうなので、これをベースにすることにしました。

Nervesのドキュメントにある、custom_systemを作成する方法に従って、```nerves_system_osd32mp1```をコピーして、```nerves_system_m5stack_core_mp135```を作成しました。

https://hexdocs.pm/nerves/customizing-systems.html


@appに指定するのは、最終的にはパッケージ名にもなるので、```nerves_system_XXX```という形式にするのが良いと思います。

# Buildできるか確認

この段階では、ビルドしても動作しませんが、ツールチェーンが一通り動作するか
[Builiding the system](https://hexdocs.pm/nerves/customizing-systems.html#building-the-system)に従って、ビルドしてみます。

Nervesのプロジェクトを作成し、mix.exsを編集します。
```
mix nerves.new your_project
```

mix.exsの変更箇所

```Elixir:mix.exs
  #=vvv= Update your_project/mix.exs to accept your new :custom_rpi3 target

  # ...
  @all_targets [:osd32mp1, :m5stack_core_mp135]
  #                        =^^^^^^^^^^^^^^^^^^=

  defp deps do
    [
      # Dependencies for all targets
      # ...

      # Dependencies for specific targets
      {:nerves_system_osd32mp1, "~> 0.15", runtime: false, targets: :osd32mp1},

      # Add the entry below vvv
      {:m5stack_core_mp135,
       path: "../nerves_system_m5stack_core_mp135",
       runtime: false,
       targets: :m5stack_core_mp135,
       nerves: [compile: true]},
    ]
  end
```

buildrootのビルドが実行されるので結構時間がかかります。
私の場合は、メモリ32G、AMD Ryzen 7/NVMeのPCで、1時間くらいかかりました。

試しに、SDカードに書き込んで、起動してみましたが、何も起きませんでした。

# Nerves_system_brの役割

buildrootは、LinuxOSのファームウエアを作成するツールです。
このツールでは、Linux OSが動作するのに必要なすべてのパッケージをビルドし一つのファームウエアを作成できます。
```nerves_system_br```の_brは、buildrootの略（だと思います）で、Nervesのファームウエアを作成する機能を提供するパッケージになります。

Nerves_system_brには、ターゲットによらない共通部分のパッケージが含まれています。
ターゲットによって異なる部分が、```nerves_system_rpi0```などの各ターゲットのパッケージになります。

ポーティングでは、このターゲットのパッケージを作成する事になります。

# buildroot機能

buildrootは、SDカードに書き込むファームウエアイメージを作成します。
Linuxのカーネルだけでなく、ブートローダー、デバイスツリー、ルートファイルシステムなども含まれます。
アプリケーションとして、Elixirや、Nervesのプロセスも含まれます。
電源投入後から、LinuxOSが起動するまでの処理を順に書いてみるとつぎのような流れになります。

- 電源投入
- ROMに書かれたプログラムをCPUが実行
- SDカードのブートセクタを読み込み（ハードウエアにより異なる）
- ブートセクタからブートローダを読み込み
- ブートローダがLinux Kernelを読み込み、Kernelを起動
- カーネルがルートファイルシステムをマウント
- Nervesプロセスの起動

ポーティングする上では、次の3段階を順に確認していくと良いと思います。

- ブートローダー(U-Boot)が動作してKernelが起動すること
- 起動したKernelが正しく動作すること
- Nervesのプロセスが正しく起動すること

# buildrootの設定

buildrootの設定は、```nerves_system_m5stack_core_mp135```の```nerves_defconfig```で行います。
```nerves_system_br```がこの設定ファイルを参照していて、この設定ファイルに従って、ファームウエアが作成されます。
このファイルとこのファイルが参照するファイルを一通りそろえる事が、ポーティング作業になります。

M5Stack社の提供しているbuildrootの設定を参考にしながら、```nerves_defconfig```の内容どうするか検討します。

M5Stack社のbuildrootの設定（以下M5の設定とします）と```nerves_system_osd32mp1```のもの（以下Nervesの設定とします）を比較して、適切なものを選択していきます。

ブートローダの部分は、M5の設定では、ARM_TRUSTED_FIRMWAREパッケージが使われています。ARM_TRUSTED_FIRMWAREを使わない方法もあるのかもしれませんが、詳しくはCPUやROMの仕様を理解が必要になりそうです。まずは、M5の設定と同様にする事にしました。
カーネルについては、ドライバー関係で問題が起きないようにまずは、M5の設定を使う事にしました。


|項目|Nervesの設定|M5の設定|どっちを使うか|
|---|---|---|---|
|実際のファイル|[defconfig](https://github.com/m5stack/CoreMP135_buildroot-external-st/blob/st/2023.02.10/configs/m5stack_coremp135_515_defconfig)|[nerves_defconfig](https://github.com/nerves-project/nerves_system_osd32mp1/blob/main/nerves_defconfig)|-|
|toolchain|nerves project|buildroot|Nervesの設定|
|カーネル|kernel.orgのLinux|stm社のgitのLinux|M5の設定|
|ブートローダ|buildrootのU-Bootパッケージ|stm社のgitのU-Bootパッケージ。tf-aとかopteeもある|M5の設定|
|デバイスツリー|MP1用|MP135用|M5の設定|
|その他パッケージ|-|-|Nervesの設定|