レポジトリの作成
M5Stack CoreMP135のCPUは、STM社のSTM32MP135DAE7です。本家でサポートしている、OSD32MP1のCPUが、STM32MP1をベースにしたもので近そうなので、これをベースにすることにしました。
Nervesのドキュメントにある、custom_systemを作成する方法に従って、nerves_system_osd32mp1
をコピーして、nerves_system_m5stack_core_mp135
を作成しました。
@appに指定するのは、最終的にはパッケージ名にもなるので、nerves_system_XXX
という形式にするのが良いと思います。
Buildできるか確認
この段階では、ビルドしても動作しませんが、ツールチェーンが一通り動作するか
Builiding the systemに従って、ビルドしてみます。
Nervesのプロジェクトを作成し、mix.exsを編集します。
mix nerves.new your_project
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 | 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の設定 |