はい、承知いたしました。STM32MPUシリーズ上でLinuxを動作させるための詳細な入門ガイド記事を作成します。約5000語を目指し、初心者にも理解しやすいように構成します。
STM32 Linux 入門:はじめての導入ガイド
はじめに:STM32MPUと組み込みLinuxの世界へようこそ
マイクロコントローラー(MCU)として広く知られるSTM32シリーズ。その多くはリアルタイム性や低消費電力を重視した組み込みシステムで利用され、RTOS(リアルタイムオペレーティングシステム)やベアメタル環境でプログラミングされるのが一般的です。しかし、STM32シリーズの中には、汎用性の高いオペレーティングシステムであるLinuxを動作させることができる特別なラインナップが存在します。それが STM32MPU (Microprocessor) シリーズです。
STM32MPUシリーズは、高性能なアプリケーションプロセッサ(Cortex-A)コアと、リアルタイム処理や低消費電力を担うマイクロコントローラー(Cortex-M)コアを組み合わせた、いわゆるヘテロジニアスマルチコアアーキテクチャを採用しています。このCortex-AコアにMMU(Memory Management Unit)が搭載されていることで、Linuxのような仮想記憶を使用するOSを動かすことが可能になります。
なぜSTM32MPU上でLinuxを使うのでしょうか? その主な理由は以下の通りです。
- 豊富なソフトウェアエコシステム: Linux上で動作するライブラリ、フレームワーク、アプリケーションは膨大です。ネットワーキング、ファイルシステム、GUI(Graphical User Interface)、データベースなど、複雑な機能の実装が容易になります。
- 抽象化: ハードウェアの詳細からアプリケーション開発者を解放します。ドライバを一度開発すれば、その上のアプリケーションはハードウェアの具体的なレジスタ操作などを意識する必要がありません。
- マルチタスクとプロセス管理: 複数のアプリケーションを同時に安定して実行できます。プロセスの分離により、一つのアプリケーションのクラッシュがシステム全体に影響を与えるリスクを減らせます。
- ネットワーキング機能: 標準的なTCP/IPスタックが利用でき、ネットワーク接続を必要とするデバイス開発が容易です。
- 開発効率: 標準的なLinux開発ツール(GCC, GDB, ビルドシステムなど)が利用でき、PC上での開発に近い感覚で作業できます。
一方で、組み込みLinuxにはいくつかの課題もあります。
- 学習コスト: ベアメタルやRTOSと比較して、ブートローダー、カーネル、ファイルシステム、デバイスツリー、クロスコンパイル環境など、学ぶべき概念が多くなります。
- リソース消費: Linux自体がベアメタルや多くのRTOSよりも多くのメモリ(RAM)とストレージを消費します。
- リアルタイム性: 標準のLinuxは汎用OSであり、厳密なリアルタイム制御には向きません(リアルタイムパッチを適用するなどの対応が必要になる場合があります)。
- 複雑なビルドプロセス: ターゲットハードウェア向けにOSイメージ全体を構築するための専用のビルドシステム(BuildrootやYoctoなど)の理解と運用が必要です。
このガイドは、まさにこの「学習コスト」を乗り越え、「はじめての導入」を成功させることを目的としています。STM32MPU上でLinuxを動かすために必要なハードウェア、ソフトウェア、そして具体的なビルド・導入手順を、初心者の方にも分かりやすく、詳細に解説していきます。
対象読者:
- STM32開発経験があるが、Linuxは初めての方。
- 組み込みLinuxに興味があるが、どこから手を付けて良いか分からない方。
- STM32MPUシリーズのボードを使って何か開発を始めたい方。
- Linuxカーネルやブートローダーの深い理解よりも、まずは動かしてみたい方。
このガイドを通して、STM32MPUと組み込みLinuxの世界への第一歩を踏み出しましょう。
必要なもの:準備を整える
STM32MPU上でLinuxを動かす旅を始めるにあたって、いくつかのハードウェアとソフトウェアが必要になります。事前にこれらを準備しておきましょう。
1. ハードウェア
- STM32MPU 開発ボード: Linuxを動作させるための必須アイテムです。STM32MPUシリーズはいくつか種類がありますが、最初の一歩としては、公式の評価・開発ボードがおすすめです。
- STM32MP157F-DK2 (Discovery Kit): 入手しやすく、機能も豊富(ディスプレイ、Wi-Fi/Bluetoothなど)で、このガイドでの利用を想定しています。
- STM32MP157C-EV1 (Evaluation Board): より多くのペリフェラルが引き出されており、拡張性が高いですが、価格も高めです。
- その他 STM32MP1/MP2 シリーズボード: MP1シリーズの他のボードや、新しいMP2シリーズのボードでも基本的な流れは同じですが、後述するデバイスツリーやビルドシステムの設定が異なります。
- 注意点: STM32F4/F7/H7などの一般的なSTM32 MCUでは、MMUがないためこのガイドのLinuxを直接動作させることはできません。必ず「STM32MPU」シリーズのボードを用意してください。
- microSD カード: OSイメージを書き込むために必要です。最低でも8GB、推奨は16GB以上です。クラス10以上の速度のものを選びましょう。
- USB-C ケーブル: ボードへの給電や、一部ボードではデバッグ用のシリアル通信にも使用します。ボードに付属しているものがあればそれを使います。
- シリアル変換アダプター (USB-TTL 変換アダプター): ボードの起動ログやコンソールにアクセスするために使用します。多くの開発ボード(特にDK2)にはST-LINK経由で仮想COMポート機能が内蔵されていますが、そうでない場合や安定しない場合に備えて用意しておくと便利です。TTLレベルは3.3Vに対応したものを選んでください。接続にはジャンパー線なども必要になります。
- ホストPC: ビルド環境を構築し、OSイメージを作成するためのPCです。
- OS: Linux環境が必須です。 特にUbuntuのLTS (Long Term Support) バージョンが推奨されます(例: 20.04 LTS, 22.04 LTS)。WindowsやmacOS上に仮想環境(VMware, VirtualBoxなど)やWSL (Windows Subsystem for Linux) を構築しても良いですが、ネイティブLinux環境が最もスムーズに進むことが多いです。メモリは8GB以上、ストレージは100GB以上の空き容量を推奨します。
- インターネット接続: ソースコードのダウンロードやパッケージのインストールに必要です。
2. ソフトウェア (ホストPC側)
- Linuxディストリビューション: 推奨はUbuntu LTS。
- ビルドに必要なパッケージ: コンパイラ、ビルドツール、ライブラリなど。これらは後述するビルドシステム(Buildroot)の準備段階でインストールします。
- シリアルターミナルソフトウェア: ボードとシリアル通信するために使用します。
- Linux標準の
minicomまたはscreenがよく使われます。
- Linux標準の
- SDカード書き込みツール: OSイメージをSDカードに書き込むために使用します。
- Linux標準の
ddコマンドを使用します。パーティション操作にはfdiskやpartedを使用します。
- Linux標準の
- Buildroot または Yocto Project: 組み込みLinuxシステム全体をビルドするためのフレームワークです。本ガイドでは、比較的シンプルで初心者向けの Buildroot を主に利用します。
概念を理解する:組み込みLinuxの主要コンポーネント
STM32MPU上でLinuxが起動するまでには、PCが起動するのと同じようにいくつかの段階と、それぞれを担う主要なソフトウェアコンポーネントが存在します。これらを理解することが、その後の手順やトラブルシューティングに役立ちます。
1. ブートROM (Boot ROM)
これはSTM32MPUチップ内部にROMとして書き込まれている、変更不可能な最初のブートローダーです。電源が投入されると最初に実行され、どのストレージデバイス(SDカード、NANDフラッシュ、eMMCなど)から次のブートステージを読み込むかを決定します。ブートピンの設定や、ストレージ内の特定の場所にある署名付きイメージ(FSBL – First Stage Boot Loader)を検出することで、次の段階へ処理を移します。STM32MPUの場合、このFSBLはしばしば TF-A (Trusted Firmware-A) が使用されます。
2. FSBL (First Stage Boot Loader) / TF-A (Trusted Firmware-A)
ブートROMによって読み込まれる最初の実行可能なプログラムです。TF-AはARMv8-Aアーキテクチャ向けの標準的なセキュアブート/ランタイムソフトウェアであり、システムの基本的な初期化(クロック、メモリなど)を行い、次のブートステージ(SSBL – Second Stage Boot Loader)を安全にロードする役割を担います。STM32MPUでは、STMicroelectronicsがSTM32向けにポーティングしたTF-Aが利用されます。
3. SSBL (Second Stage Boot Loader) / U-Boot
FSBL/TF-Aによってロードされる次のブートステージです。一般的に U-Boot (Universal Bootloader) が使用されます。U-Bootは組み込みシステムで広く使われている多機能なブートローダーです。ハードウェアのより詳細な初期化を行い、Linuxカーネルイメージ、デバイスツリー、および必要な他のファイルをストレージから読み込み、メモリに展開し、Linuxカーネルに制御を渡します。U-Boot自身にもコマンドラインインターフェースがあり、ブートパラメータの変更や、ネットワーク経由でのファイルのダウンロード(TFTP)など、様々なデバッグや設定が可能です。
4. Linux Kernel
OSの心臓部です。ハードウェアを管理し、プロセスのスケジューリング、メモリ管理、ファイルシステム、ネットワークスタック、デバイスドライバなどを提供します。U-Bootによってメモリにロードされ、実行を開始します。カーネルはハードウェア構成を知るために デバイスツリー を使用します。
5. Device Tree (DT/DTB)
STM32MPUのような複雑なSoC(System on Chip)では、利用可能なペリフェラル(GPIO、I2C、SPI、UART、イーサネット、ディスプレイコントローラーなど)やその設定(アドレス、クロック、割り込みラインなど)がボードや製品によって異なります。Linuxカーネルは、起動時にハードウェア構成を動的に知るために、 デバイスツリー(Device Tree) と呼ばれるデータ構造を使用します。デバイスツリーは.dtsというテキストファイルで記述され、コンパイルされて.dtbというバイナリ形式になります。U-Bootがカーネルと一緒にメモリにロードし、カーネルがそれ^1を読み込んでハードウェアを認識します。
6. Root Filesystem (RootFS)
Linuxが起動した後、ユーザー空間で実行されるすべてのプログラム、ライブラリ、設定ファイル、デバイスファイルなどが格納されているファイルシステムです。ls, cd, psといった基本的なコマンドや、シェル (bashなど)、ネットワーク設定ツール、開発したアプリケーションなどはすべてこのRoot Filesystemに含まれます。BuildrootやYoctoは、このRoot Filesystemの内容を構築する機能も持っています。
7. ビルドシステム (Buildroot / Yocto)
上記のTF-A, U-Boot, Linuxカーネル, デバイスツリー, Root Filesystemといったすべてのコンポーネントのソースコードを取得し、クロスコンパイルし、連携させ、最終的なOSイメージや書き込み可能なファイル群として出力する作業は、手動で行うと非常に複雑で手間がかかります。Buildroot や Yocto Project は、これらのプロセス全体を自動化するための専用のビルドフレームワークです。ターゲットボードを選択し、必要なソフトウェアパッケージ(ユーザーランドアプリケーションやライブラリ)を選択するだけで、依存関係を解決しながらクロスコンパイルを行い、SDカードなどに書き込める形式で全てのコンポーネントをまとめてくれます。
- Buildroot: シンプルで学習しやすく、小規模から中規模のプロジェクトに適しています。単一のツールとして機能し、設定ファイル(
.config)一つで多くのことを制御できます。 - Yocto Project: 大規模で複雑なプロジェクト、多種のハードウェアサポート、高度なカスタマイズが必要な場合に適しています。コンセプトが多く、学習コストは高いですが、柔軟性と強力な機能を持ちます。
本ガイドでは、初心者向けの入門としてBuildrootを使用します。
環境構築:ホストPCの準備とBuildrootのセットアップ
いよいよ具体的な作業に入ります。まずはホストPC上でビルド環境を構築します。Ubuntu 20.04 LTS または 22.04 LTS を使用していることを想定します。
1. 必要なパッケージのインストール
Buildrootを正常に実行するためには、様々な開発ツールやライブラリが必要です。Ubuntuでは以下のコマンドでインストールできます。
bash
sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential # コンパイラなど基本的なビルドツール
sudo apt install -y libncurses5-dev libncursesw5-dev # menuconfig用
sudo apt install -y libssl-dev # SSLライブラリ
sudo apt install -y u-boot-tools # U-Bootイメージ操作ツール
sudo apt install -y flex bison # 字句解析器・構文解析器
sudo apt install -y imagemagick # 画像ツール
sudo apt install -y dfu-util # DFUツール (STM32MPU書き込みに使う場合がある)
sudo apt install -y usbutils # USBデバイス情報確認
sudo apt install -y p7zip p7zip-full # 7zipアーカイブ展開
sudo apt install -y qemu-user-static # クロスコンパイルしたバイナリをホストで実行 (デバッグ用)
sudo apt install -y mtd-utils # フラッシュメモリツール
sudo apt install -y device-tree-compiler # デバイスツリーコンパイラ
sudo apt install -y libtool
sudo apt install -y automake
sudo apt install -y autoconf
sudo apt install -y bc
sudo apt install -y gparted # パーティション編集GUIツール (ddに慣れない場合)
これらのパッケージはBuildrootの公式ドキュメントで推奨されているものの一部です。Buildrootのバージョンによって必要なパッケージが微妙に異なる場合がありますが、これだけインストールしておけば多くの場合は問題ありません。
2. Buildroot のダウンロード
Buildrootは公式ウェブサイトから最新の安定版をダウンロードするのが良いでしょう。この記事執筆時点での最新安定版、またはSTM32MPU公式ドキュメントで推奨されているバージョンを確認してください。
例として、stable版をダウンロードします。
bash
cd ~ # ホームディレクトリなど、作業しやすい場所へ移動
wget https://buildroot.org/downloads/buildroot-stable.tar.gz
tar -xzf buildroot-stable.tar.gz
mv buildroot-stable buildroot # ディレクトリ名を分かりやすく変更
cd buildroot
これで ~/buildroot ディレクトリにBuildrootのソースコードが展開されました。
3. Buildroot の設定 (menuconfig)
Buildrootは make menuconfig コマンドで対話形式の設定画面を開き、ターゲットボードや含めるソフトウェアパッケージを選択します。STM32MPU開発ボードの場合、STMicroelectronicsがBuildroot向けに提供している定義済みコンフィギュレーションを使用するのが最も簡単です。
STMicroelectronicsは、Buildrootとは別に、STM32MPU用のLinux開発パッケージ「Developer Package (Starter Package + Distribution Package)」を提供しています。Buildrootを使用する場合でも、このパッケージに含まれる定義済みコンフィギュレーションファイル (.config ファイル)を利用するのが一般的です。これは、STがボード固有のTF-A, U-Boot, Kernel, Device Tree の設定やパッチをBuildrootに適用できるように準備しているためです。
STのSTM32MPUソフトウェアパッケージは、STのウェブサイトからダウンロードできます。(例: STM32MP1 Developer Package)。ダウンロードしたアーカイブの中に、Buildroot用の定義済みコンフィギュレーションファイルが含まれています。通常は buildroot-external/configs/ のようなディレクトリに配置されています。
例: STM32MP157F-DK2 ボードの場合
- STのウェブサイトからSTM32MP1 Developer Package (Starter Package + Distribution Package) をダウンロード・展開します。
- 展開したディレクトリの中から、Buildroot用の定義済みコンフィグファイルを探します。ファイル名は
stm32mp157f_dk2_defconfigのような名前になっていることが多いです。 - Buildrootのルートディレクトリ(先ほど
tar -xzfしたディレクトリ)に、そのコンフィグファイルをコピーまたはリンクします。
“`bash
例: STのパッケージが ~/stm32mpu/developer-package に展開されたと仮定
cp ~/stm32mpu/developer-package/Distro/buildroot-external/configs/stm32mp157f_dk2_defconfig ~/buildroot/configs/
“`
定義済みコンフィグをBuildrootに適用するには、以下のコマンドをBuildrootのルートディレクトリで実行します。
bash
cd ~/buildroot
make stm32mp157f_dk2_defconfig # あなたのボードに対応するdefconfig名に置き換えてください
これにより、~/buildroot/.config ファイルが生成され、STが推奨するSTM32MPU用の設定が読み込まれます。
次に、必要に応じて追加の設定を行います。
bash
make menuconfig
make menuconfig を実行すると、以下のような設定画面が表示されます。
┌───────────────────── Buildroot Configuration ──────────────────────┐
│ Arrow keys navigate. <Esc> cancels. <?> for help. Pressing = │
│ selects a help screen, followed by a configuration item. │
│ ────────────────────────────────────────────────────────────────── │
│ > Target options │
│ > Build options │
│ > Toolchain │
│ > System configuration │
│ > Kernel │
│ > Device tree │
│ > Bootloaders │
│ > Filesystem images │
│ > Base system │
│ > Target packages │
│ > Filesystem images │
│ > Bootloader │
│ > Host utilities │
│ > Legacy config options │
│ --- Help │
│ │
│ │
│ │
└────────────────────────────────────────────────────────────────────┘
ここで、以下の項目を主に確認・設定します。
- Target options: ターゲットアーキテクチャ (ARM little endian), ボードの種類などが正しく選択されているか確認します (
make defconfigで設定されているはず)。 - Toolchain: ビルドに使用するクロスコンパイラの設定です。「Buildroot toolchain」を選択すると、Buildrootが自動的にツールチェインをダウンロード・ビルドしてくれます。初心者にはこれがおすすめです。「External toolchain」を選択すると、事前にインストールしたツールチェインやSTが提供するツールチェインを指定できます。
- System configuration: ターゲットシステムの名前、ログインプロンプト、パスワード、initシステム(SysVinit, systemdなど)、
/devの作成方法(devtmpfsなど)などを設定します。デフォルトで問題ないことが多いです。 - Kernel: Linuxカーネルの設定です。使用するカーネルのバージョン(STは特定のバージョンを推奨)、
defconfigファイルなどを指定します。通常、STのdefconfigで設定されています。必要に応じてmake linux-menuconfigでカーネルの詳細設定に入ることも可能ですが、まずはデフォルトで進めるのが良いでしょう。 - Device tree: 使用するデバイスツリーファイル(
.dts)を指定します。ボード固有の.dtsファイルが選択されているか確認します。通常、これもSTのdefconfigで設定されています。 - Bootloaders: TF-AとU-Bootの設定です。ビルドするかどうか、ソースコードの場所、ボード固有の設定ファイルなどを指定します。通常、STの
defconfigで有効になっています。 - Target packages: 最もよく変更する項目です。 Root Filesystemに含めたいソフトウェアパッケージ(コマンド、ライブラリ、アプリケーション)を選択します。
- 基本的なシェル、ファイルユーティリティ (
ls,cd,cpなど) は通常Base systemやTarget packagesの中でBusyBoxとして選択されています。 - ネットワークツール (
ping,ifconfig/ip) - 開発ツール (
gdbserverなど) - ファイル転送ツール (
openssh(ssh, scp),tftp) - プログラミング言語 (
python,perlなど) - GUIライブラリ (
Qt5,GTK3など) - ストレージツール (
fdisk,mkfsなど) - その他必要なライブラリやアプリケーション
- チェックボックス
[ ]で含めるか含めないか、[*]で含める、<M>でモジュールとしてビルドする、という選択肢があります。
- 基本的なシェル、ファイルユーティリティ (
- Filesystem images: 出力するRoot Filesystemイメージの形式を選択します。SDカードからの起動では、
tarアーカイブやext4ファイルシステムイメージが一般的です。STのdefconfigでは、SDカード書き込みに適した出力形式が設定されているはずです。
設定が終わったら、「Save」を選択し、ファイル名(デフォルトの .config でOK)を指定して保存します。そして「Exit」で画面を閉じます。
重要な注意: Buildrootの設定は非常に多岐にわたります。最初は必要最低限の設定(ターゲットボード、ツールチェイン、基本的なシステムツール)に留め、まずは起動できるイメージを作成することを目指しましょう。後から make menuconfig を再度実行して、必要なパッケージを追加していくことができます。
4. Buildroot の実行
設定が完了したら、いよいよビルドを実行します。Buildrootのルートディレクトリ (~/buildroot) で以下のコマンドを実行します。
bash
make
このコマンドを実行すると、Buildrootは以下の処理を自動的に行います。
- 必要なツールチェインをダウンロードまたはビルドする。
- TF-A、U-Boot、Linuxカーネル、デバイスツリー、選択したすべてのパッケージのソースコードをインターネットからダウンロードする。
- ダウンロードしたソースコードにパッチを適用する(必要に応じて)。
- 各コンポーネントをクロスコンパイルする。
- Root Filesystemを構築する。
- 最終的なイメージファイル群を生成する。
このプロセスは、ホストPCの性能やインターネット接続速度、選択したパッケージ数にもよりますが、初回は数時間かかることがあります。 気長に待ちましょう。ビルド中にエラーが発生した場合は、エラーメッセージをよく読み、原因を特定して対処する必要があります(依存関係の問題、ホスト環境の問題、ソースコードのダウンロード失敗など)。
ビルドが成功すると、生成されたファイルは ~/buildroot/output/images/ ディレクトリに出力されます。STM32MPU向けの場合、通常以下のファイルが含まれます。
tf-a-stm32mp1*.stm32: TF-A (FSBL) イメージu-boot.stm32: U-Boot (SSBL) イメージzImage: Linuxカーネルイメージstm32mp1*.dtb: デバイスツリーバイナリ(ボード固有)rootfs.tar.gzまたはrootfs.ext4: Root Filesystemイメージ(形式は設定による)- その他、ボード固有のファイルや、ブート用のヘルパースクリプトなど
これらのファイルが生成されていれば、ビルドは成功です!
SDカードの準備とイメージの書き込み
ビルドによって生成されたイメージファイルをSDカードに書き込み、STM32MPUボードから起動できるようにします。このステップは正確に行う必要があります。誤ったデバイスに書き込むと、ホストPCのデータが消える可能性があるため、十分注意してください。
1. SDカードの特定
ホストPCにmicroSDカードリーダーを接続し、microSDカードを挿入します。LinuxでSDカードがどのデバイス名として認識されているかを確認します。以下のコマンドを使用します。
bash
sudo fdisk -l
または
bash
sudo parted -l
出力結果の中から、SDカードの容量(例: 16GB)と一致するデバイスを探します。/dev/sda, /dev/sdb, /dev/mmcblk0 などが候補になります。絶対にホストPCのシステムドライブと間違えないでください! デバイス名が /dev/sda の場合、そのパーティションは /dev/sda1, /dev/sda2 となります。ここではデバイス名全体(例: /dev/sdX または /dev/mmcblkY)が必要です。
例:
Disk /dev/sdb: 14.9 GiB, 16012832768 bytes, 31275064 sectors
Disk model: Card-Reader
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
この例では、SDカードは /dev/sdb として認識されています。以降の手順では、このデバイス名をあなたの環境に合わせて読み替えてください。以降、/dev/sdX と表記しますが、これはあなたの環境のSDカードのデバイス名に置き換える必要があります。
SDカードに既存のパーティションがある場合、それらを削除しておくと混乱を避けることができます。GPartedのようなGUIツールを使うか、fdisk や parted コマンドでパーティションテーブルごとクリアしても良いでしょう。
2. イメージの書き込み(ST公式の方法に準拠)
STM32MPUシリーズは、特定のオフセット(開始位置)にTF-AやU-Bootなどを書き込む必要があります。STMicroelectronicsは、これらのイメージをSDカードに書き込むための専用ツールや手順を提供しています。Buildrootが出力するイメージファイルは、このSTの書き込みツール/手順と連携するように設計されている場合が多いです。
Buildrootは、SDカード全体を書き込むためのシングルイメージファイルを生成するオプションもありますが、STのドキュメントではTF-A, U-Boot, Kernel, DTB, RootFSを個別に書き込む、あるいはSTが提供するスクリプトを使用する方法が推奨されることが多いです。Buildrootのoutput/imagesディレクトリに、SDカード書き込み用のスクリプトや情報が含まれているか確認してください。
ここでは、Buildrootが出力した個別のファイルを dd コマンドを使用して書き込む方法を一般的な例として示します。ただし、これはボードやBuildrootの設定によって正確なオフセットなどが異なる可能性があるため、BuildrootのドキュメントやSTのボード固有ドキュメントを必ず参照してください。 STのボードでは、特定のセクタ(例: 33番セクタや、より大きなオフセット)からブートローダーが配置されることが多いです。
一般的な書き込み手順 (例であり、ボード/Buildroot設定に依存):
まず、SDカード全体をゼロでクリア(推奨、ただし時間かかります)
bash
sudo dd if=/dev/zero of=/dev/sdX bs=1M count=10 # 最初の10MBをクリア
sync # バッファをフラッシュ
次に、TF-AとU-Bootを、STが指定するオフセットに書き込みます。Buildrootが出力するこれらのファイルは、通常、STが提供する署名ツールなどによって、適切な形式に変換されたものが含まれています。
“`bash
例: TF-Aを特定のオフセット(例: 33番セクタ * 512 bytes)に書き込む
オフセットはボードやBuildroot設定による。Buildroot出力ディレクトリのドキュメントを参照!
sudo dd if=output/images/tf-a-stm32mp1*.stm32 of=/dev/sdX bs=512 seek=33 # SEEK値は要確認!
sync
例: U-Bootを特定のオフセットに書き込む (例: 131番セクタ * 512 bytes)
オフセットはボードやBuildroot設定による。Buildroot出力ディレクトリのドキュメントを参照!
sudo dd if=output/images/u-boot.stm32 of=/dev/sdX bs=512 seek=131 # SEEK値は要確認!
sync
“`
オフセットに関する補足: STのSTM32MPUブートローダーは、SDカードの特定のセクタから起動イメージを読み込む仕様になっています。このオフセット(例えば33番セクタや131番セクタ)は、チップのブートROMやTF-Aの設計に依存します。正確なオフセット値は、使用しているBuildrootのバージョン、STのBSP (Board Support Package) ドキュメント、またはBuildrootの出力ディレクトリにある関連ファイル(readme.txtやスクリプトなど)で確認する必要があります。間違ったオフセットに書き込むとボードは起動しません。
3. SDカードのパーティション作成
LinuxカーネルとRoot Filesystemを格納するためのパーティションをSDカード上に作成します。通常、以下の2つのパーティションを作成します。
- ブートパーティション: Linuxカーネルイメージ (
zImage) とデバイスツリーバイナリ (.dtb) を格納します。FATファイルシステム(FAT32)が一般的です。数百MBあれば十分です。 - ルートファイルシステムパーティション: Root Filesystem全体を格納します。ext4ファイルシステムが一般的です。SDカードの残りの容量を割り当てます。
fdisk または parted コマンドを使用します。ここでは parted の例を示します。
bash
sudo parted /dev/sdX # あなたのSDカードデバイス名に置き換え
(parted) mklabel msdos # または gpt (ボードの対応によるが、msdosが多い)
(parted) mkpart primary fat32 1MiB 513MiB # 1MBオフセットから512MBのFAT32パーティション作成
(parted) mkpart primary ext4 513MiB 100% # 513MBオフセットから最後までext4パーティション作成
(parted) print # パーティションテーブルを確認
(parted) quit
注意: 上記のオフセット値 (1MiB, 513MiB) は例です。STのブートローダーが特定のオフセットを使用する場合、パーティションの開始位置がそのオフセットと競合しないように注意が必要です。通常、ブートローダーは最初の数MBに配置されるため、最初のパーティションを例えば4MiBや8MiBといった、ブートローダーの領域より後から開始するのが安全です。STのドキュメントを確認し、推奨されるパーティションレイアウトに従ってください。
パーティションが作成されたら、ファイルシステムを作成します。
bash
sudo mkfs.vfat /dev/sdX1 # 最初のパーティション(例: /dev/sdb1)をFAT32でフォーマット
sudo mkfs.ext4 /dev/sdX2 # 2番目のパーティション(例: /dev/sdb2)をext4でフォーマット
4. Kernel, DTB, Root Filesystem の書き込み
作成したパーティションに、Buildrootが出力したファイル群をコピーします。
まず、パーティションをマウントします。
bash
mkdir -p /mnt/boot /mnt/rootfs
sudo mount /dev/sdX1 /mnt/boot # ブートパーティションをマウント
sudo mount /dev/sdX2 /mnt/rootfs # ルートファイルシステムパーティションをマウント
次に、ファイルをコピーします。
“`bash
ブートパーティションにカーネルとデバイスツリーをコピー
sudo cp ~/buildroot/output/images/zImage /mnt/boot/
sudo cp ~/buildroot/output/images/stm32mp1*.dtb /mnt/boot/
ルートファイルシステムパーティションにrootfsを展開
Buildrootが出力するrootfsイメージの形式による(tar.gz, ext4など)
例1: rootfs.tar.gz の場合
sudo tar -xzf ~/buildroot/output/images/rootfs.tar.gz -C /mnt/rootfs/
例2: rootfs.ext4 (ディスクイメージ) の場合
この場合はmkfs.ext4は不要で、ddで直接書き込む
sudo dd if=~/buildroot/output/images/rootfs.ext4 of=/dev/sdX2 bs=4M
そしてマウントし直す必要がある
sudo umount /mnt/rootfs
sudo mount /dev/sdX2 /mnt/rootfs # 書き込み直したので再度マウント
Buildrootの設定によっては、すでにFAT32/ext4形式のイメージが生成されている場合もあります。
output/images ディレクトリの内容とBuildrootのドキュメントを確認してください。
“`
ファイルをコピー/展開したら、マウントを解除します。
bash
sudo umount /mnt/boot
sudo umount /mnt/rootfs
これでSDカードの準備は完了です。ホストPCからSDカードを取り外します。
STM32MPUボードの起動と確認
作成したSDカードを使って、STM32MPUボードを起動してみましょう。
1. ハードウェアの接続
- SDカードの挿入: 作成したmicroSDカードをSTM32MPUボードのmicroSDカードスロットに挿入します。
- ブートモードの設定: STM32MPUボードには、どのデバイスから起動するかを選択するためのブートモード設定ピンまたはスイッチがあります。SDカードから起動するように設定します。ボードのマニュアルで正確な設定を確認してください(例: BOOT0/BOOT1/BOOT2ピンの設定、ロータリスイッチなど)。STM32MP157F-DK2の場合、通常はBoot Sourceスイッチを「SDCard」に設定します。
- シリアルコンソールの接続:
- ボード上のデバッグ用USBポート(ST-LINKなど)を使用する場合:USB-CケーブルでボードとホストPCを接続します。ホストPC上で仮想COMポートとして認識されます (
/dev/ttyACM0や/dev/ttyUSB0など)。 - USB-TTL変換アダプターを使用する場合:アダプターのRX, TX, GNDピンをボード上の対応するUARTピンに接続します。ボードの供給電圧(3.3V)に合わせたアダプターを使用してください。アダプターをホストPCに接続します。ホストPC上で
/dev/ttyUSB0などとして認識されます。 - ホストPC上で認識されたシリアルポートのデバイス名を確認します(
dmesg | grep ttyなど)。
- ボード上のデバッグ用USBポート(ST-LINKなど)を使用する場合:USB-CケーブルでボードとホストPCを接続します。ホストPC上で仮想COMポートとして認識されます (
-
シリアルターミナルソフトウェアの起動: ホストPCで
minicomまたはscreenを起動し、ボードのシリアルポートに接続します。STM32MPUシリーズの標準的なシリアル通信設定は、115200bps, 8データビット, パリティなし, 1ストップビット (8N1) です。- minicom の場合:
bash
sudo minicom -s # 初回設定。シリアルポート設定でデバイス名と速度(115200 8N1)を設定
設定後、Save setup as dflで保存しておくと次回から-sなしで起動できます。
bash
sudo minicom # 設定済みなら - screen の場合:
bash
sudo screen /dev/ttyACM0 115200 # デバイス名を合わせる
screenを終了するにはCtrl+A,Kと入力します。 - 注意:
/dev/ttyACM0や/dev/ttyUSB0などのデバイスファイルにアクセスするためにsudoが必要になる場合があります。ユーザーをdialoutグループに追加するとsudoなしでアクセスできるようになります (sudo usermod -aG dialout your_username)。変更を反映するには一度ログアウト・ログインが必要です。 - 電源投入: STM32MPUボードにUSB-CケーブルまたはACアダプターで給電します。
- minicom の場合:
2. 起動ログの確認
電源が投入されると、シリアルターミナルにブートプロセスを示すメッセージが表示され始めます。
- ブートROM: 非常に短いメッセージや、全く表示されない場合があります。
- TF-A: TF-Aが起動し、基本的なハードウェア初期化やセキュア処理を行います。メッセージが表示されます。
- U-Boot: TF-AがU-Bootをロード・実行します。U-Bootのバージョン情報、メモリ容量、デバイス初期化などのメッセージが大量に流れます。デフォルト設定の場合、U-Bootは数秒待機し、その後自動的にLinuxカーネルをロードして起動します。待機中にキー(通常はEnterキー)を押すと、U-Bootのプロンプト
=>が表示され、コマンドを入力できます。=> printenv: 環境変数(ブートコマンドなども含まれる)を表示=> boot: Linuxカーネルを起動=> help: 利用可能なコマンド一覧を表示- デバッグや設定変更に非常に便利です。
- Linux Kernel: U-Bootがカーネルをロードし、制御が移ると、Linuxカーネルの起動ログが流れ始めます。
Uncompressing Linux...Booting the kernel.- 様々なデバイスドライバの初期化メッセージ(I2C, SPI, GPIO, Ethernet, USBなど)
- Root Filesystemのマウント処理
- Initシステム(SysVinitまたはsystemd)が起動し、システムサービスを開始
-
ログインプロンプト: 起動処理が成功すると、最終的に以下のようなログインプロンプトが表示されます。
“`
Poky (Yocto Project Reference Distro) x.x stm32mp1 ttySTM0stm32mp1 login:
“`
(Buildrootの場合は “Buildroot” などと表示されます)Buildrootのデフォルト設定では、ユーザー名は
rootで、パスワードは設定されていないことが多いです。そのままEnterキーを押すとログインできます。“`bash
stm32mp1 login: root``#
プロンプトがまたは$` に変われば、無事Linuxが起動し、ログインできたことになります!
もし起動中にエラーが発生したり、特定のメッセージで停止したりする場合は、シリアルコンソールに表示される最後のメッセージが重要なヒントになります。U-Bootで停止する場合はU-Bootの設定やイメージに問題がある可能性、カーネルログ中にエラーが出る場合はカーネル設定、デバイスツリー、またはRoot Filesystemに問題がある可能性が高いです。
Linux上での基本的な操作
ログインに成功したら、Linux上で基本的なコマンドを実行してみましょう。
- ファイルシステムナビゲーション:
ls: 現在のディレクトリの内容を表示cd <directory>: ディレクトリを移動pwd: 現在のディレクトリを表示mkdir <directory>: 新しいディレクトリを作成rm <file>: ファイルを削除cp <source> <destination>: ファイルをコピーmv <source> <destination>: ファイルを移動またはリネーム
- システム情報:
uname -a: システム情報(カーネルバージョンなど)を表示df -h: ディスクの使用状況を表示 (-hは人間が読める形式で)free -h: メモリの使用状況を表示ps aux: 実行中のプロセス一覧を表示top: プロセスのCPU使用率などをリアルタイムで表示(Ctrl+Cで終了)
- ネットワーク:
ifconfigまたはip addr: ネットワークインターフェースの情報(IPアドレスなど)を表示ping <hostname or IP>: ネットワーク接続を確認(Ctrl+Cで終了)udhcpc: DHCPサーバーからIPアドレスを取得(RootFSにudhcpcが含まれている場合)
- その他:
cat <file>: ファイルの内容を表示echo <text>: テキストを表示reboot: システムを再起動poweroff: システムをシャットダウン
これらの基本的なコマンドが実行できれば、Linux環境が正常に動作していると言えます。
アプリケーション開発:クロスコンパイルと実行
組み込みLinux上で独自のアプリケーションを開発するには、通常、ホストPC上でプログラムをコンパイルし(クロスコンパイル)、それをターゲットボードに転送して実行します。
1. クロスコンパイルとは?
ターゲットボード(STM32MPU、ARMアーキテクチャ)上で実行可能なプログラムを、それとは異なるアーキテクチャを持つホストPC(x86/x64アーキテクチャ)上でコンパイルすることです。このために、ターゲットアーキテクチャ向けのコンパイラ、リンカー、ライブラリなどがセットになった クロスコンパイルツールチェイン が必要です。
Buildrootは、ターゲットシステムと一緒にこのクロスコンパイルツールチェインも自動的にビルドしてくれます。ツールチェインは通常、~/buildroot/output/host/bin/ ディレクトリに配置されます。実行ファイル名はターゲットアーキテクチャを示すプレフィックスが付いています(例: arm-linux-gcc, arm-linux-gnueabihf-gcc)。
2. シンプルなアプリケーションの作成
簡単なC言語の「Hello, World!」プログラムを作成します。
“`c
// hello.c
include
int main() {
printf(“Hello, STM32MPU Linux!\n”);
return 0;
}
“`
3. クロスコンパイルの実行
ホストPC上で、先ほど作成した hello.c ファイルを、Buildrootが生成したクロスコンパイラを使ってコンパイルします。
bash
cd ~ # プログラムのあるディレクトリへ移動
~/buildroot/output/host/bin/arm-linux-gnueabihf-gcc hello.c -o hello
~/buildroot/output/host/bin/: Buildrootが生成したツールチェインの実行ファイルがあるディレクトリです。arm-linux-gnueabihf-gcc: クロスコンパイラの実行ファイル名です。正確な名前はBuildrootの設定(ToolchainのABIなど)によって異なる場合があります。ls ~/buildroot/output/host/bin/ | grep gccなどで確認してください。hello.c: コンパイルするソースファイル名です。-o hello: 出力する実行ファイル名をhelloと指定します。
エラーなくコマンドが完了すれば、ターゲットボード上で実行可能な hello という名前のファイルが生成されています。ファイルの種類を確認してみましょう。
bash
file hello
出力は以下のようになるはずです(アーキテクチャ名は異なる場合があります)。
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 4.x.y, BuildID[sha1]=..., stripped
「ARM」向けの実行ファイルであることが確認できます。
4. ターゲットボードへの転送
コンパイルした実行ファイル (hello) を、ホストPCからSTM32MPUボードに転送します。いくつかの方法があります。
- SDカード/USBメモリ: 一番簡単な方法かもしれません。もう一つのSDカードやUSBメモリにファイルをコピーし、それをターゲットボードに挿入してマウントし、ファイルをコピーします。
- SCP (Secure Copy): ターゲットボードがネットワークに接続されていて、SSHサーバー(BuildrootでOpenSSHなどを選択していれば有効)が動作している場合に使用できます。
bash
# ホストPCから実行
scp hello root@<target_ip_address>:/home/root/ # IPアドレスはターゲットボードのものに置き換え - TFTP (Trivial File Transfer Protocol): U-BootやLinuxカーネルがTFTPクライアントをサポートしている場合に使用できます。ホストPC上でTFTPサーバーを起動し、ターゲットボードからファイルを取得します。
- NFS (Network File System): ホストPC上のディレクトリをNFS共有し、ターゲットボードからマウントして直接アクセスする方法です。開発中はこれが非常に効率的です。
ここではSCPを例に説明します。ターゲットボードのIPアドレスを確認してください(Linux上で ip addr show eth0 など)。
“`bash
ホストPCで実行
scp hello [email protected]:/home/root/ # IPアドレスをボードのものに置き換え
“`
パスワードを求められたら入力します(Buildrootデフォルトではrootユーザーはパスワードなし)。
5. ターゲットボード上での実行
ターゲットボードのシリアルコンソール(またはSSHでログインしたターミナル)で、転送した実行ファイルを実行します。
“`bash
ターゲットボード上で実行
cd /home/root/ # ファイルを転送したディレクトリへ移動
ls # ファイルがあるか確認
./hello # 実行!
“`
出力:
Hello, STM32MPU Linux!
このように表示されれば、クロスコンパイルとアプリケーションの実行は成功です。これで、より複雑なアプリケーション開発に進む準備ができました。
発展的なトピック(概要)
ここまでのステップで、STM32MPU上で基本的なLinuxシステムを起動し、簡単なアプリケーションを実行できるようになりました。さらに開発を進める上で重要となる、いくつかの発展的なトピックについて簡単に触れておきます。
- デバイスツリー (Device Tree): ハードウェア(ペリフェラル、GPIO、I2Cデバイスなど)の構成を定義するファイルです。独自のハードウェアをボードに追加した場合、Linuxカーネルがそれを認識できるように、デバイスツリーファイルを修正・コンパイルしてカーネルと一緒にロードする必要があります。
.dtsファイルはテキストエディタで編集し、dtc (device tree compiler)ツールで.dtbバイナリにコンパイルします。Buildrootは、デバイスツリーを自動的にコンパイルする機能を持っています。 - U-Boot コマンド: U-Bootのプロンプトで入力できるコマンドは非常に強力です。ブート遅延時間の変更、ブートコマンドライン引数の設定(カーネルに渡すパラメータ)、ネットワーク設定、TFTP/NFSによるカーネルやRootFSのロード、フラッシュメモリの操作などが可能です。デバッグや開発中に頻繁に利用します。
- Yocto Project: Buildrootよりも複雑ですが、より高い柔軟性と強力なパッケージ管理、ソフトウェアレイヤー機能を提供します。大規模プロジェクトや、特定のディストリビューション(Poky, Debianなど)をベースに構築したい場合に検討する価値があります。学習コストは高いですが、組み込みLinux開発の現場では広く利用されています。
- ハードウェアアクセス (GPIO, I2C, SPIなど): ユーザー空間のアプリケーションからハードウェアにアクセスするには、いくつかの方法があります。
/dev以下に作成されるデバイスファイル(例:/dev/i2c-0,/dev/spidev0.0)。これらのファイルに対する標準的なシステムコール(open,read,write,ioctl)を使用します。/sys/class/gpioを介したGPIO操作(レガシー)やlibgpiodライブラリ。/dev/memを直接操作(非推奨、危険)。- ハードウェアメーカーが提供する専用ライブラリやフレームワーク(例: STのOpenSTLinuxに含まれるドライバやユーザーランドツール)。
- GUI (Graphical User Interface): STM32MPUボードがディスプレイコントローラーやGPUを搭載している場合、Qt, GTK, SDLなどのライブラリと、WaylandやX11といったウィンドウシステムを利用してGUIアプリケーションを実行できます。BuildrootやYoctoでこれらのパッケージを選択・ビルドする必要があります。
- パフォーマンチューニングとデバッグ: システムの起動時間の短縮、メモリ使用量の最適化、プロセスのデバッグ(gdbserverなど)も重要なトピックです。
これらのトピックは、この入門ガイドの範囲を超えますが、STM32MPUとLinuxを使った開発を進める上で必ず直面するものばかりです。必要に応じて、Buildroot/Yoctoの公式ドキュメント、Linuxカーネルのドキュメント、STMicroelectronicsのSTM32MPU関連ドキュメント(OpenSTLinux Distribution Packageなど)を参照しながら学習を進めてください。
トラブルシューティング:よくある問題と解決策
組み込みLinuxの導入は、多くのコンポーネントが連携するため、どこかで問題が発生することが少なくありません。ここでは、特によく遭遇する問題とその解決策をいくつか挙げます。
- Buildrootのビルドエラー:
- ホストPCに必要なパッケージが不足している: エラーメッセージでどのコマンドが見つからない、どのライブラリが見つからないかを確認し、
sudo apt installでインストールします。 - ソースコードのダウンロード失敗: ネットワーク接続を確認するか、プロキシ設定が必要か確認します。再度
makeを実行すると、続きからダウンロードを試みます。 - コンパイルエラー: 複雑な依存関係やパッチ適用失敗などが原因で発生します。エラーメッセージを詳しく読み、関連するパッケージのコンフィグレーションやBuildrootのバージョンと互換性を確認します。場合によっては、そのパッケージを一時的に無効にして先に進めることも検討します。エラーの詳細なログは
output/build/<package_name>/build.logにあることが多いです。 - ディスク容量不足: ビルドプロセスは多くのソースコードや中間ファイルを生成するため、大量のディスク容量が必要です。空き容量を確認してください。
- ホストPCに必要なパッケージが不足している: エラーメッセージでどのコマンドが見つからない、どのライブラリが見つからないかを確認し、
- SDカード書き込みエラー:
- 権限不足:
ddやmkfsコマンドはデバイスファイルに直接アクセスするため、sudoが必要です。 - デバイス名の間違い: これが最も危険です。
fdisk -lやparted -lでSDカードのデバイス名を再確認してください。 - SDカードの物理的な問題: SDカードが壊れている、書き込み禁止スイッチがオンになっているなどの可能性があります。
- 権限不足:
- ボードが起動しない、シリアルコンソールに何も表示されない:
- 電源が入っているか?: 基本ですが確認。
- シリアルケーブルの接続間違い: TXとRXが逆になっていないか、GNDは接続されているか、ボード側のUARTピンを確認します。
- シリアルターミナルの設定間違い: ボーレート、データビット、パリティ、ストップビット (115200 8N1) を確認します。正しいシリアルポートデバイス (
/dev/ttyACM0,/dev/ttyUSB0など) に接続しているか確認します。 - ブートモード設定の間違い: ボードのブートスイッチやピンがSDカード起動に正しく設定されているか、ボードのマニュアルで確認します。
- SDカードが正しく認識されていない: SDカードが奥まで挿入されているか確認します。別のSDカードを試してみるのも良いでしょう。
- U-Bootは起動するがLinuxカーネルが起動しない:
- SDカードのファイル破損: 書き込みが正しく完了しなかった、またはSDカードが物理的に破損している可能性があります。SDカードを再フォーマット・再書き込みしてみます。
- Device Tree の間違い: ロードされたデバイスツリーがボードと一致しない、または不正な内容である可能性があります。U-BootのプロンプトでロードされているカーネルイメージとDTBのファイル名/場所を確認します。
- カーネルイメージまたはRoot Filesystem の問題: ビルドが正しく完了しなかった、またはSDカードへの書き込みが正しく行われなかった可能性があります。
- U-Bootの環境変数設定ミス: U-BootがカーネルやDTBを読み込むファイル名や場所が間違っている可能性があります。U-Bootプロンプトで
printenvコマンドで設定を確認し、必要に応じてsetenvで修正、saveenvで保存します。
- Linuxは起動するが特定のハードウェアが動作しない:
- Device Tree の設定不足または間違い: 該当するペリフェラルがデバイスツリーで有効になっていない、または設定が間違っている可能性が高いです。デバイスツリーソース (
.dts) を確認・修正し、再ビルド・再書き込みが必要です。 - カーネルモジュールがロードされていない: 該当するハードウェアのドライバがカーネルモジュールとしてビルドされている場合、
lsmodでロードされているか確認し、ロードされていなければmodprobe <module_name>で手動ロードを試みます。自動でロードされるには設定が必要です。 - ユーザー権限の問題:
/devのデバイスファイルへのアクセス権限が不足している場合があります。rootユーザーで試すか、ユーザーを適切なグループ (dialout,i2c,spiなど) に追加します。 - ハードウェアの物理的な問題: 配線ミス、部品の故障なども考えられます。
- Device Tree の設定不足または間違い: 該当するペリフェラルがデバイスツリーで有効になっていない、または設定が間違っている可能性が高いです。デバイスツリーソース (
- ログインできない、パスワードが分からない: Buildrootのデフォルト設定ではrootユーザーはパスワードなしです。もしパスワードを設定した覚えがないのに求められる場合は、システム設定を確認してください。あるいはBuildrootを再設定・再ビルドしてパスワードを設定しない、または既知のパスワードを設定し直します。
問題発生時には、シリアルコンソールの出力メッセージ、Buildrootのビルドログ、Linuxカーネルの起動ログ(dmesg コマンドで後から確認可能)を丹念に調べることが解決への近道です。また、インターネット検索で同様の事例を探す際には、「STM32MP1 (あなたのボード名) Linux (エラーメッセージの一部)」といったキーワードで検索すると有効な情報が見つかりやすいでしょう。
次のステップ
ここまでで、STM32MPU上でLinuxを動かすための基本的な流れを習得しました。これは組み込みLinux開発のほんの始まりです。ここから、さらに深く掘り下げていくための「次のステップ」のアイデアをいくつか紹介します。
- 必要なソフトウェアパッケージの追加: Buildrootの
make menuconfigで、開発に必要なライブラリ(例えば、特定のセンサーやアクチュエーターを制御するためのライブラリ)、プログラミング言語のインタプリタ/コンパイラ、ネットワークサービス(Webサーバー、MQTTクライアントなど)、GUIライブラリなどをRoot Filesystemに追加して再ビルドしてみましょう。 - ハードウェアペリフェラルの利用: ボード上のGPIOピンを制御したり、I2CやSPIデバイスと通信したりするアプリケーションを開発してみましょう。Linuxの標準的な
/devインターフェースやlibgpiodなどのライブラリの使い方を学びます。デバイスツリーの理解が深まります。 - デバイスツリーの編集: ボードに新しいセンサーやLEDなどを接続し、それがLinuxカーネルに認識されるようにデバイスツリーを修正・追加してみましょう。
- 独自のLinuxカーネルモジュールの開発: 特定のハードウェアのドライバや、特殊な処理を行うためのカーネルモジュールをC言語で開発し、カーネルに組み込んだり、起動後に動的にロードしたりする方法を学びます。
- リアルタイム処理の検討: 厳密なリアルタイム性が求められるアプリケーションのために、PREEMPT_RTパッチを適用したLinuxカーネルをビルドしたり、LinuxとCortex-M側のRTOS(例えばFreeRTOS)との連携方法(OpenAMPなど)を検討したりします。
- Yocto Project の学習: Buildrootよりも柔軟で大規模な開発に適したYocto Projectに挑戦してみましょう。レイヤー構造、レシピ、BitBakeといったYocto独自の概念を理解する必要があります。
- ネットワークアプリケーションの開発: ネットワーク機能を活用したアプリケーション(センサーデータをクラウドに送信、別のデバイスからの制御など)を開発してみましょう。標準的なソケットプログラミングや、MQTT、HTTPなどのプロトコルライブラリを利用します。
- GUIアプリケーションの開発: ディスプレイ付きのボードを使用している場合、Qt for Embedded Linuxなどのフレームワークを使ってリッチなGUIアプリケーションを開発してみましょう。
- デバッグ手法の習得: ホストPCからターゲットボード上のアプリケーションをリモートデバッグする (
gdbserverを使う方法など) 手法を習得すると、開発効率が飛躍的に向上します。
組み込みLinux開発は、ハードウェア、カーネル、ユーザー空間アプリケーション、ビルドシステム、ネットワークなど、幅広い知識が要求される分野ですが、その分非常に強力で柔軟なシステムを構築できます。このガイドが、あなたの組み込みLinux開発への第一歩となることを願っています。
まとめ
このガイドでは、STM32MPUボード上でLinuxを動作させるための、はじめの一歩として、以下の内容を詳細に解説しました。
- STM32MPUと組み込みLinuxの概要、利点と課題
- 導入に必要なハードウェアとソフトウェアの準備
- 組み込みLinuxを構成する主要コンポーネント(ブートROM, TF-A, U-Boot, Kernel, Device Tree, Root Filesystem)の役割
- Buildrootを使用したクロスコンパイル環境の構築、設定、ビルド手順
- ビルドされたイメージファイルのSDカードへの書き込み方法(パーティション作成含む)
- STM32MPUボードの起動、シリアルコンソールを使ったログの確認、Linuxログイン
- 基本的なLinuxコマンド操作
- ホストPCでのクロスコンパイルによるアプリケーション開発と、ターゲットボードへの転送・実行方法
- 今後の学習のための発展的なトピック
- 導入時によく発生する問題とそのトラブルシューティング方法
組み込みLinux開発は学ぶことが多岐にわたりますが、一度基本的な流れを掴めば、その強力なツールと広範なエコシステムを活用して、複雑な機能を比較的容易に実装できるようになります。このガイドが、あなたのSTM32MPUと組み込みLinuxを使ったプロジェクト開発の成功に繋がることを心から願っています。
頑張ってください!