Maixduinoでマルチブートする②

# はじめに

[Sipeed Maixduino](https://www.switch-science.com/catalog/5707/)などのK210用にloborisさんが作成したブートローダー[Kboot](https://github.com/loboris/Kboot)はシリアルコンソールで入出力します。起動時にフラッシュメモリに格納されたアプリの一覧が表示されて、キーボードで選択します。これをMaixduino単体で選択できるようにします。

# 準備

### スイッチ

[Sipeed Maix-go](https://www.seeedstudio.com/Sipeed-MAix-GO-Suit-for-RISC-V-AI-IoT-p-2874.html)のようなレバースイッチを使います。今回は[Grove Base Shield V2.0 for Arduino](https://www.seeedstudio.com/Base-Shield-V2.html)を使ったので、Groveケーブルを切ってレバースイッチにはんだ付けしました。

結線


スイッチ <-> Maixduino
1       <-> D7
T       <-> D8
2       <-> D9
C       <-> GND

- 秋月電子のレバースイッチ（[TMHU27](http://akizukidenshi.com/catalog/g/gK-13959/)）

![](http://akizukidenshi.com/img/goods/L/K-13959.jpg)

- [GROVE - 4ピンケーブル](https://www.switch-science.com/catalog/798/)

![](https://d2air1d4eqhwg2.cloudfront.net/images/798/500x500/ed274c91-dfda-46d2-ab7f-067b99902500.jpg)


### ブートセレクター（Bootselector）

ソースは[こちら](https://github.com/fukuen/maixduino-bootselector)


### Kbootの調整

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

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

また、シリアルではなくレバースイッチでUP（D7）を選択した場合にデフォルトアプリ（Bootselector）を起動するようにします。

```c++: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

...中略...

    else if (boot_pin == 0) {
        // === Interractive mode ===
        // Check boot pin again
        boot_pin = gpiohs_get_pin(GPIO_KEY);
        if (boot_pin == 0) {
/* ここからコメントアウト
            // ** request user to select the application to run
            LOG("\nSelect the application number to load [");
            for (i = 0; i < BOOT_CONFIG_ITEMS; i++) {
                if (available_apps[i]) {
                    LOG(" %u,", i);
                }
            }
            LOG(" d=default ] ? ");
            while (1) {
                char_in = rom_getchar();
                if ((char_in == 'd') || (char_in == 'D')) {
                    // use default application
                    app_flash_start = DEFAULT_APP_ADDR;
                    break;
                }
                else {
                    char_in -= 0x30;
                    if ((char_in >= 0) && (char_in < BOOT_CONFIG_ITEMS)) {
                        if (available_apps[char_in]) {
                            get_params(char_in);
                            // get application's size and address in Flash
                            app_size = flash2uint32(cfg_address+1);
                            app_flash_start = cfg_address;
                            char_in += 0x30;
                            break;
                        }
                    }
                    char_in += 0x30;
                    LOG("%c? ", char_in);
                }
            }
            LOG("%c\n\n", (char)char_in);
*/
        // レバースイッチを選択した場合にデフォルトアプリを起動する
        LOG("\nRunning default application\n");
        // use default application
        app_flash_start = DEFAULT_APP_ADDR;
        }
    }

```

# まとめ

bootloader_hi.bin と default.bin を書き込みます。Maixduinoを
そのまま起動すると最初のアクティブなアプリケーションが起動しますが、レバースイッチを上にあげてMaixduinoを起動すると次のような画面を表示してアプリケーションのアクティブ/非アクティブを選択できます。


![bootselector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/a74c4dff-61e6-fc39-149f-832af910a552.png)


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

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