ESP32 官方文档(三)分区表
分區(qū)表分區(qū)表概述內(nèi)置分區(qū)表創(chuàng)建自定義分區(qū)表名字字段類型字段子類型App 子類型數(shù)據(jù)子類型偏移量 & 大小標志生成二進制分區(qū)表MD5 校驗和燒錄分區(qū)表
分區(qū)表
概述
單個 ESP32 的 flash 可以包含多個應(yīng)用程序,以及許多不同類型的數(shù)據(jù)(校準數(shù)據(jù),文件系統(tǒng),參數(shù)存儲等). 因此,分區(qū)表被下載到 flash 中的 0x8000 地址(默認偏移量).
分區(qū)表長度為 0xC00 字節(jié)(最多 95 個分區(qū)表條目). 在表數(shù)據(jù)之后附加 MD5 校驗和. 如果分區(qū)表由于安全引導(dǎo)而簽名,則簽名將附加在分區(qū)表之后.
分區(qū)表中的每個條目都有一個 name (label),type(app,data 或其他),subtype以及加載分區(qū)的 flash 中的 offset (偏移量).
使用分區(qū)表的最簡單方法是 make menuconfig 并選擇一個簡單的預(yù)定義分區(qū)表:
“Single factory app, no OTA”
“Factory app, two OTA definitions”
在這兩種情況下,factory 應(yīng)用程序下載到 0x10000 地址. 如果您 make partition_table,那么它將打印分區(qū)表的摘要.
內(nèi)置分區(qū)表
以下是 Single factory app, no OTA 的分區(qū)表配置信息:
# Espressif ESP32 Partition Table
# Name, ? Type, SubType, Offset, ?Size, Flags
nvs, ? ? ?data, nvs, ? ? 0x9000, ?0x6000,
phy_init, data, phy, ? ? 0xf000, ?0x1000,
factory, ?app, ?factory, 0x10000, 1M,
12345
flash 中的 0x10000(64KB) 偏移量被標記為 factory 應(yīng)用程序. 默認情況下,引導(dǎo)加載程序?qū)⑦\行此應(yīng)用程序.
在分區(qū)表中還定義了兩個用于存儲 NVS 庫分區(qū)和 PHY 初始化數(shù)據(jù)的數(shù)據(jù)區(qū)域.
以下是 Factory app, two OTA definitions 的分區(qū)表配置信息:
# Espressif ESP32 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, ?0, ? ?0, ? ? ? 0x10000, 1M,
ota_0, ? ?0, ? ?ota_0, ?0x110000, 1M,
ota_1, ? ?0, ? ?ota_1, ?0x210000, 1M,
12345678
現(xiàn)在有三個應(yīng)用程序分區(qū)定義.
這三種 Type 都設(shè)置為 app,但在 0x10000 位置的 factory 應(yīng)用程序和后面的兩個 OTA 應(yīng)用程序的子類型有所不同.
還有一個新的 ota data 區(qū)域,用于保存 OTA 更新的數(shù)據(jù). 引導(dǎo)加載程序會查詢此數(shù)據(jù),以便了解要執(zhí)行的應(yīng)用程序. 如果 ota data 為空,它將執(zhí)行 factory 應(yīng)用程序.
創(chuàng)建自定義分區(qū)表
如果在 menuconfig 中選擇 “Custom partition table CSV”,還應(yīng)該輸入要用于分區(qū)表的 CSV 文件的名稱(在項目目錄中). CSV 文件中有將要用于分區(qū)表配置的任意數(shù)量的定義.
CSV 格式與上面摘要中打印的格式相同. 但是,CSV 中并非所有字段都是必需的. 例如,以下是 OTA 分區(qū)表的“輸入” CSV:
# Custom partition table
# Name, ? Type, SubType, Offset, Size, Flags
nvs, ? ? ?data, nvs, ? ? , ? ? ? 0x4000,
otadata, ?data, ota, ? ? , ? ? ? 0x2000,
phy_init, data, phy, ? ? , ? ? ? 0x1000,
factory, ?app, ?factory, , ? ? ? 1M,
ota_0, ? ?app, ?ota_0, ? , ? ? ? 1M,
ota_1, ? ?app, ?ota_1, ? , ? ? ? 1M,
12345678
字段之間的空格被忽略,任何以#(注釋)開頭的行也是如此.
CSV 文件中的每個非注釋行都是分區(qū)定義.
每個分區(qū)的 “Offset” 字段為空. gen_esp32part.py 工具填充每個空白偏移量,從分區(qū)表開始并確保每個分區(qū)正確對齊.
名字字段
名稱字段可以是任何有意義的名稱. 這對 ESP32 來說并不重要. 超過 16 個字符的名稱將被截取.
類型字段
分區(qū)類型字段可以指定為 app(0) 或 data(1). 或者它可以是數(shù)字 0-254(或十六進制 0x00-0xFE). 類型 0x00-0x3F 保留用于 esp-idf 核心功能.
如果您的應(yīng)用程序需要存儲數(shù)據(jù),請在 0x40-0xFE 范圍內(nèi)添加自定義分區(qū)類型.
引導(dǎo)加載程序忽略 app(0) 和 data(1) 以外的任何分區(qū)類型.
子類型
8 位子類型字段特定于給定的分區(qū)類型.
esp-idf 當前僅指定 “app” 和 “data” 分區(qū)類型的子類型字段的含義.
App 子類型
當 type 為 “app” 時,子類型字段可以指定為 factory(0),ota_0(0x10)… ota_15(0x1F) 或 test(0x20).
factory(0) 是默認的應(yīng)用程序分區(qū). 引導(dǎo)加載程序?qū)?zhí)行工廠應(yīng)用程序,除非它看到類型為 data/ota 的分區(qū),在這種情況下,它會讀取此分區(qū)以確定要引導(dǎo)的 OTA 映像.
OTA 永遠不會更新 factory 分區(qū).
如果要保留 OTA 項目中的閃存使用率,可以刪除 factory 分區(qū)并改為使用 ota_0.
ota_0(0x10)… ota_15(0x1F) 是 OTA app 區(qū)域. 有關(guān)更多詳細信息,請參閱OTA文檔,然后使用 OTA 數(shù)據(jù)分區(qū)配置引導(dǎo)加載程序應(yīng)引導(dǎo)的應(yīng)用程序. 如果使用 OTA,則應(yīng)用程序應(yīng)至少具有兩個 OTA 應(yīng)用程序槽(ota_0&ota_1). 有關(guān)更多詳細信息,請參閱OTA文檔.
test(0x2) 是 factory 測試程序的保留子類型. esp-idf 引導(dǎo)程序當前不支持它.
數(shù)據(jù)子類型
當 type 為 “data” 時,子類型字段可以指定為 ota(0),phy(1),nvs(2).
ota(0) 是OTA數(shù)據(jù)分區(qū),它存儲有關(guān)當前所選 OTA 應(yīng)用程序的信息.此分區(qū)的大小應(yīng)為 0x2000 字節(jié).有關(guān)更多詳細信息,請參閱OTA文檔.
phy(1) 用于存儲 PHY 初始化數(shù)據(jù).這允許 PHY 到每個設(shè)備被配置,而不是在固件.
在默認配置中,不使用 phy 分區(qū),并且 PHY 初始化數(shù)據(jù)被編譯到 app 本身.因此,可以從分區(qū)表中刪除此分區(qū)以節(jié)省空間.
要從此分區(qū)加載 PHY 數(shù)據(jù),請運行 make menuconfig 并啟用 CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION 選項.您還需要使用 phy init 數(shù)據(jù)刷新(flash)設(shè)備,因為 esp-idf 構(gòu)建系統(tǒng)不會自動執(zhí)行此操作.
nvs(2) 用于非易失性存儲(NVS)API.
NVS 用于存儲每個設(shè)備 PHY 校準數(shù)據(jù)(與初始化數(shù)據(jù)不同).
如果使用esp_wifi_set_storage(WIFI_STORAGE_FLASH)初始化功能,則 NVS 用于存儲 WiFi 數(shù)據(jù).
NVS API 還可用于其他應(yīng)用程序數(shù)據(jù).
強烈建議您在項目中包含至少 0x3000 字節(jié)的 NVS 分區(qū).
如果使用 NVS API 存儲大量數(shù)據(jù),請將 NVS 分區(qū)默認的 0x6000 字節(jié)大小增加.
?
其他數(shù)據(jù)子類型保留用于將來的 esp-idf 用途.
偏移量 & 大小
具有空白偏移的分區(qū)將在前一個分區(qū)之后開始,或者第一個分區(qū)是在分區(qū)表之后開始.
應(yīng)用程序分區(qū)必須處于與 0x10000(64K) 對齊的偏移量. 如果將偏移字段留空,工具將自動對齊分區(qū). 如果為應(yīng)用程序分區(qū)指定未對齊的偏移量,該工具將返回錯誤.
大小和偏移量可以指定為十進制數(shù),帶前綴 0x 的十六進制數(shù),或大小乘數(shù) K 或 M(1024 和 1024 * 1024 字節(jié)).
如果希望分區(qū)表中的分區(qū)與表本身的任何起始偏移量(CONFIG_PARTITION_TABLE_OFFSET)一起使用,請將所有分區(qū)的偏移字段(在 CSV 文件中)留空. 類似地,如果更改分區(qū)表偏移,則要注意所有空白分區(qū)偏移可能會更改為匹配,并且任何固定偏移現(xiàn)在可能與分區(qū)表沖突(導(dǎo)致錯誤).
標志
目前僅支持一個加密的標志. 如果此字段設(shè)置為加密,則在啟用 Flash 加密時將對此分區(qū)進行加密.
(請注意,無論是否設(shè)置此標志,應(yīng)用程序類型分區(qū)都將始終加密.)
生成二進制分區(qū)表
下載到 ESP32 的分區(qū)表是二進制格式,而不是 CSV 格式. 工具 partition_table/gen_esp32part.py 用于在 CSV 和二進制格式之間進行轉(zhuǎn)換.
如果在 make menuconfig 中配置分區(qū)表 CSV 名稱,然后生成 partition_table,則此轉(zhuǎn)換將在構(gòu)建過程中完成.
要手動將 CSV 轉(zhuǎn)換為二進制:
python gen_esp32part.py input_partitions.csv binary_partitions.bin
1
要將二進制格式轉(zhuǎn)換回 CSV:
python gen_esp32part.py binary_partitions.bin input_partitions.csv
1
在 stdout 上顯示二進制分區(qū)表的內(nèi)容(這是生成 make partition_table 時顯示的摘要的方式:
python gen_esp32part.py binary_partitions.bin
1
MD5 校驗和
分區(qū)表的二進制格式包含基于分區(qū)表計算的 MD5 校驗和. 此校驗和用于在引導(dǎo)期間檢查分區(qū)表的完整性.
可以通過 gen_esp32part.py 的 --disable-md5sum 選項或 CONFIG_PARTITION_TABLE_MD5 選項禁用 MD5 校驗和生成. 例如,當使用傳統(tǒng)引導(dǎo)加載程序無法處理 MD5 校驗和且引導(dǎo)失敗并且錯誤消息無效幻數(shù) 0xebeb 時,這很有用.
燒錄分區(qū)表
make partition_table-flash:將使用 `esptool.py 下載分區(qū)表.
make flash:會下載所有固件,包括分區(qū)表.
手動下載命令也會打印在 make partition_table 中.
請注意,更新分區(qū)表不會擦除已根據(jù)舊分區(qū)表存儲的數(shù)據(jù). 您可以使用 make erase_flash (或 esptool.py erase_flash)來擦除整個閃存內(nèi)容.
---------------------?
作者:InfiniteYuan?
來源:CSDN?
原文:https://blog.csdn.net/qq_27114397/article/details/82157058?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的ESP32 官方文档(三)分区表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ESP8266/ESP32 NVS 基本
- 下一篇: iBeacon的数据包格式