M5stack core3でのカメラ操作

M5stack core3でカメラ操作をするために調べたことをまとめました。

## 背景
[Githab M5CoreS3](https://github.com/m5stack/M5CoreS3)の```M5CoreS3/examples/Basics/Camera
/Camera.ino```を使用してカメラ操作を試していましたが、[No core dump partition found](https://community.platformio.org/t/no-core-dump-partition-found/32911/1)というエラーが出たため、カメラ操作を行うことができませんでした。原因は、board、memory_type、partitionの設定を変更する必要がありました。設定について何をしているのかを調べてみました。

### 環境
OS: windows 10.0
開発環境:Platform IO
デバイス:M5stackcore3

## PlatfromIO
[ronron-gh](https://github.com/ronron-gh/M5CoreS3_CameraTest/tree/master)さんが作成したplatformIOの環境でM5stack Core3のカメラ操作をすることができたので、PlatfromIOで設定していることを図にしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/a0c9a6bd-a346-9c7d-f762-db0c3bedb10a.png)

Platformio.iniのファイルでは、プロジェクトで使用する設定を記述しています。boardは、使用するマイコンに合わせて選択する必要があります。また、memory_type、partitionsは、作成するアプリケーションと使用しているマイコンによって設定できる機能が変わってきます。マイコンが処理を頻繁に行うアプリケーションの場合は、この設定を変更する必要があります。lib_depsでは、プログラム内で使用するライブラリを設定しています。

### board
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/9d4799c9-2fcf-4ba8-7531-0e047bd3a2cf.png)
board情報は、使用するモジュールによって使用するマイコンも異なります。M5stack core2とM5stack core3では、ESPの種類が変わっています。board情報は、使用するpin情報の設定も含まれているため、使用するESPに合わせて設定する必要があります。ボードで設定される情報は、platformIOのサイトに記載されています。[Espressif ESP32-S3-Box](https://docs.platformio.org/en/stable/boards/espressif32/esp32s3box.html)はこんな感じです。

### memory_type
memory_typeでは、qio_qspiを設定します。qspiとは、PSRAMがflashメモリなどのシリアルメモリにアクセスするための通信機能を選択です。core3は、QSPI通信を行うことができます。これを使用することで手軽に外部メモリを増設することができます。ざっくりといえば、SPI通信では、2本の通信バスだったのが、QSPIでは、4本の通信バス拡張されたため、1クロックでデータを送受信できる量が2倍になり、より高速でデータ通信ができます。

### partition 
parition table(partition)について、[ドキュメント](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html)には、下記のように記載されています。

> A single ESP32’s flash can contain multiple apps, as well as many different kinds of data (calibration data, filesystems, parameter storage, etc). For this reason a partition table is flashed to (default offset) 0x8000 in the flash.

使用するアプリケーションに合わせて機能を追加したいとき、このpartition tableを編集することでメモリ領域を確保することができます。partition tableは、それぞれのアプリケーションに必要なflashメモリのアドレスとサイズを指定し、分割することができます。

#### partition table例
下記は、```default_16MB.csv```です。

|Name|Type|SubType|Offset|Size|Flags|
|:-:|:-:|:-:|:-:|:-:|:-:|
|nvs|data|nvs|0x9000|0x5000|
|otadata|data|ota|0xe000|0x2000|
|app0|app|ota_0|0x10000|0x640000|
|app1|app|ota_1|0x650000|0x640000|
|spiffs|data|spiffs|0xc90000|0x360000|
|coredump|data|coredump|0xFF0000|0x10000|

##### Name
パーティション名です。16文字以内で記述します。

##### Type
dataまたはappを設定できます。
appタイプは、アプリケーションを格納するパーティションを定義するために使用されます。
dataタイプは、一般的なデータを格納するパーティションを定義するために使用することができます

##### SubType
SubTypeは、アプリパーティションとデータパーティションの使い方を定義します。

##### nvs(data)
nvsは、WiFiデータ、デバイスPHYキャリブレーションデータなど不揮発性メモリに保存するデータを格納ために使用します。
##### ota(data),ota_0(app),ota_1(app)
otaは、OTA（Over The Air）情報を格納するために使用します。OTAとは、データその送受信を無線通信で行うための技術です。
##### spiffs(data)
spiffsは、SPIFFS (SPI Flash File System) の使用を定義しています。SPIFFSの機能を使うと、ESP32のフラッシュメモリの一部をストレージとして使うことができます。
##### coredump(data)
oredumpは、コアダンプをメモリに格納するために使用します。コアダンプは、アプリケーションの動作中にクラッシュした際の情報を残すことができるので、解析をするときに使用できます。

##### Offset
オフセットは、パーティションの開始アドレスを定義します。オフセットは、オフセットと先のパーティションのサイズの合計で定義されます。
##### Size
サイズは、パーティションに割り当てるメモリを定義します。
##### Flags
フラグは、パーティションがフラッシュ暗号化機能で暗号化されるかどうかを定義するために使用されています。

#### M5stack core3の初期化
Core3の書き込み途中で動かなくなったことが何度かあり、初期化を行いました。方法については下記のとおりです。
[CoreS3](https://docs.m5stack.com/en/core/CoreS3)の```Download CoreS3 Factory Firmware Easyloader```をダウンロードします。
ダウンロードしたアプリを開き、Burnを押すと、初期化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/794e2c17-39e7-2883-e2e9-28d54679c9a8.png)

### link
参考にした or 関係するlinkです。
1. Quad SPI 
[Quad SPIって何？](https://edn.itmedia.co.jp/edn/articles/1511/18/news018.html)
2. Board infomation 
[platform io board 情報](https://docs.platformio.org/en/stable/boards/index.html#espressif-32)
3. Module
[M5stack coreS3](https://docs.m5stack.com/en/core/CoreS3)
4. partition 関連 
[ESP32マウスPart.41 ESP32でファイルシステムを扱う](https://rt-net.jp/mobility/archives/14395)
[Partition Tables](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html)
[ESP32-WROOM-32 SPIFFS メモリサイズを大きくする方法](https://www.mgo-tec.com/blog-entry-partition-table-spiffs-sizeup-esp-wroom-32.html)