Maixduinoでマルチブートする①


はじめに

Sipeed MaixduinoなどのK210用にloborisがブートローダーKbootを公開しているので使ってみます。

Kbootについて

Kbootのブートプロセス

Kbootのブートプロセスは下図のようになっています。

  1. stage #0
    ブートROMのコードにより、stage #0のコードがフラッシュメモリからRAMの先頭に読み込まれる

  2. stage #1
    Kbootのstage #0のコードにより、stage #1のコードがフラッシュメモリからRAMの上位に読み込まれる

  3. stage #2
    Kbootのstage #1のコードにより、ブート構成(インデックス)を検索し、アクティブなアプリのコードがフラッシュメモリからRAMの先頭に読み込まれて、アプリを実行する

ブート構成(インデックス)

開始 終了 長さ 内容
0x000 01F 32 アプリケーションエントリー #0
0x020 03F 32 アプリケーションエントリー #1
0x040 05F 32 アプリケーションエントリー #2
0x060 07F 32 アプリケーションエントリー #3
0x080 09F 32 アプリケーションエントリー #4
0x0A0 0BF 32 アプリケーションエントリー #5
0x0C0 0DF 32 アプリケーションエントリー #6
0x0E0 0FF 32 アプリケーションエントリー #7
0x100 103 4 構成フラグ
0x104 11F 4 予約
0x120 11F 4 未使用, ユーザーデータ

各アプリケーションのエントリーの内容は次のようになっています。

開始 長さ 内容
0 4 構成エントリー ID (ビット 4-31) + エントリー フラグ (ビット 0-4)
4 4 SPI フラッシュ内のアプリケーションアドレス
8 4 SPI フラッシュ内のアプリケーションサイズ. これはアプリケーションの .bin ファイルのサイズ
12 4 アプリケーションの CRC32 値 (32ビット)
16 16 アプリケーション名(Null で終了した文字列)

SPIフラッシュメモリのメモリマッピング

インストール

インストールはKbootをダウンロード(クローン)し、buildディレクトリでktoolを使用します。

kboot.kfpkgには、ブートローダーとデフォルトのブート構成情報が入っています。

git clone https://github.com/loboris/Kboot
cd build
# まずはこれ(bootloader_lo.bin bootloader_hi.bin, config.bin)
./ktool.py -p /dev/ttyUSB0 -b 2000000 kboot.kfpkg

# デフォルトアプリ
./ktool.py -p /dev/ttyUSB0 -a 65536 -b 2000000 default.bin

# MicroPython (FreeRTOS SDK)
./ktool.py -p /dev/ttyUSB0 -a 524288 -b 2000000 MicroPython.bin

# dvp_ov (Standalone SDK)
./ktool.py -p /dev/ttyUSB0 -a 2621440 -b 2000000 dvp_ov.bin

# maixpy (Standalone SDK)
./ktool.py -p /dev/ttyUSB0 -a 2621440 -b 2000000 maixpy.bin

Windowsの場合は、このようになります。ポートやボードは自動認識しますが、"-p COMxx" のように通信ポート、"-B goE" のようにボードを指定することもできます。

git clone https://github.com/loboris/Kboot
cd build
# まずはこれ(bootloader_lo.bin bootloader_hi.bin, config.bin)
ktool.py -b 2000000 kboot.kfpkg

# デフォルトアプリ
./ktool.py -a 65536 -b 2000000 default.bin

# MicroPython (FreeRTOS SDK)
./ktool.py -a 524288 -b 2000000 MicroPython.bin

# dvp_ov (Standalone SDK)
./ktool.py -a 2621440 -b 2000000 dvp_ov.bin

# maixpy (Standalone SDK)
./ktool.py -a 2621440 -b 2000000 maixpy.bin

調整

Kbootは起動時にブート構成(インデックス)を読み込み、最初のアクティブなアプリを読み込んで起動します。デフォルトでは、起動時にK210のIO18(18pin)をGNDにするとアプリの一覧を表示して、シリアル接続のコンソールからアプリを選択することができます。

MaixduinoはIO18が端子に出ていないので、代わりにD9あたりを使いたくなります。その場合、MaixduinoのD7ピンはIO15なので、bootloader_hiのソース50行目の値を修正してリコンパイルします。

main.c
// Constants
/*
 * Pin used to enter interactive mode and request the user
 * to select which application to load
 * Any valid and not used K210 gpio can be used except gpio#16 (0 ~ 15 & 17 ~ 47)
 */
#define BOOT_PIN            18 <-- ここを15に修正する
#define GPIO_KEY            2

PlatformIO

PlatformIOを使用している場合、そのままではフラッシュメモリの先頭にアプリをアップロードして、上記で設定した内容がすべて上書きされます。デフォルトアプリの場所(0x00010000)にアプリをアップロードするにはPlatformIOのプロジェクトのplatformio.iniを次のように設定します。

ktool.pyは C:\Users<ユーザー>.platformio\packages\ktool\ktool.py に配置した例です。

Windowsの場合ポートは-p COMxxで指定します(xxに数字が入ります。デバイスマネージャー等で確認してください)。ポートはKtoolが自動判定してくれますが、MaixduinoはK210とESP32用にポートが2つあるので指定が必要になることがあります。ボードは-B goEのように指定します。選択肢にMaixduinoもありますが、私の環境ではgoEを指定した方が成功します。

platformio.ini
upload_flags =
    -a
    65536 
    -p
    COMxx
    -b
    2000000
    -B
    goE
upload_command = $PROJECT_PACKAGES_DIR/ktool/ktool.py $UPLOAD_FLAGS -t $SOURCE

まとめ

Maixduinoのフラッシュメモリは6Mバイトあるので、Sipeed社のMaixPy、LoborisのMicroPython、その他のアプリを切り替えて実行することができます。

ESP32に関してはEspressif Systems社がフラッシュメモリの標準のパーティションマップを提供していますが、K210の場合はそれがないのでloborisのKbootのメモリマップが一つの参考になるかもしれません。