2024/04/24「多機能ファイラーAs/Rの魅力と活用法」を出版、KView32公開

esptoolでESP32にファームウェアを書き込む

ESP32

ESP32(M5Stack)のファームウェアは、ArduinoやPlatformIOといった開発環境からファームを書き込む事ができます。

量産時に、一々開発環境から書き込むのは効率が悪いですね。開発元のEspressif から、ファームの書込用のツールが提供されています。

そのツール(esptool.py や、esptool.exe)を使用して、ESP32にファームウェアを書き込む事ができます。その使用方法について説明します。

PlatfoemIOでのファームウェアの書込

PlatfoemIOで実際にファームウェアがどのように書き込まれているか、M5Stack-C Plus用のプロジェクトを作成し確認してみました。

パーテーションファイル

パーテーションファイルとして、 default.csvを使用しました。その の中身は、以下となります。メモリサイズは、4Mバイトです。

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
spiffs,   data, spiffs,  0x290000,0x160000,
coredump, data, coredump,0x3F0000,0x10000,

パーテーションファイルの詳細につきましては、以下の記事を参照ください。

ファームの書込内容の確認

PlatfoemIOのログを確認すると以下の4つのアドレスに対して書込を行っています。

  • 0x00001000
  • 0x00008000
  • 0x0000e000
  • 0x00010000

この中で、パーテーションファイル default.csv からアドレスを確認すると、otaadataとapp0に書き込んでいることが判ります。残りの2つは何でしょうか?

  1. 0x0000e000 otadata
  2. 0x00010000 app0

プロジェクトのバイナリファイル

今回使用した PlatformIO の **プロジェクト名**\.pio\build\m5stick-c\ 以下に、コンパイルしたオブジェクトファイルなどが保存されています。 その中に、以下の3つのバイナリファイルが作成されています。 (プロジェクトの環境によってフォルダ名が異なる場合がありますので、読み替えてください。)

  • bootloader.bin ブートロード用のバイナリ
  • partitions.bin パーテーション用のバイナリ
  • firmware.bin アプリケーション用のバイナリ(ファームウェア)

です。そのバイナリのサイズと、PlatformIO のログで書き込まれているファイルのサイズから

  • 0x00001000 bootloader.bin ブートロード用のバイナリ
  • 0x00008000 partitions.bin パーテーション用のバイナリ
  • 0x00010000 firmware.bin アプリケーション用のバイナリ(ファームウェア)

であることが判ります。

0x0000e000 に書き込んでいるデータ

残りの、0x0000e000 ですが、色々と確認したところ、ESP32のarduinoライブラリの

arduino-esp32/tools/partitions にある boot_app0.bin を書き込んでいるようです。

実際にインストールされているライブラリに関しては、「ライブラリの場所」の記事を確認ください。

PlatformIOの開発環境でのライブラリの場所
PlatformIOの開発環境では、ライブラリのソースやヘッダを確認したい時があります。 通常、Windows環境ではユーザー名配下のフォルダにライブラリがインストールされます。


書き込んでいるデータのまとめ

PlatformIOでは、以下の4つのデータを書き込んでいます。

書込アドレスサイズパーテーションファイル
0x0000100017488 bytesbootloader.bin
0x000080003072 bytespartitions.bin
0x0000e0008192 bytesotadataboot_app0.bin
0x000100001102656 bytesapp0firmware.bin

※ ファームを書き込んでいるアドレス、データは、arduinoのログでも確認出来ます。

ファームのアップデート時

ファームのアップデート時は、firmware.bin(app0)以外のデータに変更点はないので、firmware.bin(app0)のみ書き込めば良いということになります。

ブランク品への書込

ブランク品や、パーテーションファイル等を変更した場合は、上記の4つのエリアに書き込む必要があります。

esptool.exeについて

開発元のEspressif から提供されてる、ファームの書込用のツール(esptool.exe )の使い方について説明します。

espressif/esptool に、Windows, Linux, MacOS 用の esptool.exe が公開されています。

esptool.exeを使用した書込

ファームの書き込み時、以下のオプションを使用します。

–chip

書き込むChip Typeを指定します。

--chip esp32

–port

書き込むCOMポート番号を指定します。

--port COM5

–baud

書き込む通信スピードを指定します。

--baud 512000
--baud 921600
--baud 1500000

–before default_reset

書き込む前にリセットします。

–after hard_reset

書き込み後リセットします。

write_flash

フラッシュの書込を行う指示です。

–flash_mode

Flashのモードの指示です。PlatformIOでは、指定しない場合は、dio となるようです。

--flash_mode qio
--flash_mode qout
--flash_mode dio
--flash_mode dout
OptionMode NamePins UsedSpeed (ESP device)
qioQuad I/O4 pins used for address & dataFastest.
qoutQuad Output4 pins used for data.Approx 15% slower than qio.
dioDual I/O2 pins used for address & dataApprox 45% slower than qio.
doutDual Output2 pins used for data.Approx 50% slower than qio.

–flash_freq 40m

Flashのクロックの周波数を設定します。デフォルト値は、40MHzです。

qio + 80MHz で動作しない個体があるようなので注意してください。

--flash_freq 40m
--flash_freq 80m

–flash_size detect

–flash_size は、フラッシュのサイズを指定します。通常は、–flash_size detectで良いと思います。

パラメーターは、keep, detect, 256KB, 512KB, 1MB, 2MB, 4MB, 2MB-c1, 4MB-c1, 8MB, 16MBが使用出来ます。

--flash_size detect

adress file

書き込む、アドレスとバイナリファイルを指定します。

記述例は、以下を参照ください。

esptool.exe 
--chip esp32 
--port COM5 
--baud 512000 
--before default_reset 
--after hard_reset 
write_flash 
--flash_mode dio 
--flash_freq 40m 
--flash_size detect 
0xe000 "boot_app0.bin" 
0x1000 "bootloader.bin" 
0x00010000 "firmware.bin" 
0x00008000 "partitions.bin" 
0x00290000 "spiffs.bin"

ブートファイル

参考までに、ESP32のArduino用のライブラリの中に、ブートローダーのファイルが提供されています。

以前は、*.binファイルでしたが、最新版では、*.elfファイルで提供されています。

ファイル名flash_modeflash_freq
bootloader_dio_40m.elfdio40MHz
bootloader_dio_80m.elfdio80MHz
bootloader_dout_40m.elfdout40MHz
bootloader_dout_80m.elfdout80MHz
bootloader_qio_40m.elfqio40MHz
bootloader_qio_80m.elfqio80MHz
bootloader_qout_40m.elfqout40MHz
bootloader_qout_80m.elfqout80MHz

実際に、保存されている場所は以下の場所となります。

PlatformIO

C:\Users\"User Name"\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\bin\

Arduino

C:\Users\"User Name"\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\tools\sdk\esp32\bin\

elfファイルをbinファイルに変換する

esptool.exeを使用して、elfファイルをbinファイルに変換することが出来ます。

書式は、以下となります。

esptool.exe --chip ESP32 elf2image ”ファイル名”

例:
esptool.exe --chip ESP32 elf2image bootloader_dio_40m.elf

spiffsデータの書込

spiffs(ファイルシステム)を使用している時、このファイルシステムのデータをバイナリデータに変換し、esptool.exe を使用して書き込む事が出来ます。

書き込む手順は、以下となります。

  1. spiffsデータのイメージファイルの作成
  2. esptool.exe で書き込む

spiffsデータのイメージファイルの作成

PlatformIOのプロジェクトのフォルダに data フォルダを作成し、そのフォルダ内に、spiffsにアップロードしたいファイルを保存します。

その保存したファイルをPlatromIOのメニュー「Build Filesystem Image」で、イメージファイル(バイナリ)を作成します。

上述したプロジェクトのバイナリファイルファイルと同じフォルダに、「spiffs.bin」が出力されます。

esptool.exeで書き込む

作成したバイナリデータ(spiffs.bin)は、他のバイナリデータと同じように、esptool.exeを使用して書き込む事が出来ます。アドレスは、パーテーションファイルで指定したアドレスを設定します。

PlatformIOでアップロードする

PlatformIOでのアップロードは、バイナリデータを作成する必要はなく、メニュー「Upload Filesystem Image」から行えます。

ログで、書込先のアドレスや書込サイズを確認することができます。

参考URL

以下のURLも参考にしてください。

タイトルとURLをコピーしました