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文件之间的转换