🥾

Arduino UNO R4 Minima用のブートローダーをビルドする

に公開

はじめに

Arduino UNO R4 Minima 用のブートローダー (スケッチの起動や書き換えを行うプログラム) のビルド手順は、Arduino のリポジトリで公開されています。

https://github.com/arduino/ArduinoCore-renesas/tree/1.3.1/bootloaders/UNO_R4

本記事は、この手順を参考に Minima 用のブートローダーをビルドして動作確認を行ったときのメモです。

必要なもの

  • Arduino UNO R4 Minima
  • PC (Arduino IDEがインストール済み)

https://www.arduino.cc/en/software

準備

Dockerのインストール

環境依存を減らすため、ビルド環境は Docker コンテナ上に構築しました。Docker 環境は、Windows 10 の PC に Docker Desktop をインストールして導入しました。

https://www.docker.com/ja-jp/

インストールした 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 を使用します。このツールによるブートローダーの書き込み手順はこちらの方の記事に詳しく書かれています。

https://zenn.dev/ichirowo/articles/6aa1614e102bce

Minima の場合、記事中の P201/MD(26)ピンはピンソケット番号1(NC)につながっています。シルクで BOOT と書かれているピンソケットです。

https://docs.arduino.cc/resources/schematics/ABX00080-schematics.pdf

下図のように 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]

脚注
  1. arduino-renesas-bootloader では、tinyusb の USB デバイス機能を初期化するために tud_init 関数を使用しています。しかし、この関数に代わる新しい API が作成されており、現状ではその新しい API を使用しないと、USB の割り込み処理を適切にハンドルできないようです。 ↩︎

  2. Arduino "Arduino® UNO R4 Minima Product Reference Manual SKU: ABX00080", p.17, "12.5 Board Recovery" ↩︎

Discussion