Moddable SDK 4.0.0のnRF52のBootloaderをSeeed XIAO BLE (nRF52840)へ書き込む

# はじめに

Seeed XIAO BLE (nRF52840)は購入状態でDFUモードにした時に、PC(macOS)で認識されるドライブ名が「XIAO-SENSE」です。

Moddable SDK 4.0.0でサポートされたnRF52のデバイス定義ファイルでは、ドライブ名が「MODDABLEnRF」となっています。

```text
$MODDABLE/build/devices/nrf52/targets/xiao/manifest.json

(抜粋)
"UF2_VOLUME_NAME": "MODDABLEnRF"
```

デバイス定義ファイルの"UF2_VOLUME_NAME"の設定を修正("MODDABLEnRF" → "XIAO-SENSE")することで、問題なくModdable SDKのサンプルプログラムを動かすことができました。

https://qiita.com/kitazaki/items/8005496f37ac4bfea789

その後、GitHubのDiscussionsで問い合わせたところ、Moddable用のBootloaderを書き込んで動かすことを想定している、という回答を得ました。

https://github.com/Moddable-OpenSource/moddable/discussions/1200

# Moddable SDK 4.0.0のnRF52のBootloader

「Using the Moddable SDK with nRF52」のページを参照すると、Bootloaderの記載があります。

https://www.moddable.com/documentation/devices/nrf52#install-bootloader

Bootloaderはビルドする必要があります。

# Moddable用のBootloaderのビルド手順

```bash
$ git clone https://github.com/Moddable-OpenSource/Adafruit_nRF52_Bootloader --recurse-submodules
$ cd Adafuit_nRF52_Bootloader
$ make BOARD=moddable_xiao
```

正常にビルドが完了すると、_build/build-moddable_xiaoディレクトリ配下にBootloaderが作成されます。

```bash
$ cd _build/build-moddable_xiao/
$ ls -1 moddable_xiao_bootloader*
moddable_xiao_bootloader-0.6.0-nosd.hex
moddable_xiao_bootloader-0.6.0-nosd.uf2
moddable_xiao_bootloader-0.6.0.hex
moddable_xiao_bootloader-0.6.0.out
moddable_xiao_bootloader-0.6.0.out.map
moddable_xiao_bootloader-0.6.0_s140_7.2.0.hex
moddable_xiao_bootloader-0.6.0_s140_7.2.0.zip
```

# Moddable用のBootloaderを書き込む

Seeed XIAO BLE (nRF52840)をDFUモードにした時にシリアルデバイスとして認識されます。
DFUモードにするには、小さなRESETボタンをすばやく2回押します。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f37323437392f61336434623261392d336632342d336132352d336332612d3866653665336535306239642e6a706567.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/e332f427-36d7-4bb2-29e0-c14ea0790e2c.jpeg)

```bash
$ ls -1 /dev/cu.usbmodem*
/dev/cu.usbmodem1101
```

adafruit-nrfutilコマンドを使用して、Moddable用のBootloaderを書き込みます。

```bash
$ pip3 install adafruit-nrfutil

$ adafruit-nrfutil --verbose dfu serial -pkg moddable_xiao_bootloader-0.6.0_s140_7.2.0.zip -p /dev/cu.usbmodem1101 -b 115200 --touch 1200
```

正常に書き込みが完了すると、PC(macOS)で認識されるドライブ名が「MODDABLEnRF」となります。

## 注意

1回書き込むと、Moddable用のBootloaderではDFUモードにしてもシリアルデバイスとして認識されなくなります。
オリジナルのBootloaderへ戻す場合や、将来Moddable用のBootloaderをアップデートする場合は、J-LinkやST-LinkなどのBootloaderを書き込むためのデバイスが必要です。

# OpenOCDとST-Link V2を使ってBootloaderを書き込む

## 接続

Seeed XIAO BLEの基板の裏面にSWCLKとSWDIO端子があり、Bootloaderを書き込むためのデバイスと接続する必要があります。

![beibupinout3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/81ab8665-bf87-3351-80cf-8a076ee91ab2.png)

SWCLKとSWDIO端子にジャンパーケーブルを直接ハンダづけすることもできますが、実用上はExpansion Board Baseを使用した方が便利です。

https://www.seeedstudio.com/Seeeduino-XIAO-Expansion-board-p-4746.html

Bootloaderを書き込むためのデバイスとしてST-Link V2 (USBドングル)を使用し、Expansion Board Base経由でXIAO BLEと接続します。

![IMG_2230.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/80d7f429-f5de-bddb-84b5-48e6ed643159.jpeg)

## Bootloaderを書き込む

OpenOCDをインストールし、openocdコマンドを使用してBootloaderを書き込みます。

```
$ brew install openocd
```

### Moddable用のBootloaderを書き込む場合

```bash
$ openocd -f interface/stlink-v2.cfg -f target/nrf52.cfg -c init -c "reset init" -c halt -c "nrf5 mass_erase" -c "program /Users/kitazaki/tmp/20230828_1/Adafruit_nRF52_Bootloader/_build/build-moddable_xiao/moddable_xiao_bootloader-0.6.0_s140_7.2.0.hex verify" -c reset -c exit
```

### BootloaderをオリジナルのBootloaderに戻す場合

Arduino IDEをインストールし、ボードマネージャーでSeeed XIAO BLEを追加すると、Bootloaderもダウンロードされるので、そのファイルを使用します。

https://qiita.com/kitazaki/items/af9c952eb6b4f6e93507

https://qiita.com/kitazaki/items/928a151605bc08bf546f

```bash
$ openocd -f interface/stlink-v2.cfg -f target/nrf52.cfg -c init -c "reset init" -c halt -c "nrf5 mass_erase" -c "program /Users/kitazaki/Library/Arduino15/packages/Seeeduino/hardware/nrf52/1.1.4/bootloader/Seeed_XIAO_nRF52840_Sense/Seeed_XIAO_nRF52840_Sense_bootloader-0.6.2_s140_7.3.0.hex verify" -c reset -c exit
```

# OpenOCDとJ-Linkを使ってBootloaderを書き込む

## 接続

Bootloaderを書き込むためのデバイスとしてJ-Linkを使用し、Expansion Board Base経由でXIAO BLEと接続します。

![IMG_2417.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/cb2839a9-4e9b-fcb6-ac8c-db95393b9624.jpeg)

### Moddable用のBootloaderを書き込む場合

```bash
$ openocd -f interface/jlink.cfg -c "transport select swd" -f target/nrf52.cfg -c init -c "reset init" -c halt -c "nrf5 mass_erase" -c "program /Users/kitazaki/tmp/20230828_1/Adafruit_nRF52_Bootloader/_build/build-moddable_xiao/moddable_xiao_bootloader-0.6.0_s140_7.2.0.hex verify" -c reset -c exit
```

### BootloaderをオリジナルのBootloaderに戻す場合

```bash
$ openocd -f interface/jlink.cfg -c "transport select swd" -f target/nrf52.cfg -c init -c "reset init" -c halt -c "nrf5 mass_erase" -c "program /Users/kitazaki/Library/Arduino15/packages/Seeeduino/hardware/nrf52/1.1.4/bootloader/Seeed_XIAO_nRF52840_Sense/Seeed_XIAO_nRF52840_Sense_bootloader-0.6.2_s140_7.3.0.hex verify" -c reset -c exit
```