Arduino UNO R4 Minima用のブートローダーをビルドする
はじめに
Arduino UNO R4 Minima 用のブートローダー (スケッチの起動や書き換えを行うプログラム) のビルド手順は、Arduino のリポジトリで公開されています。
本記事は、この手順を参考に Minima 用のブートローダーをビルドして動作確認を行ったときのメモです。
必要なもの
- Arduino UNO R4 Minima
- PC (Arduino IDEがインストール済み)
準備
Dockerのインストール
環境依存を減らすため、ビルド環境は Docker コンテナ上に構築しました。Docker 環境は、Windows 10 の PC に Docker Desktop をインストールして導入しました。
インストールした Docker Desktop のバージョンは 4.36.0 (175267) でした。
コンテナの起動
次に、コンテナを起動します。まず Documents フォルダ等に arduino_r4_env フォルダを作ります。そして、このディレクトリ内に以下の内容で docker-compose.yml ファイルを作成します。
services:
ubuntu:
image: ubuntu:latest
container_name: ubuntu-1
tty: true
volumes:
- ./share:/var/uno_r4/share
イメージとして ubuntu:latest を指定しました。また、volumes で指定した share フォルダは、コンテナ内でビルドしたファームウェアをホスト側に受け渡すために使用します。
次に、 PowerShell またはコマンドプロンプトを開き、arduino_r4_env フォルダに移動して、下記コマンドを実行します。
docker compose up -d
このコマンドにより、Docker Hub から ubuntu:latest イメージが自動的に取得され、コンテナが作成・起動されます。なお、私がこのコマンドを実行したときの ubuntu:atest イメージは、MANIFEST DIGEST が sha256:6e75a10070b0fcb0bead763c5118a369bc7cc30dfc1b0749c491bbb21f15c3c7
でした。
ツールのインストール
次にコンテナ内にビルド環境を整えます。はじめに下記コマンドを実行してコンテナ内に入ります。
docker exec -it ubuntu-1 bash
コンテナに入ったら、以下のコマンドを実行してパッケージリストを更新し、インストール済みのパッケージをアップグレードします。
apt update
apt upgrade
次に下記コマンドを実行してビルドに必要なツールをインストールします。
apt install git gcc-arm-none-eabi make python3
これでビルド環境の準備は完了です。なお、gcc-arm-none-eabi パッケージ情報は下記のとおりでした。
$ dpkg -l | grep gcc-arm-none-eabi
ii gcc-arm-none-eabi 15:13.2.rel1-2 amd64 GCC cross compiler for ARM Cortex-R/M processors
ブートローダーのビルド
ここからブートローダーのビルドに移ります。まず下記のようにビルド用の作業ディレクトリを作成します。
mkdir ~/arduino-r4-bootloader
cd ~/arduino-r4-bootloader
次に、Arduino のリポジトリにある README.md に記載された手順で、ブートローダーをビルドします。以下のコマンドで2つのリポジトリをクローンします。
git clone https://github.com/arduino/arduino-renesas-bootloader
git clone https://github.com/hathach/tinyusb
ただし、tinyusb の現時点のソースコード (コミットハッシュ: 8eeddaab364e413153ebd0a8302f85dfb2e60e9f
) でビルドしたブートローダーでは、Minima を USB デバイスとして認識しませんでした。そのため、ここでは最新版である 0.17.0 を使用します[1]。
下記コマンドにより tinyusb を0.17.0にチェックアウトします。
cd ~/arduino-r4-bootloader/tinyusb
git checkout 0.17.0
arduino-renesas-bootloaderの方は現時点での最新版を使用します(コミットハッシュ値8898c7b7db3ac0ec86f4b69688df45de71bf007f
)。
残りのビルド手順を実行します。
cd ~/arduino-r4-bootloader/tinyusb
patch -p1 < ../arduino-renesas-bootloader/0001-fix-arduino-bootloaders.patch
python3 tools/get_deps.py ra
cd ../arduino-renesas-bootloader/
TINYUSB_ROOT=$PWD/../tinyusb make -f Makefile.minima
ビルドに成功すると、ビルド生成物が_build/uno_r4/
に作成されると思います。
$ ls -l ./_build/uno_r4/
total 656
-rwxr-xr-x 1 root root 13348 Dec 14 11:15 arduino-renesas-bootloader.bin
-rwxr-xr-x 1 root root 466640 Dec 14 11:15 arduino-renesas-bootloader.elf
-rw-r--r-- 1 root root 142340 Dec 14 11:15 arduino-renesas-bootloader.elf.map
-rw-r--r-- 1 root root 37684 Dec 14 11:15 arduino-renesas-bootloader.hex
なお、今回作成した hex ファイルは、Arduino のリポジトリに保存されている dfu_minima.hex とは中身が異なる点にご注意ください。(外から見た機能としての違いはあまりないかと思います。)
ブートローダーの書き込み
ブートローダーのファームウェアができたので、Arduino UNO R4 Minima に書き込みます。
まず、作成した hex ファイルをホストとの共有ディレクトリ/var/uno_r4/share/
にコピーします。
cp _build/uno_r4/arduino-renesas-bootloader.hex /var/uno_r4/share/
ホスト側の share フォルダ内に arduino-renesas-bootloader.hex が確認できると思います。
このファイルの内容を、書き込みツールで Arduino UNO R4 Minima の内蔵フラッシュに書き込みます。書き込みツールは Renesas Flash Programmer を使用します。このツールによるブートローダーの書き込み手順はこちらの方の記事に詳しく書かれています。
Minima の場合、記事中の P201/MD(26)ピンはピンソケット番号1(NC)につながっています。シルクで BOOT と書かれているピンソケットです。
下図のように BOOT と GND をジャンパー線で短絡させて USB ケーブルで PC と接続します。この状態でリセットボタンを押すと内蔵フラッシュへの書き込みモードになり、Renesas Flash Programmerで書き込みができます。
書き込むプログラムは share フォルダに保存した arduino-renesas-bootloader.hex を指定します。ツールでの書き込みに成功した後は、USB ケーブルを抜き、BOOT ピンと GND を切り離します。そして、再度 USB ケーブルを PC に接続します。今回のファームウェアでは以下のように UNO R4 Minima DFU という名前で表示されました。
アプリケーション (スケッチ) の書き込み
最後に書き込んだブートローダーによって Arduino スケッチを書き込みます。Arduino IDE を起動してスケッチ例の Blink を開きます。
Arduino IDE のボード選択にArduino UNO R4 Minima 1-3
と表示されると思いますので、これを選択して書き込みを実行します。
書き込みが完了すると、 LED が点滅すると思います。この状態から Reset ボタンを押しても Blink が起動されれば成功です。また、Reset ボタンを素早く二回押すとブートローダーモードに遷移すると思います[2]。
Discussion