2018年1月27日土曜日

Arm 系の bootloader の開発 (ArmBootloader)

マイコンを使用する際、開発した program をどの様に update するかは問題です.
通常 JTAG や SWD などで udpate する場合が多いですが、製品化する場合それらをいつもでも使う事ができるわけではありません.そこで、bootloader を作成し、マイコンの power on reset で bootloader を実行する様にし, 開発した firmware が存在する場合 firmware を実行し、無いもしくは壊れている、または update mode の場合は bootloader に留まり外部からの firmware update 処理を行なえる様にする. もちろん bootloader 自分自身も update が行なえる方が良い.

以前は、チップ購入もしくは実装状態では、blank 状態が多く、書き込み納入してもらうか上記の様に JTAG や SWD などで書き込まなければならず firmware update の機構とは別の方法で update する必要があり煩雑であった. しかし最近はマイコンでチップ内 mask rom に bootloader の入った物が多くなってきた. この bootloader はなんらかの update protocol を持っており、この protocol をそのまま今回作成する bootloader に使用する事で、update 方法の違いによる煩雑さをなくす事ができる.

今回作成する bootloader の仕様は以下の通り

1.  ARM 系の chip を対象
2.  STM, Kinetis, LPC の update を基本とする
3.  update protocol は、mask rom の update protocol と同じにする
         (mask rom bootloader が無い場合は同種チップの update protocol を使用する)
4.  update する側の PC もしくは ホスト cpu の program は単一 program にする
         (上記 2で示すマイコンの protocol をすべて対応する)
5.  伝送路は UART を基本とし、USB, I2C, SPI は必要になった時に適宜サポートする
6.  bootloader その他用途の size は最大32kB とする (0x00007fff まで)
         以下の map が考えられる
         6-1  2kB: 1st bootloader, 28kB: 2nd bootloader, 2kB: configuration data
         6-2  2kB: 1st bootloader, 14kB x 2: 2nd bootloader, 2kB: configuration data
         6-3  2kB: 1st bootloader, 30kB: 2nd bootloader
         まずは 6-1 を想定する
7.  firmwre は 0x00008000 から配置
         firmware は、0x00000000 からではなく 0x00008000 から配置
8.  対象 compiler:  GCC, IAR (KEIL は未定)
         GCC は、gcc 標準の library は使用しない様にする
9.   ライセンスは MIT license


2018/06/28追記
STM系で USB CDC による UART update 方法を追加
USBでの update は, DFU であるが、細かな書き込み制御ができなさそうなのと DFU の実装が面倒だったので USB CDC の stream を UART update の処理部に突っこんだだけ