Moddable SDK 4.0.0でXIAO BLE(nRF52840)を動かす

# はじめに

Moddable SDK 4.0.0でNordic SemiconductorのnRF52840がサポートされたので、さっそく試してみました。

https://github.com/Moddable-OpenSource/moddable/blob/public/readme.md

nRF52840用の環境構築手順はこちらです。

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/nrf52.md

# xs-devで環境構築

xs-devツールで環境構築する方が楽です。
xs-devツールのインストール手順はこちらです。

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

まず、brewコマンドでxzツールをインストールします。

```bash
brew install xz
```

xs-devツールをアップデートします。

```bash
sudo npm update -g xs-dev 
```

Moddable SDKをアップデートします。

```bash
xs-dev update
```

nRFツールをインストールします。

```bash
xs-dev setup --device nrf52

ℹ Ensuring nrf52 directory
✔ 
  Successfully set up nrf52 platform support for Moddable!
  Test out the setup by starting a new terminal session, plugging in your device, and running: xs-dev run --example helloworld --device nrf52
```

別のターミナルを開き、XIAO BLEを接続(RESETボタンを2回ダブルクリックしてDFUモードへ変更)し、helloworldのプログラムをビルド・インストールしますが、インストールが完了しません。

```bash
xs-dev run --example helloworld --device nrf52/xiao
```

# manifest.jsonを変更する

手動でmcconfigコマンドでビルド・インストールを実行したところ、uf2ファイルをXIAO BLEへ書き込もうとしているところで止まっていることがわかった。

```bash
cd ${MODDABLE}/examples/helloworld
mcconfig -d -m -p nrf52/xiao

# xsl modules
# mcrez resources
Total resource size: 0 bytes
# cc mc.resources.c (slots in flash)
### 289 instances, 567 keys, 65 colors, 0 holes
# cc mc.xs.c (slots in flash)
# buildinfo
# creating xs_nrf52.out
# link to .out file
# Version
#  XS:    4.0.0
# Memory usage
#  Ram:    41016 bytes
#  Heap:  217088 bytes
#  Flash: 489544 bytes
#  QSPI:       0 bytes

Making: /Users/kitazaki/moddable/build/bin/nrf52/xiao/debug/helloworld/xs_nrf52.uf2 from xs_nrf52.hex
Converting to uf2, output size: 547840, start address: 0x27000
Wrote 547840 bytes to /Users/kitazaki/moddable/build/bin/nrf52/xiao/debug/helloworld/xs_nrf52.uf2
/dev/cu.usbmodemD14CE42966AF1
Setting programming mode. product/vendor match: /dev/cu.usbmodemD14CE42966AF1
Waiting for /Volumes/MODDABLEnRF..........
```

XIAO BLEをDFUモードに変更すると、XIAO-SENSEという名前で認識されているため、MODDABLEnRFというボリュームが見つからず、書き込みが失敗していることが原因と判明しました。

デバイスのmanifest.jsonファイルを変更します。

```bash
cd $MODDABLE/build/devices/nrf52/targets/xiao
```

```json:manifest.json
"UF2_VOLUME_NAME": "MODDABLEnRF"
↓
"UF2_VOLUME_NAME": "XIAO-SENSE"
```

もう一度、mcconfigコマンドを実行すると、今度はビルド・インストールが成功し、デバッガ(xsbug)が起動して問題なく動作しました。

![スクリーンショット 2023-08-13 20.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/c58cc929-872a-914d-ec45-0d131ee87ad2.png)

## xs-dev infoコマンドにはnRF環境の情報が表示されない？！

```bash
xs-dev info

xs-dev environment info:
  CLI Version                0.27.0
  OS                         Darwin
  Arch                       arm64
  Shell                      /bin/zsh
  NodeJS Version             v18.14.2 (/usr/local/bin/node)
  Python Version             3.9.12 (/Users/kitazaki/.espressif/python_env/idf4.4_py3.9_env/bin/python)
  Moddable SDK Version       4.0.0 (/Users/kitazaki/moddable)                 Supported target devices   mac, esp32, pico
  ESP32 IDF Directory        /Users/kitazaki/.local/share/esp32/esp-idf
  Pico SDK Directory         /Users/kitazaki/pico/pico-sdk

If this is related to an error when using the CLI, please create an issue at "https://github.com/hipsterbrown/xs-dev/issues/new" with the above info.
```

# XIAO BLEのbootloaderの書き込み

XIAO BLEは出荷時点でAdafruit nRF52 Bootloaderが書き込まれているため、bootloaderの書き込みを行う必要はありませんが、bootloaderを書き換えた場合に備えて、bootloaderの書き込み手順を確認しておきます。

https://github.com/Moddable-OpenSource/Adafruit_nRF52_Bootloader

```bash
git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader
cd Adafruit_nRF52_Bootloader
git submodule update --init
```

XIAO BLEを接続し、DFUモードへ変更します。makeコマンドでbootloaderを書き込みます。

```bash
make BOARD=xiao_nrf52840_ble SERIAL=/dev/cu.usbmodem1101 dfu-flash
または
make BOARD=xiao_nrf52840_ble_sense SERIAL=/dev/cu.usbmodem1101 dfu-flash
```

BOARDにxiao_nrf52840_bleを指定した場合、XIAO BLEを接続しDFUモードへ変更するとXIAO_BOOTとして認識されます。
BOARDにxiao_nrf52840_ble_senseを指定した場合、XIAO BLEを接続しDFUモードへ変更するとXIAO_SENSEとして認識されます。
デバイスのmanifest.jsonの"UF2_VOLUME_NAME"の設定値を変更する際は注意してください。

# Moddable用のBootloaderの書き込み (2023年9月6日 追記)

Moddable用のBootloaderを書き込むと、デバイスのmanifest.jsonの"UF2_VOLUME_NAME"の設定値を変更する必要がありません。

https://qiita.com/kitazaki/items/3c40382d22c2d026b4b2