【令和6年版】ESP32S3-N16R8用のCircuitPythonをビルドする on Mac

# はじめに

以前書いた同タイトルの記事に従い、久しぶりにCircuitPythonをビルドしてみると、Macを変えたせいか バージョンが新しくなったせいか、少し変わっていた。

https://qiita.com/nak435/items/6e6594018c2e84ff632f

そこで、最新手順を令和6年版として残すことにする。

# 環境

ESP-IDF環境は既に整っている前提

現在の環境は以下の通り
（#は以前の環境）

```terminal
$ uname -a
Darwin Mac-mini.local 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:34 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T8103 arm64
#Darwin MacBook-Pro.local 21.6.0 Darwin Kernel Version 21.6.0: Mon Aug 22 20:17:10 PDT 2022; root:xnu-8020.140.49~2/RELEASE_X86_64 x86_64

$ idf.py --version
ESP-IDF v5.1-dev-6224-g60ff95f5bf
#ESP-IDF v4.4.3

$ python --version
Python 3.11.6
#Python 3.10.8

$ make --version
GNU Make 3.81
#GNU Make 3.81

$ gmake --version
GNU Make 4.4.1
Built for aarch64-apple-darwin22.3.0
#GNU Make 4.4
```



# 手順

手順自体はそれほど変わらない。

以下にコマンドの流れだけを示す。

```shell:事前準備（インストール済みであればスキップ）
brew update
brew install uncrustify cmake ninja
brew link gettext --force
pip install minify-html
pip install jsmin
```


```shell:circuitpython.gitをクローン
git clone https://github.com/adafruit/circuitpython.git
cd circuitpython
git checkout main  OR  8.2.x

#espressifに限定することでダウンロード時間とディスク容量を節約
cd ports/espressif
make fetch-port-submodules 

esp-idf/install.sh

cd ../..
make -C mpy-cross
```


```shell:N8R8をコピーしてN16R8向けを作る
cd ports/espressif/boards
cp -r espressif_esp32s3_devkitc_1_n8r8 espressif_esp32s3_devkitc_1_n16r8

sed -i "" 's/ESP32-S3-DevKitC-1-N8R8/ESP32-S3-DevKitC-1-N16R8/' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.h
sed -i "" 's/ESP32-S3-DevKitC-1-N8R8/ESP32-S3-DevKitC-1-N16R8/' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.mk
sed -i "" 's/CIRCUITPY_ESP_FLASH_SIZE = 8MB/CIRCUITPY_ESP_FLASH_SIZE = 16MB/' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.mk
sed -i "" 's/CIRCUITPY_ESP_FLASH_MODE = dio/CIRCUITPY_ESP_FLASH_MODE = qio/' espressif_esp32s3_devkitc_1_n16r8/mpconfigboard.mk
```


```shell:N16R8向けをビルド
cd ..
source esp-idf/export.sh
make -j8 BOARD=espressif_esp32s3_devkitc_1_n16r8
```
↑以前の環境では、makeだとエラーとなったので、gmakeを使ったが、今回はmakeで問題なくビルドできた。


## ビルド結果

```terminal:成果物フォルダ(circuitpython/ports/espressif/build-espressif_esp32s3_devkitc_1_n16r8)
% ls build-espressif_esp32s3_devkitc_1_n16r8
autogen_display_resources-en_US.P       firmware.elf.map
autogen_display_resources-en_US.c       firmware.size.json
autogen_display_resources-en_US.o       firmware.uf2
autogen_web_workflow_static.c           genhdr
background.P                            lib
background.o                            main.P
bindings                                main.o
boards                                  mphalport.P
build-espressif_esp32s3_devkitc_1_n16r8 mphalport.o
circuitpython-firmware.bin              peripherals
common-hal                              py
esp-idf                                 shared
extmod                                  shared-bindings
firmware.bin                            shared-module
firmware.elf                            supervisor
```

出来上がった`firmware.bin`をesp32s3に焼く。

```shell:
$ esptool.py --chip esp32s3 --port /dev/cu.usbserialxxx --baud 921600 erase_flash
$ esptool.py --chip esp32s3 --port /dev/cu.usbserialxxx --baud 921600 write_flash -z 0x0 firmware.bin
```



# N16R8用CircuitPythonの実行結果

```sh
$ screen /dev/cu.usbmodemxxx 115200

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
code.py output:
Hello World!

Code done running.

Press any key to enter the REPL. Use CTRL-D to reload.

Adafruit CircuitPython 8.2.9-8-g7af75178ed on 2024-02-01; ESP32-S3-DevKitC-1-N16R8 with ESP32S3
>>> 
>>> import os
>>> os.listdir()
['.fseventsd', '.metadata_never_index', '.Trashes', 'settings.toml', 'code.py', 'lib', 'boot_out.txt']
>>> 
```

以上