æ¯ç ESP32 ç flash å¯ä»¥å å«å¤ä¸ªåºç¨ç¨åºï¼ä»¥åå¤ç§ä¸åç±»åçæ°æ®ï¼ä¾å¦æ ¡åæ°æ®ãæä»¶ç³»ç»æ°æ®ãåæ°å卿°æ®çï¼ãå æ¤ï¼æä»¬å¨ flash ç é»è®¤åç§»å°å 0x8000 å¤ç§åä¸å¼ ååºè¡¨ã
ååºè¡¨çé¿åº¦ä¸º 0xC00 åèï¼æå¤å¯ä»¥ä¿å 95 æ¡ååºè¡¨æ¡ç®ãMD5 æ ¡éªåéå å¨ååºè¡¨ä¹åï¼ç¨äºå¨è¿è¡æ¶éªè¯ååºè¡¨ç宿´æ§ãååºè¡¨å æ®äºæ´ä¸ª flash æåºï¼å¤§å°ä¸º 0x1000 (4 KB)ãå æ¤ï¼å®åé¢çä»»ä½ååºè³å°éè¦ä½äºï¼é»è®¤åç§»å°åï¼ + 0x1000 å¤ã
ååºè¡¨ä¸çæ¯ä¸ªæ¡ç®é½å æ¬ä»¥ä¸å 个é¨åï¼Nameï¼æ ç¾ï¼ãTypeï¼appãdata çï¼ãSubType 以åå¨ flash ä¸çåç§»éï¼ååºçå è½½å°åï¼ã
å¨ä½¿ç¨ååºè¡¨æ¶ï¼æç®åçæ¹æ³å°±æ¯æå¼é¡¹ç®é
ç½®èå (idf.py menuconfig
)ï¼å¹¶å¨ CONFIG_PARTITION_TABLE_TYPE ä¸éæ©ä¸ä¸ªé¢å®ä¹çååºè¡¨ï¼
"Single factory app, no OTA"
"Factory app, two OTA definitions"
å¨ä»¥ä¸ä¸¤ç§é项ä¸ï¼åºååºç¨ç¨åºåå°è¢«ç§å½è³ flash ç 0x10000 åç§»å°åå¤ãè¿æ¶ï¼è¿è¡ idf.py partition-table
ï¼å³å¯ä»¥æå°å½å使ç¨ååºè¡¨çä¿¡æ¯æè¦ã
以䏿¯ "Single factory app, no OTA" é项çååºè¡¨ä¿¡æ¯æè¦ï¼
# 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,
flash ç 0x10000 (64 KB) åç§»å°åå¤åæ¾ä¸ä¸ªæ 记为 "factory" çäºè¿å¶åºç¨ç¨åºï¼å¼å¯¼å è½½ç¨åºé»è®¤å è½½è¿ä¸ªåºç¨ç¨åºã
ååºè¡¨ä¸è¿å®ä¹äºä¸¤ä¸ªæ°æ®åºåï¼åå«ç¨äºåå¨ NVS åºä¸ç¨ååºå PHY åå§åæ°æ®ã
以䏿¯ "Factory app, two OTA definitions" é项çååºè¡¨ä¿¡æ¯æè¦ï¼
# 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,
ååºè¡¨ä¸å®ä¹äºä¸ä¸ªåºç¨ç¨åºååºï¼è¿ä¸ä¸ªååºçç±»åé½è¢«è®¾ç½®ä¸º âappâï¼ä½å ·ä½ app ç±»åä¸åãå ¶ä¸ï¼ä½äº 0x10000 åç§»å°åå¤ç为åºååºç¨ç¨åº (factory)ï¼å ¶ä½ä¸¤ä¸ªä¸º OTA åºç¨ç¨åº (ota_0, ota_1)ã
æ°å¢äºä¸ä¸ªå为 "otadata" çæ°æ®ååºï¼ç¨äºä¿å OTA å级æ¶éè¦çæ°æ®ãå¼å¯¼å è½½ç¨åºä¼æ¥è¯¢è¯¥ååºçæ°æ®ï¼ä»¥å¤æè¯¥ä»åªä¸ª OTA åºç¨ç¨åºååºå è½½ç¨åºã妿 "otadata" ååºä¸ºç©ºï¼å伿§è¡åºåç¨åºã
å¦æå¨ menuconfig
ä¸éæ©äº "Custom partition table CSV"ï¼åè¿éè¦è¾å
¥è¯¥ååºè¡¨ç CSV æä»¶å¨é¡¹ç®ä¸çè·¯å¾ãCSV æä»¶å¯ä»¥æ ¹æ®éè¦ï¼æè¿°ä»»ææ°éçååºä¿¡æ¯ã
CSV æä»¶çæ ¼å¼ä¸ä¸é¢æè¦ä¸æå°çæ ¼å¼ç¸åï¼ä½æ¯å¨ CSV æä»¶ä¸å¹¶éææåæ®µé½æ¯å¿ éçãä¾å¦ä¸é¢æ¯ä¸ä¸ªèªå®ä¹ç OTA ååºè¡¨ç CSV æä»¶ï¼
# 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, , 1M ota_1, app, ota_1, , 1M nvs_key, data, nvs_keys, , 0x1000
åæ®µä¹é´çç©ºæ ¼ä¼è¢«å¿½ç¥ï¼ä»»ä½ä»¥ #
å¼å¤´çè¡ï¼æ³¨éï¼ä¹ä¼è¢«å¿½ç¥ã
CSV æä»¶ä¸çæ¯ä¸ªé注éè¡å为ä¸ä¸ªååºå®ä¹ã
å¦éè°æ´ CONFIG_PARTITION_TABLE_OFFSET åæ°å¼ï¼è¯·åæ¥æ´æ° CSV æä»¶ä¸ææåºå® Offset
å¼ï¼é²æ¢ä¸æ°ååºè¡¨ä½ç½®äº§çå²çªãä¹å¯å° Offset
åæ®µçç©ºï¼æ¤æ¶ gen_esp32part.py
å·¥å
·å°åºäºå½åååºè¡¨åç§»éå对é½è¦æ±ï¼èªå¨è®¡ç®åºæ£ç¡®çåç§»å°åã
ä¸é¢æ¯ä¸ä¸ªå å«å¼å¯¼å è½½ç¨åºåååºè¡¨ååºç CSV ååºè¡¨ç¤ºä¾ï¼
# ESP-IDF Partition Table # Name, Type, SubType, Offset, Size, Flags bootloader, bootloader, primary, N/A, N/A, partition_table, partition_table, primary, N/A, N/A, nvs, data, nvs, , 0x6000, phy_init, data, phy, , 0x1000, factory, app, factory, , 1M, recoveryBloader, bootloader, recovery, N/A, N/A,
gen_esp32part.py
å·¥å
·å°æ ¹æ®æéç Kconfig é项尿¯ä¸ª N/A
æ¿æ¢ä¸ºéå½çå¼ï¼å¼å¯¼å è½½ç¨åºçåç§»å°å为 0x1000ï¼ååºè¡¨çåç§»å°åè§ CONFIG_PARTITION_TABLE_OFFSETã
Name åæ®µå¯ä»¥æ¯ä»»ä½ææä¹çåç§°ï¼ä½ä¸è½è¶ è¿ 16 个åèï¼å ¶ä¸å æ¬ä¸ä¸ªç©ºåèï¼ä¹åçå 容å°è¢«æªæï¼ãè¯¥åæ®µå¯¹ ESP32 并䏿¯ç¹å«éè¦ã
Type åæ®µïType åæ®µå¯ä»¥æå®ä¸ºåç§°ææ°å 0ï½254ï¼æè åå è¿å¶ 0x00-0xFEï¼ã注æï¼ä¸å¾ä½¿ç¨é¢çç» ESP-IDF æ ¸å¿åè½ç 0x00-0x3Fã
app
(0x00)ï¼
data
(0x01)ï¼
bootloader
(0x02)ã该ååºä¸ºå¯é项ä¸ä¸ä¼å½±åç³»ç»åè½ï¼å æ¤é»è®¤æ
åµä¸ï¼è¯¥ååºä¸ä¼åºç°å¨ ESP-IDF çä»»ä½ CSV ååºè¡¨æä»¶ä¸ï¼ä»
å¨å¼å¯¼å è½½ç¨åº OTA æ´æ°å flash ååºæ¶æç¨ãå³ä½¿ CSV æä»¶ä¸æ²¡æè¯¥ååºï¼ä»ç¶å¯ä»¥æ§è¡ OTAã
partition_table
(0x03)ãé»è®¤æ
åµä¸ï¼è¯¥ååºä¹ä¸ä¼åºç°å¨ ESP-IDF çä»»ä½ CSV ååºè¡¨æä»¶ä¸ã
0x40-0xFE é¢çç» èªå®ä¹ååºç±»åãå¦æä½ çåºç¨ç¨åºéè¦ä»¥ ESP-IDF å°æªæ¯æçæ ¼å¼å卿°æ®ï¼è¯·å¨ 0x40-0xFE å æ·»å ä¸ä¸ªèªå®ä¹ååºç±»åã
å
³äº app
å data
ååºçæä¸¾å®ä¹ï¼è¯·åè esp_partition_type_t
ã
å¦æç¨ C++ ç¼åï¼é£ä¹æå®ä¸ä¸ªåºç¨ç¨åºå®ä¹çååºç±»åï¼éè¦å¨ esp_partition_type_t
ä¸ä½¿ç¨æ´æ°ï¼ä»èä¸ ååº API ä¸èµ·ä½¿ç¨ãä¾å¦ï¼
static const esp_partition_type_t APP_PARTITION_TYPE_A = (esp_partition_type_t)0x40;
注æï¼å¼å¯¼å è½½ç¨åºä¼å¿½ç¥ app
(0x00) å data
(0x01) 以å¤çå
¶ä»ååºç±»åã
SubType åæ®µé¿åº¦ä¸º 8 bitï¼å
容ä¸å
·ä½ååº Type æå
³ãç®åï¼ESP-IDF ä»
ä»
è§å®äº app
å data
两ç§ååºç±»åçåç±»åå«ä¹ã
åè esp_partition_subtype_t
ï¼ä»¥äºè§£ ESP-IDF å®ä¹çå
¨é¨åç±»åå表ï¼å
æ¬ï¼
å½ Type å®ä¹ä¸º app
æ¶ï¼SubType åæ®µå¯ä»¥æå®ä¸º factory
(0x00)ãota_0
(0x10) ⦠ota_15
(0x1F) æ test
(0x20)ã
å½ Type å®ä¹ä¸º bootloader
æ¶ï¼å¯ä»¥å° SubType åæ®µæå®ä¸ºï¼
primary
(0x00)ï¼å³äºçº§å¼å¯¼å è½½ç¨åºï¼ä½äº flash ç 0x1000 å°åå¤ãå·¥å ·ä¼èªå¨ç¡®å®æ¤åç±»åçéå½å¤§å°ååç§»éï¼å æ¤ä¸ºæ¤åç±»åæå®çä»»ä½å¤§å°æåç§»éå°è¢«å¿½ç¥ãä½ å¯ä»¥å°è¿äºå段ç空æä½¿ç¨N/A
ä½ä¸ºå ä½ç¬¦ã
ota
(0x01)ï¼æ¯ä¸ä¸ªä¸´æ¶çå¼å¯¼å è½½ç¨åºååºï¼å¨ OTA æ´æ°æé´å¯ç¨äºä¸è½½æ°çå¼å¯¼å è½½ç¨åºéåãå·¥å ·ä¼å¿½ç¥æ¤åç±»åç大å°ï¼ä½ å¯ä»¥å°å ¶ç空æä½¿ç¨N/A
ãä½ åªè½æå®ä¸ä¸ªåç§»éï¼æè å°å ¶ç空ï¼å·¥å ·å°æ ¹æ®å å使ç¨çååºçåç§»éè¿è¡è®¡ç®ã
recovery
(0x02)ï¼è¿æ¯ç¨äºå®å ¨æ§è¡å¼å¯¼å è½½ç¨åº OTA æ´æ°çæ¢å¤å¼å¯¼å è½½ç¨åºååºãgen_esp32part.py
å·¥å ·ä¼èªå¨ç¡®å®è¯¥ååºçå°åå大å°ï¼å æ¤å¯ä»¥å°è¿äºå段ç空æä½¿ç¨N/A
ä½ä¸ºå ä½ç¬¦ã该ååºå°åå¿ é¡»ä¸ Kconfig é项å®ä¹ç eFuse åæ®µç¸å¹é ã妿æ£å¸¸çå¼å¯¼å è½½ç¨åºå 载路å¾å¤±è´¥ï¼åä¸çº§ (ROM) å¼å¯¼å è½½ç¨åºä¼å°è¯å è½½ eFuse åæ®µæå®å°åçæ¢å¤ååºãå¼å¯¼å è½½ç¨åºç±»åç大å°ç±
gen_esp32part.py
å·¥å ·æ ¹æ®æå®ç--offset
ï¼ååºè¡¨åç§»éï¼å--primary-partition-offset
åæ°è®¡ç®å¾åºãå ·ä½æ¥è¯´ï¼å¼å¯¼å è½½ç¨åºç大å°å®ä¹ä¸º (CONFIG_PARTITION_TABLE_OFFSET - 0x1000)ãæ¤è®¡ç®å¾åºç大å°éç¨äºå¼å¯¼å è½½ç¨åºçææåç±»åã
å½ Type å®ä¹ä¸º partition_table
æ¶ï¼å¯ä»¥å° SubType åæ®µæå®ä¸ºï¼
primary
(0x00)ï¼æ¯ä¸»ååºè¡¨ï¼ä½äº flash ç CONFIG_PARTITION_TABLE_OFFSET å°åå¤ãå·¥å ·ä¼èªå¨ç¡®å®æ¤åç±»åçéå½å¤§å°ååç§»éï¼å æ¤ä¸ºæ¤åç±»åæå®çä»»ä½å¤§å°æåç§»éå°è¢«å¿½ç¥ãä½ å¯ä»¥å°è¿äºå段ç空æä½¿ç¨N/A
ä½ä¸ºå ä½ç¬¦ã
ota
(0x01)ï¼æ¯ä¸ä¸ªä¸´æ¶çååºè¡¨ååºï¼å¨ OTA æ´æ°æé´å¯ç¨äºä¸è½½æ°çååºè¡¨éåãå·¥å ·ä¼å¿½ç¥æ¤åç±»åç大å°ï¼ä½ å¯ä»¥å°å ¶ç空æä½¿ç¨N/A
ãä½ å¯ä»¥æå®ä¸ä¸ªåç§»éï¼æè å°å ¶ç空ï¼å·¥å ·å°æ ¹æ®å ååé çååºçåç§»éè¿è¡è®¡ç®ã
partition_table
ç大å°åºå®ä¸º0x1000
ï¼éç¨äºpartition_table
çææåç±»åã
å½ Type å®ä¹ä¸º 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 ç¨äºåå¨åºå设置æ¶ï¼å»ºè®®å°è¿äºè®¾ç½®ä¿åå¨åç¬çåªè¯» NVS ååºä¸ãåªè¯» NVS ååºæå°ä¸º 0x1000 åèãæå ³æ´å¤è¯¦æ ï¼è¯·åé åªè¯» NVS äºè§£è¯¦æ ãESP-IDF æä¾äº NVS ååºçæå·¥å ·ï¼è½å¤çæå å«åºå设置ç NVS ååºï¼å¹¶ä¸åºç¨ç¨åºä¸èµ·ç§å½ã
nvs_keys
(4) æ¯ NVS ç§é¥ååºã详ç»ä¿¡æ¯ï¼è¯·åè éæå¤±æ§åå¨ (NVS) API ææ¡£ã
ç¨äºåå¨å å¯å¯é¥ï¼å¦æå¯ç¨äº NVS å å¯ åè½ï¼ã
æ¤ååºåºè³å°è®¾å®ä¸º 4096 åèã
妿ååºç±»åæ¯ç±åºç¨ç¨åºå®ä¹çä»»æå¼ (0x40-0xFE)ï¼é£ä¹ subtype
åæ®µå¯ä»¥æ¯ç±åºç¨ç¨åºéæ©çä»»ä½å¼ (0x00-0xFE)ã
请注æï¼å¦æç¨ C++ ç¼åï¼åºç¨ç¨åºå®ä¹çåç±»åå¼éè¦è½¬æ¢ä¸º
esp_partition_type_t
ï¼ä»èä¸ ååº API ä¸èµ·ä½¿ç¨ã
ç»ä»¶å¯ä»¥éè¿è®¾ç½® EXTRA_PARTITION_SUBTYPES
屿§æ¥å®ä¹é¢å¤çååºåç±»åã EXTRA_PARTITION_SUBTYPES
æ¯ä¸ä¸ª CMake å表ï¼å
¶ä¸çæ¯ä¸ªæ¡ç®ç±åç¬¦ä¸²ç»æï¼ä»¥éå·ä¸ºåéï¼æ ¼å¼ä¸º <type>, <subtype>, <value>
ãæå»ºç³»ç»éè¿è¯¥å±æ§ä¼èªå¨æ·»å é¢å¤çåç±»åï¼å¹¶å¨ esp_partition_subtype_t
䏿å
¥å为 ESP_PARTITION_SUBTYPE_<type>_<subtype>
çåæ®µã项ç®å¯ä»¥ä½¿ç¨è¿ä¸ªåç±»åæ¥å®ä¹ååºè¡¨ CSV æä»¶ä¸çååºï¼å¹¶ä½¿ç¨ esp_partition_subtype_t
ä¸çæ°å段ã
åç§»å°å表示 SPI flash ä¸çååºå°åï¼æåºå¤§å°ä¸º 0x1000 (4 KB)ãå æ¤ï¼åç§»å°åå¿ é¡»æ¯ 4 KB çåæ°ã
è¥ CSV æä»¶ä¸çååºåç§»å°å为空ï¼å该ååºä¼æ¥å¨åä¸ä¸ªååºä¹åï¼è¥ä¸ºé¦ä¸ªååºï¼åå°æ¥å¨ååºè¡¨ä¹åã
app
ååºçåç§»å°åå¿
é¡»ä¸ 0x10000 (64 KB) 对é½ã妿åç§»åæ®µç空ï¼å gen_esp32part.py
å·¥å
·ä¼èªå¨è®¡ç®å¾å°ä¸ä¸ªæ»¡è¶³å¯¹é½è¦æ±çåç§»å°åã妿 app
ååºçåç§»å°å没æä¸ 0x10000 (64 KB) 对é½ï¼å该工å
·ä¼æ¥éã
app
ååºç大å°å¿
é¡»ä¸ flash æåºå¤§å°å¯¹é½ã为 app
ååºæå®æªå¯¹é½ç大å°å°è¿åé误ã
è¥å¯ç¨äº Secure Boot V1ï¼å app
ååºç大å°éä¸ 0x10000 (64 KB) 对é½ã
bootloader
çåç§»éå大å°ä¸å Secure Boot V1 é项çå½±åãæ è®ºæ¯å¦å¯ç¨ Secure Boot V1ï¼å¼å¯¼å è½½ç¨åºç大å°ä¿æä¸åï¼å¹¶ä¸ä¸å
æ¬å®å
¨æè¦ï¼å®å
¨æè¦ä½äº flash ç 0x0 åç§»å°åå¤ï¼å ç¨ä¸ä¸ªæåºï¼4096 åèï¼ã
app
ååºç大å°ååç§»å°åå¯ä»¥éç¨åè¿å¶æ°ææ¯ä»¥ 0x 为åç¼çåå
è¿å¶æ°ï¼ä¸æ¯æ K æ M çåæ°åä½ï¼K å M åå«ä»£è¡¨ 1024 å 1024*1024 åèï¼ã
å¯¹äº bootloader
å partition_table
ï¼å¨ CSV æä»¶ä¸å°å¤§å°ååç§»éæå®ä¸º N/A
æå³çè¿äºå¼å°ç±å·¥å
·èªå¨ç¡®å®ï¼æ æ³æå¨å®ä¹ãè¿éè¦è®¾ç½® gen_esp32part.py
å·¥å
·ç --offset
å --primary-partition-offset
åæ°ã
夿³¨
å¦æä½ å¸æååºè¡¨ä¸å个ååºçåç§»å°åæ¯ç¸å¯¹äºååºè¡¨æ¬èº«çä½ç½® (ç± CONFIG_PARTITION_TABLE_OFFSET æå®)ï¼è¯·å°ååºè¡¨ï¼CSV æä»¶ï¼ä¸ææååºçåç§»åæ®µé½ç空ãè¿æ ·ï¼å¨æ´æ¹ååºè¡¨çåç§»å°åæ¶ï¼ç空çååºåç§»å°åä¼èªå¨ååºç¸åºçæ¹åãèå¦æä½ å¨æä¸ªååºéç¨äºåºå®çåç§»å¼ï¼å°±å¯è½ä¸ååºè¡¨åçå²çªï¼å¯¼è´æ¥éã
Flags åæ®µïç®åæ¯æ encrypted
å readonly
æ è®°ï¼
妿 Flags åæ®µè®¾ç½®ä¸º
encrypted
ï¼ä¸å·²å¯ç¨ flash å å¯ åè½ï¼å该ååºå°ä¼è¢«å å¯ã夿³¨
æ 论æ¯å¦è®¾ç½® Flags åæ®µï¼å½å¯ç¨äº flash å å¯ åè½æ¶ï¼ä»¥ä¸ç±»åçååºå°å§ç»ä¿æå å¯ç¶æã
app
ï¼
bootloader
ï¼
partition_table
ï¼type
data
å subtypeota
ï¼type
data
å subtypenvs_keys
ã
妿 Flags åæ®µè®¾ç½®ä¸º
readonly
ï¼å该ååºä¸ºåªè¯»ååºãreadonly
æ è®°ä» æ¯æé¤ota
åcoredump
åç±»åå¤çdata
ååºã使ç¨è¯¥æ è®°ï¼é²æ¢æå¤åå ¥å¦åºåæ°æ®ååºçå å«å ³é®è®¾å¤ç¹å®é ç½®æ°æ®çååºã夿³¨
å¨ä»»ä½åå ¥æ¨¡å¼ä¸ (
w
ãw+
ãa
ãa+
ãr+
)ï¼å°è¯éè¿ C æä»¶ I/O API æå¼æä»¶ (fopen
) çæä½é½å°å¤±è´¥å¹¶è¿åNULL
ãé¤O_RDONLY
å¤ï¼open
ä¸ä»»ä½æ å¿ä¸å使ç¨é½å°å¤±è´¥å¹¶è¿å-1
ï¼å ¨å±åéerrno
ä¹å°è®¾ç½®ä¸ºEROFS
ãä¸è¿°æ åµåæ ·éç¨äºéè¿å ¶ä» POSIX ç³»ç»è°ç¨å½æ°æ§è¡åå ¥ææ¦é¤çæä½ãå¨åªè¯»ååºä¸ï¼ä»¥è¯»åæ¨¡å¼æå¼ NVS ç奿å°å¤±è´¥å¹¶è¿åESP_ERR_NOT_ALLOWED
é误代ç ï¼ä½¿ç¨esp_partition
æspi_flash
çè¾ä½çº§å«ç API è¿è¡åå ¥æä½ä¹å°è¿åESP_ERR_NOT_ALLOWED
é误代ç ã
å¯ä»¥ä½¿ç¨åå·è¿æ¥ä¸åçæ è®°ï¼æ¥åæ¶æå®å¤ä¸ªæ è®°ï¼å¦ encrypted:readonly
ã
ç§åå° ESP32 ä¸çååºè¡¨éç¨äºè¿å¶æ ¼å¼ï¼è䏿¯ CSV æä»¶æ¬èº«ãæ¤æ¶ï¼partition_table/gen_esp32part.py å·¥å ·å¯ä»¥å®ç° CSV åäºè¿å¶æä»¶ä¹é´ç转æ¢ã
å¦æä½ å¨é¡¹ç®é
ç½®èåï¼idf.py menuconfig
ï¼ä¸è®¾ç½®äºååºè¡¨ CSV æä»¶çåç§°ï¼ç¶åæå»ºé¡¹ç®ææ§è¡ idf.py partition-table
ãè¿æ¶ï¼è½¬æ¢å°å¨ç¼è¯è¿ç¨ä¸èªå¨å®æã
æå¨å° CSV æä»¶è½¬æ¢ä¸ºäºè¿å¶æä»¶ï¼
python gen_esp32part.py input_partitions.csv binary_partitions.bin
æå¨å°äºè¿å¶æä»¶è½¬æ¢ä¸º CSV æä»¶ï¼
python gen_esp32part.py binary_partitions.bin input_partitions.csv
卿 åè¾åº (stdout) ä¸ï¼æå°äºè¿å¶ååºè¡¨çå
容ï¼è¿è¡ idf.py partition-table
æ¶å±ç¤ºçä¿¡æ¯æè¦ä¹æ¯è¿æ ·çæçï¼ï¼
python gen_esp32part.py binary_partitions.binååºå¤§å°æ£æ¥ï
ESP-IDF æå»ºç³»ç»å°èªå¨æ£æ¥çæçäºè¿å¶æä»¶å¤§å°ä¸å¯ç¨çååºå¤§å°æ¯å¦å¹é ï¼å¦æäºè¿å¶æä»¶å¤ªå¤§ï¼åä¼æå»ºå¤±è´¥å¹¶æ¥éã
ç®åä¼å¯¹ä»¥ä¸äºè¿å¶æä»¶è¿è¡æ£æ¥ï¼
å¼å¯¼å è½½ç¨åºçäºè¿å¶æä»¶ç大å°è¦éåååºè¡¨åçåºå大å°ï¼ååºè¡¨åçåºåé½åé ç»äºå¼å¯¼å è½½ç¨åºï¼ï¼å ·ä½è¯·åè å¼å¯¼å è½½ç¨åºå¤§å°ã
åºç¨ç¨åºäºè¿å¶æä»¶åºè³å°éåä¸ä¸ª âapp" ç±»åçååºã妿ä¸éåä»»ä½åºç¨ç¨åºååºï¼åä¼æå»ºå¤±è´¥ã妿åªéåæäºåºç¨ç¨åºååºï¼å伿å°ç¸å ³è¦åã
夿³¨
å³ä½¿ååºå¤§å°æ£æ¥è¿åéè¯¯å¹¶å¯¼è´æå»ºå¤±è´¥ï¼ä»ç¶ä¼çæå¯ä»¥ç§å½çäºè¿å¶æä»¶ï¼å®ä»¬å¯¹äºå¯ç¨ç©ºé´æ¥è¯´è¿å¤§ï¼å æ¤æ æ³æ£å¸¸å·¥ä½ï¼ã
MD5 æ ¡éªåïäºè¿å¶æ ¼å¼çååºè¡¨ä¸å«æä¸ä¸ª MD5 æ ¡éªåãè¿ä¸ª MD5 æ ¡éªåæ¯æ ¹æ®ååºè¡¨å 容计ç®çï¼å¯å¨è®¾å¤å¯å¨é¶æ®µï¼ç¨äºéªè¯ååºè¡¨ç宿´æ§ã
ç¨æ·å¯éè¿ gen_esp32part.py
ç --disable-md5sum
é项æè
CONFIG_PARTITION_TABLE_MD5 é项å
³é MD5 æ ¡éªãå¯¹äº ESP-IDF v3.1 çæ¬åçå¼å¯¼å è½½ç¨åºï¼å 为å®ä¸æ¯æ MD5 æ ¡éªï¼æä»¥æ æ³æ£å¸¸å¯å¨å¹¶æ¥é invalid magic number 0xebeb
ï¼æ¤æ¶ç¨æ·å¯ä»¥ä½¿ç¨æ¤é项å
³é MD5 æ ¡éªã
idf.py partition-table-flash
ï¼ä½¿ç¨ esptool.py å·¥å
·ç§åååºè¡¨ã
idf.py flash
ï¼ä¼ç§åææå
容ï¼å
æ¬ååºè¡¨ã
卿§è¡ idf.py partition-table
å½ä»¤æ¶ï¼æå¨ç§åååºè¡¨çå½ä»¤ä¹å°æå°å¨ç»ç«¯ä¸ã
夿³¨
ååºè¡¨çæ´æ°å¹¶ä¸ä¼æ¦é¤æ ¹æ®æ§ååºè¡¨åå¨çæ°æ®ãæ¤æ¶ï¼å¯ä»¥ä½¿ç¨ idf.py erase-flash
å½ä»¤æè
esptool.py erase_flash
å½ä»¤æ¥æ¦é¤ flash ä¸çææå
容ã
parttool.py
)ï
partition_table ç»ä»¶ä¸æååºå·¥å · parttool.pyï¼å¯ä»¥å¨ç®æ 设å¤ä¸å®æååºç¸å ³æä½ãè¯¥å·¥å ·æå¦ä¸ç¨éï¼
读åååºï¼å°å 容åå¨å°æä»¶ä¸ (read_partition)
å°æä»¶ä¸çå 容åè³ååº (write_partition)
æ¦é¤ååº (erase_partition)
æ£ç´¢ç¹å®ååºçåç§°ãåç§»ã大å°å flagï¼âå å¯âï¼æ å¿çä¿¡æ¯ (get_partition_info)
ç¨æ·è¥æ³éè¿ç¼ç¨æ¹å¼å®æç¸å ³æä½ï¼å¯ä»å¦ä¸ä¸ª Python èæ¬å¯¼å ¥å¹¶ä½¿ç¨ååºå·¥å ·ï¼æè ä» Shell èæ¬è°ç¨ååºå·¥å ·ãåè å¯ä½¿ç¨å·¥å ·ç Python APIï¼åè å¯ä½¿ç¨å½ä»¤è¡çé¢ã
Python APIïé¦å 请确ä¿å·²å¯¼å ¥ parttool 模åã
import sys import os idf_path = os.environ["IDF_PATH"] # ä»ç¯å¢ä¸è·å IDF_PATH çå¼ parttool_dir = os.path.join(idf_path, "components", "partition_table") # parttool.py ä½äº $IDF_PATH/components/partition_table ä¸ sys.path.append(parttool_dir) # ä½¿è½ Python å¯»æ¾ parttool 模å from parttool import * # å¯¼å ¥ parttool 模åå çææåç§°
è¦ä½¿ç¨ååºå·¥å ·ç Python APIï¼ç¬¬ä¸æ¥æ¯å建 ParttoolTargetï¼
# å建 parttool.py çç®æ 设å¤ï¼å¹¶å°ç®æ 设å¤è¿æ¥å°ä¸²è¡ç«¯å£ /dev/ttyUSB1 target = ParttoolTarget("/dev/ttyUSB1")
ç°å¨ï¼å¯ä½¿ç¨å建ç ParttoolTarget å¨ç®æ 设å¤ä¸å®ææä½ï¼
# æ¦é¤å为 'storage' çååº target.erase_partition(PartitionName("storage")) # 读åç±»å为 'data'ãåç±»å为 'spiffs' çååºï¼ä¿åè³æä»¶ 'spiffs.bin' target.read_partition(PartitionType("data", "spiffs"), "spiffs.bin") # å° 'factory.bin' æä»¶çå 容åè³ 'factory' ååº target.write_partition(PartitionName("factory"), "factory.bin") # æå°é»è®¤å¯å¨ååºçå¤§å° storage = target.get_partition_info(PARTITION_BOOT_DEFAULT) print(storage.size)
ä½¿ç¨ PartitionNameãPartitionType æ PARTITION_BOOT_DEFAULT æå®è¦æä½çååºã顾åæä¹ï¼è¿ä¸ä¸ªåæ°å¯ä»¥æåæ¥æç¹å®åç§°çååºãç¹å®ç±»åååç±»åçååºæé»è®¤å¯å¨ååºã
æ´å¤å ³äº Python API çä¿¡æ¯ï¼è¯·æ¥çååºå·¥å ·çä»£ç æ³¨éã
å½ä»¤è¡çé¢ïparttool.py çå½ä»¤è¡çé¢å ·æå¦ä¸ç»æï¼
parttool.py [command-args] [subcommand] [subcommand-args] - command-args - æ§è¡ä¸»å½ä»¤ (parttool.py) æéçå®é åæ°ï¼å¤ä¸ç®æ è®¾å¤æå ³ - subcommand - è¦æ§è¡çæä½ - subcommand-args - æéæä½çå®é åæ°
# æ¦é¤å为 'storage' çååº parttool.py --port "/dev/ttyUSB1" erase_partition --partition-name=storage # 读åç±»å为 'data'ãåç±»å为 'spiffs' çååºï¼ä¿åå° 'spiffs.bin' æä»¶ parttool.py --port "/dev/ttyUSB1" read_partition --partition-type=data --partition-subtype=spiffs --output "spiffs.bin" # å° 'factory.bin' æä»¶ä¸çå 容åå ¥å° 'factory' ååº parttool.py --port "/dev/ttyUSB1" write_partition --partition-name=factory --input "factory.bin" # æå°é»è®¤å¯å¨ååºçå¤§å° parttool.py --port "/dev/ttyUSB1" get_partition_info --partition-boot-default --info size
夿³¨
å¦æè®¾å¤å¯ç¨äº Flash Encryption
æ Secure Boot
ï¼å°è¯ä½¿ç¨ä¿®æ¹ flash å
容çå½ä»¤ï¼å¦ erase_partition
æ write_partition
ï¼ä¼å¯¼è´é误ãè¿æ¯å 为 esptool.py
çæ¦é¤å½ä»¤ä¼å¨åå
¥ä¹åå
被è°ç¨ãè¿ä¸ªâé误âå®é
䏿¯ä¸ä¸ªç¨æ¥é²æ¢è®¾å¤åç çå®å
¨æªæ½ã
A fatal error occurred: Active security features detected, erasing flash is disabled as a safety measure. Use --force to override, please use with caution, otherwise it may brick your device!
è¦è§£å³æ¤é®é¢ï¼éå¨è¿è¡ esptool.py
æ¶ä½¿ç¨ --force
åæ°ãå
·ä½èè¨ï¼parttool.py
æä¾äº --esptool-erase-args
åæ°ï¼ç¨æ¥å° --force
åæ°ä¼ éç» esptool.py
ã
# æ¦é¤å为 'storage' çååº # 妿å¯ç¨äº Flash Encryption æ Secure Bootï¼åæ·»å "--esptool-erase-args=force" parttool.py --port "/dev/ttyUSB1" --esptool-erase-args=force erase_partition --partition-name=storage # å°å为 'factory.bin' çæä»¶å 容åå ¥ 'factory' ååº # 妿å¯ç¨äº Flash Encryption æ Secure Bootï¼åæ·»å "--esptool-erase-args=force" parttool.py --port "/dev/ttyUSB1" --esptool-erase-args=force write_partition --partition-name=factory --input "factory.bin"
æ´å¤ä¿¡æ¯å¯ç¨ --help æä»¤æ¥çï¼
# æ¾ç¤ºå¯ç¨çåå½ä»¤å主å½ä»¤æè¿° parttool.py --help # æ¾ç¤ºåå½ä»¤çæè¿° parttool.py [subcommand] --help
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4