ファームウェアをビルドする

アットマークテクノ社から販売されているArmadillo-900は、超小型・省電力のCPUモジュールです。NXP社のi.MX 8ULPプロセッサを搭載し、IoTゲートウェイをはじめ、さまざまな分野での組込み製品の開発に応用できます。

i.MX 8ULPはLinuxが動作するArm® Cortex®-A35(2個)と、リアルタイム処理のCortex-M33のヘテロジニアスマルチコア構成となっていますが、本稿ではCortex-M33でのFreeRTOSアプリケーション開発について見ていきましょう。

機材と環境

Armadillo-900には開発セットが用意されていますので、この開発ボードを使用して話を進めていきます。

Armadillo-900開発ボード

以下に今回使用した機材とソフトウェアを列挙します。

  • ボード: Armadillo-900開発セット
  • 仮想環境: VirtualBox
  • 開発環境: ATDE9
  • ターミナルソフト: TeraTerm
  • デバッガ: PALMiCE4 ARM64

開発環境としてアットマークテクノ社から提供されているATDEを使用します。ATDEはVirtualBoxで 動作するイメージファイルで提供されており、Armadillo-900の開発に必要な設定が完了した状態ですので、すぐに動作確認を行うことができます。そのほか、Linuxの動作確認用にTeraTermをコンソール出力用に使用します。また、最終的なリアルタイム処理の動作確認にJTAG-ICEのPALMiCE4を使用します。

ATDEのセットアップ

Armadillo-900のマニュアルに記載されている通り、ATDEのイメージファイルをArmadilloサイトからダウンロードします。現時点(2025年7月)のファイル名は「atde9-amd64-20250528.ova」となっていました。仮想環境のイメージファイルですので3.6GBと少し大きめです。このファイルをVirtualBoxにインポートすれば、ATDEのセットアップは完了です。
あとはVirtualBoxマネージャーからATDEを起動します。

この後のCortex-M33ファームウェアのビルドなどはATDE上で行います。

ビルドツールの準備

Cortex-M33のファームウェアは、ブートローダのビルド手順で作成されます。ATDE にあらかじめ用意されているファームウェアはリリース版なので、デバッガで扱えるようデバッグ版を再構築します。ファームウェアをビルドするためにgcc-armとその他ツール等を使用しますが、初期状態のATDEにはインストールされていませんのでインストールします。ATDEでコンソール端末を開いて以下のコマンドを実行します(緑色の文字が入力文字です)。

atmark@atde9:~$ sudo apt install build-essential git wget crossbuild-essential-arm64 bison flex zlib1g-dev python3-pycryptodome python3-pyelftools python3-cryptography device-tree-compiler
[sudo] atmark のパスワード: *****
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
bison はすでに最新バージョン (2:3.7.5+dfsg-1) です。
 :(省略)
python3-cryptography (3.3.2-1+deb11u1) を設定しています ...
Scanning processes...                                                           
Scanning linux images...                                                        
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.

続いてgcc-armをインストールします。

atmark@atde9:~$ sudo apt install gcc-arm-none-eabi
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
以下の追加パッケージがインストールされます:
  binutils-arm-none-eabi libnewlib-arm-none-eabi libnewlib-dev
  libstdc++-arm-none-eabi-newlib
 :(省略)
libstdc++-arm-none-eabi-newlib (15:8-2019-q3-1+13) を設定しています ...
man-db (2.9.4-2) のトリガを処理しています ...
libc-bin (2.31-13+deb11u12) のトリガを処理しています ...
Scanning processes...                                                           
Scanning linux images...                                                        
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.

このシステムはgcc-armがインストールされることで、ファームウェアが自動的にビルドされる仕組みになっています。

最新ファームウェアソースの取得

次はソースコードを更新します。ATDEにパッケージされているソースコードは若干古めかもしれませんので、アットマークテクノ社の公式ウェブサイトとGitHubから最新ソースを取得します。まずブートローダーをwgetコマンドでダウンロードしてtarコマンドで展開します。 ブートローダーのファイル名はバージョンによって変化しますので、ダウンロードサイトを確認してください。

atmark@atde9:~$ wget https://download.atmark-techno.com/armadillo-900/bootloader/imx-boot-2023.04-at5.tar.zst
--2025-08-08 11:22:09--  https://download.atmark-techno.com/armadillo-900/bootloader/imx-boot-2023.04-at5.tar.zst
download.atmark-techno.com (download.atmark-techno.com) をDNSに問いあわせています... 18.178.129.128, 54.64.102.35, 18.181.73.254
download.atmark-techno.com (download.atmark-techno.com)|18.178.129.128|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 46293849 (44M) [application/zstd]
`imx-boot-2023.04-at5.tar.zst.1' に保存中

imx-boot-2023.04-at 100%[===================>]  44.15M  11.1MB/s 時間 4.1s     

2025-08-08 11:22:14 (10.7 MB/s) - `imx-boot-2023.04-at5.tar.zst.1' へ保存完了 [46293849/46293849]
atmark@atde9:~$ tar xf imx-boot-2023.04-at5.tar.zst
atmark@atde9:~$ cd imx-boot-2023.04-at5

次にCortex-M33のファームウェアをダウンロードします。現在のソースは削除して、最新ソースと完全に置き換えます。

atmark@atde9:~/imx-boot-2023.04-at5$ rm -rf m33_firmware_at
atmark@atde9:~/imx-boot-2023.04-at5$ git clone https://github.com/atmark-techno/m33-firmware-at m33_firmware_at
Cloning into 'm33_firmware_at'...
remote: Enumerating objects: 1679, done.
remote: Counting objects: 100% (1679/1679), done.
remote: Compressing objects: 100% (653/653), done.
remote: Total 1679 (delta 1119), reused 1550 (delta 990), pack-reused 0 (from 0)
Receiving objects: 100% (1679/1679), 601.55 KiB | 6.83 MiB/s, done.
Resolving deltas: 100% (1119/1119), done.

ソースの取得が完了したので、続いてヘッダファイルを一つ変更します。これはCortex-M33をデバッガで停止させると、ウォッチドッグタイマによりArmadillo-900がシステムリセットされるのを禁止するための変更です。./m33_firmware_at/main.hを開いて、以下の定義を有効にします。

/* disable watchdog timer to avoid accidental reset during debug */
#define DEBUG_DISABLE_WDOG 1

ファームウェアのビルド

次にbuildシェルを実行してビルドターゲットをデバッグ版に切り替えて、makeを実行します。何かエラーっぽいものが表示されますが、そのまま進みます。

atmark@atde9:~/imx-boot-2023.04-at5$ ./m33_firmware_at/armgcc/build.sh debug
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.
 :(省略)

makeを実行してファームウェアをビルドします。

atmark@atde9:~/imx-boot-2023.04-at5$ make imx-boot_armadillo-900
! [ -e .git ] || git submodule update -i --recursive
# cannot use -C because it outputs file in WD which can be yet
# another directory if called with make -C externally
cd imx-mkimage & make
make[1]: ディレクトリ '/home/atmark/imx-boot-2023.04-at5/imx-mkimage' に入ります
Compiling mkimage_imx8
gcc -g -O2 -Wall -std=c99 -static src/imx8qxb0.c src/mkimage_imx8.c -o /home/atmark/imx-boot-2023.04-at5/imx-mkimage/mkimage_imx8 -I src
 :(省略)
3172352 bytes (3.2 MB, 3.0 MiB) copied, 0.0118537 s, 268 MB/s
make[1]: ディレクトリ '/home/atmark/imx-boot-2023.04-at5/imx-mkimage/armadillo-900' から出ます
cp imx-mkimage/armadillo-900/flash.bin imx-boot_armadillo-900

ビルドが成功すれば、m33_firmware_at/armgcc/debugに以下のファイルが作成されます。

atmark@atde9:~/imx-boot-2023.04-at5$ ls -l m33_firmware_at/armgcc/debug/
合計 2012
-rwxr-xr-x 1 atmark atmark  215796  8月 12 12:01 m33-firmware-at.bin
-rwxr-xr-x 1 atmark atmark 1852456  8月 12 12:01 m33-firmware-at.elf

ファームウェアをイメージファイルへ変換

最後にファームウェアのファイルをイメージファイルに変換して終了です。mkswuを実行する前に、アットマークテクノ社のマニュアル通り、VS Codeのメニューより「Generate Initial Setup Swu」を実行し、証明書等の初期設定を行う必要があります。

atmark@atde9:~/imx-boot-2023.04-at5$ echo 'swdesc_boot --version boot 2023.4-at.5.1 imx-boot_armadillo-900' < boot.desc
atmark@atde9:~/imx-boot-2023.04-at5$ mkswu boot.desc
Enter pass phrase for /home/atmark/mkswu/swupdate.key:
boot.swu を作成しました。
atmark@atde9:~/imx-boot-2023.04-at5$ ls -l boot.swu
-rw-r--r-- 1 atmark atmark 1011200  8月 12 14:15 boot.swu

boot.descを作る際にバージョンの指定が新しくないと次のステップのswuのインストールに失敗しますので注意が必要です。

ファームウェアのインストール

ここまででboot.swuというブートイメージファイルが作成されました。今度はこのファイルをArmadillo-900に転送します。Armadillo-900の開発ボードにLANとコンソール(USB Type-C)とACアダプタを接続し、電源をONにします。

Armadillo-900開発ボード接続

コンソールとして、パソコン上でTeraTermを起動しておきます。

Linuxコンソール

Linuxが起動するまで待ちます。起動したら、ATDEでブラウザ(FireFox)を起動します。FireFoxのアドレスバーに「https://armadillo.local:58080」を入力します。セキュリティの警告が表示されますが、無視して進みます。

ABOS webログイン

そうするとArmadillo Base OSのログイン画面(初回設定の場合はパスワードの設定画面)が表示されます。ログインするとメニュー画面が表示されます。

ABOS webメニュー

SWUインストールをクリックして、boot.swuをインストールします。initial_setup.swuのインストールがまだの場合は、画面の指示に従って先にインストールします。

SWUのインストール

インストールに成功すると以下の画面が表示され、Armadillo-900が新しいファームウェアで再起動します。

SWUのインストール完了

以上がファームウェアの更新手順です。Cortex-M33のソースを変更した場合は、セキュリティ上、若干面倒ですがこの手順でファームウェアを書き換える必要があります。

次回はデバッガを接続して、書き込んだファームウェアの動作確認を行います。