Appearance
分区表
esp32的Flash里面可以有多个不同的程序, 所以默认的时候, 通常在0x8000的位置放一个分区表, 大小为4KB, 之后的所有分区默认的地址需要加0x1000
所有的表项有Name(标签)、Type(app、data 等)、SubType 以及在 flash 中的偏移量(分区的加载地址)。
OTA应用程序指的是通过空中升级(OTA,Over-the-Air)技术进行更新和升级的应用程序。这种技术允许用户通过互联网直接下载并安装新的版本,而无需通过传统的有线连接方式。 OTA 应用程序能够提供更方便、更快速的更新体验,使用户能够及时获得最新的功能和修复bug。
示例
单程序
c
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,在0x10000这一个位置放一个名字叫factory的二进制程序, 这一个程序是实际的要加载的程序
- 分区表中还定义了两个数据区域,分别用于存储 NVS 库专用分区和 PHY 初始化数据。
c
# Name, Type, SubType, Offset, Size
nvs, data, nvs, 0x9000, 0x4000
phy_init, data, phy, 0xd000, 0x1000
factory, app, factory, 0x10000, 7M,这一个是嘉立创开发板可以使用的分区表
多程序
c
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
ota_0, app, ota_0, 0x110000, 1M,
ota_1, app, ota_1, 0x210000, 1M,这一个里面有三个程序, 默认加载factory
自定义
- CSV 文件中的每个非注释行均为一个分区定义。
- 每个分区的
Offset字段可以为空,gen_esp32part.py工具会从分区表位置的后面开始自动计算并填充该分区的偏移地址,同时确保每个分区的偏移地址正确对齐。
Name 字段可以是任何有意义的名称,但不能超过 16 个字节,其中包括一个空字节(之后的内容将被截断)。该字段对 ESP32 并不是特别重要。
Type 字段可以指定为 app (0x00) 或者 data (0x01),也可以直接使用数字 0-254(或者十六进制 0x00-0xFE)。注意,0x00-0x3F 不得使用(预留给 esp-idf 的核心功能)。
启动加载器将忽略
app(0x00) 和data(0x01) 以外的其他分区类型。
SubType 字段长度为 8 bit,内容与具体分区 Type 有关。目前,esp-idf 仅仅规定了 “app” 和 “data” 两种分区类型的子类型含义。
APP类
当 Type 定义为 app 时,SubType 字段可以指定为 factory (0x00)、 ota_0 (0x10) … ota_15 (0x1F) 或者 test (0x20)。
factory(0x00) 是默认的 app 分区。启动加载器将默认加载该应用程序。但如果存在类型为 data/ota 分区,则启动加载器将加载 data/ota 分区中的数据,进而判断启动哪个 OTA 镜像文件。OTA 升级永远都不会更新 factory 分区中的内容。
如果你希望在 OTA 项目中预留更多 flash,可以删除 factory 分区,转而使用 ota_0 分区。
ota_0 (0x10) … ota_15 (0x1F) 为 OTA 应用程序分区,启动加载器将根据 OTA 数据分区中的数据来决定加载哪个 OTA 应用程序分区中的程序。在使用 OTA 功能时,应用程序应至少拥有 2 个 OTA 应用程序分区(
ota_0和ota_1)。更多详细信息,请参考 OTA 文档 。
test(0x20) 为预留的子类型,用于工厂测试流程。如果没有其他有效 app 分区,test 将作为备选启动分区使用。也可以配置启动加载器在每次启动时读取 GPIO,如果 GPIO 被拉低则启动该分区。详细信息请查阅 从测试固件启动。
Data类
SubType 字段可以指定为 ota (0x00)、phy (0x01)、nvs (0x02)、nvs_keys (0x04) 或者其他组件特定的子类型(请参考 子类型枚举).
ota(0) 即 OTA 数据分区 ,用于存储当前所选的 OTA 应用程序的信息。这个分区的大小需要设定为 0x2000。更多详细信息,请参考 OTA 文档 。phy(1) 分区用于存放 PHY 初始化数据,从而保证可以为每个设备单独配置 PHY,而非必须采用固件中的统一 PHY 初始化数据。
默认配置下,phy 分区并不启用,而是直接将 phy 初始化数据编译至应用程序中,从而节省分区表空间(直接将此分区删掉)。
如果需要从此分区加载 phy 初始化数据,请打开项目配置菜单(
idf.py menuconfig),并且使能 CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION 选项。此时,还需要手动将 phy 初始化数据烧至设备 flash(esp-idf 编译系统并不会自动完成该操作)。
nvs(2) 是专门给 非易失性存储 (NVS) API 使用的分区。
用于存储每台设备的 PHY 校准数据(注意,并不是 PHY 初始化数据)。
用于存储 Wi-Fi 数据(如果使用了 esp_wifi_set_storage(WIFI_STORAGE_FLASH) 初始化函数)。
NVS API 还可以用于其他应用程序数据。
强烈建议为 NVS 分区分配至少 0x3000 字节空间。
如果使用 NVS API 存储大量数据,请增加 NVS 分区的大小(默认是 0x6000 字节)。
nvs_keys(4) 是 NVS 秘钥分区。详细信息,请参考 非易失性存储 (NVS) API 文档。coredump(0x03) 用于在使用自定义分区表 CSV 文件时存储核心转储,详情请参阅 核心转储。efuse(0x05) 使用 虚拟 eFuse 模拟 eFuse 位。undefined(0x06) 隐式用于未指定子类型(即子类型为空)的数据分区,但也可显式将其标记为未定义。fat(0x81) 用于 FAT 文件系统。spiffs(0x82) 用于 SPIFFS 文件系统。littlefs(0x83) 用于 LittleFS 文件系统,详情可参阅 storage/littlefs 示例。
偏移
偏移地址表示 SPI flash 中的分区地址,扇区大小为 0x1000 (4 KB)。因此,偏移地址必须是 4 KB 的倍数。
若 CSV 文件中的分区偏移地址为空,则该分区会接在前一个分区之后;若为首个分区,则将接在分区表之后。
app 分区的偏移地址必须与 0x10000 (64 KB) 对齐。如果偏移字段留空,则 gen_esp32part.py 工具会自动计算得到一个满足对齐要求的偏移地址。如果 app 分区的偏移地址没有与 0x10000 (64 KB) 对齐,则该工具会报错。
app 分区的大小和偏移地址可以采用十进制数或是以 0x 为前缀的十六进制数,且支持 K 或 M 的倍数单位(K 和 M 分别代表 1024 和 1024*1024 字节)。
flag
目前支持 encrypted 和 readonly 标记:
其他
这一个文件可以使用gen_esp32part.py来进行csv文件和bin文件之间的转换