尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP-IDF 实战:ESP32-C61 eFuse 全量转储(efuse-dump)输出逐字解析

ESP-IDF 实战:ESP32-C61 eFuse 全量转储(efuse-dump)输出逐字解析 ESP-IDF 实战ESP32-C61 eFuse 全量转储efuse-dump输出逐字解析【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf导读eFuse电子熔丝是 ESP32-C61 上一次性可编程的存储单元承载 MAC 地址、芯片版本、安全启动、Flash 加密等系统与安全关键参数。本文以 ESP-IDF 官方文档中的 ESP32-C61 eFuse 转储示例espefuse_summary_ESP32-C61_dump.rst为骨架逐行讲解idf.py efuse-dump命令的输出格式、11 个 eFuse 块的职责划分、原始寄存器值与可读字段如 MAC 地址之间的对应关系并结合 esp_efuse_table.csv 与 eFuse Manager 源码说明字段定义与生成机制。读完本文你将能够独立解读任意 ESP32-C61 芯片的 eFuse 转储结果并能在 dump原始比特与 summary解码字段两种视图之间自由切换。一、背景eFuse、eFuse Manager 与 efuse-dump 命令在深入输出之前先厘清三个概念eFuseESP32-C61 芯片内的一次性可编程熔丝每个 eFuse 位只能从 0 烧写为 1无法回退。位按 256 位一组组织成块block每块又划分为 8 个 32 位寄存器。eFuse ManagerESP-IDF 中负责定义、烧写、读取 eFuse 参数的组件核心组成包括用 CSV 表定义字段的格式、efuse_table_gen.py代码生成工具以及一套读写 eFuse 字段的 C API详见 efuse.rst。idf.py efuse-*命令idf.py封装了 espefuse 工具的常用功能。其中idf.py efuse-dump等价于espefuse dump用于转储所有 eFuse 寄存器的原始值而idf.py efuse-summary等价于espefuse summary用于展示解码后的字段含义。两者是同一份硬件数据的两种视图dump 面向原始比特summary 面向人类可读的字段。二、完整输出示例原文档核心内容在项目目录下连接 ESP32-C61 开发板以/dev/ttyUSB0为例后执行idf.py -p /dev/ttyUSB0 efuse-dump espefuse v5.0.2 Executing action: efuse-dump Running espefuse in directory project-directory Executing espefuse dump --chip esp32c61... Connecting.... Run dump command BLOCK0 ( ) [0 ] dump: 00000000 00000000 00000000 00000000 0000fc00 00000000 MAC_SPI_8M_0 (BLOCK1 ) [1 ] dump: a0e52520 000030ed 00000010 00000000 00000000 00000000 BLOCK_SYS_DATA (BLOCK2 ) [2 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_USR_DATA (BLOCK3 ) [3 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_KEY0 (BLOCK4 ) [4 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_KEY1 (BLOCK5 ) [5 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_KEY2 (BLOCK6 ) [6 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_KEY3 (BLOCK7 ) [7 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_KEY4 (BLOCK8 ) [8 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_KEY5 (BLOCK9 ) [9 ] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 BLOCK_SYS_DATA2 (BLOCK10 ) [10] dump: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000输出结构解读第一列为块名如MAC_SPI_8M_0、BLOCK_USR_DATA第二列为块编号BLOCK0~BLOCK10方括号内为块索引号[0]~[10]dump:之后是该块各 32 位寄存器的十六进制值每行按寄存器序号自低到高排列。该文件被 efuse.rst 通过.. include:: inc/espefuse_summary_{IDF_TARGET_NAME}_dump.rst机制按目标芯片自动嵌入中文版对应文件位于 docs/zh_CN/api-reference/system/inc/espefuse_summary_ESP32-C61_dump.rst。三、逐块解读ESP32-C61 的 11 个 eFuse 块ESP32-C61 共 11 个 eFuse 块每块 256 位。从转储结果可以清晰看到各块的职责分工3.1 BLOCK0 —— 系统配置与安全策略区BLOCK0承担系统与安全配置字段包括写保护WR_DIS32 位每一位对应一个或一组字段的永久写保护一旦某位烧写为 1对应字段再也不能被修改。读保护RD_DIS7 位分别禁止读取 BLOCK4~BLOCK10即 KEY0~KEY5 与 SYS_DATA2。功能开关类DIS_ICACHE禁用指令缓存、DIS_DIRECT_BOOT禁用直接启动模式、UART_PRINT_CONTROLUART 打印类型控制、DIS_WIFI6禁用 WiFi 6、HYS_EN_PADPAD0~27 迟滞功能、ECC_FORCE_CONST_TIME强制 ECC 常量时间计算。安全相关SPI_BOOT_CRYPT_CNTFlash 加密使能计数置 1 或 3 位时启用 Flash 加密、SECURE_BOOT_EN安全启动使能、SECURE_BOOT_KEY_REVOKE0/1/2吊销 1~3 号安全启动密钥、KEY_PURPOSE_0~KEY_PURPOSE_5六个密钥块的用途定义、SEC_DPA_LEVEL、XTS_DPA_CLK_ENABLE、XTS_DPA_PSEUDO_LEVEL、ECDSA_DISABLE_P192、SECURE_VERSIONESP-IDF 防回滚版本号、ENABLE_SECURITY_DOWNLOAD、DIS_DOWNLOAD_MODE、DIS_FORCE_DOWNLOAD、SPI_DOWNLOAD_MSPI_DIS、DIS_DOWNLOAD_MANUAL_ENCRYPT等。启动与恢复BOOTLOADER_ANTI_ROLLBACK_EN、BOOTLOADER_ANTI_ROLLBACK_UPDATE_IN_ROM、BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION、RECOVERY_BOOTLOADER_FLASH_SECTOR恢复引导加载器起始 Flash 扇区默认 10080 或 0xFFF 表示禁用该特性。保留区REPEAT_DATA4保留 24 位。本例中BLOCK0第五个寄存器为0000fc00高 16 位全 1正是出厂时预烧写的保留位REPEAT_DATA4区域也是新片 BLOCK0 中唯一非零的内容可作为“全新芯片”的判据之一。3.2 BLOCK1MAC_SPI_8M_0—— 身份、版本与存储介质信息MAC_SPI_8M_0混合存放身份与介质参数MAC48 位出厂 MAC 地址版本字段WAFER_VERSION_MINOR次版本、WAFER_VERSION_MAJOR主版本、DISABLE_WAFER_VERSION_MAJOR、DISABLE_BLK_VERSION_MAJOR、BLK_VERSION_MINOR、BLK_VERSION_MAJOR介质参数FLASH_CAPFlash 容量、FLASH_VENDORFlash 厂商、PSRAM_CAP、PSRAM_VENDOR、TEMP温度封装信息PKG_VERSION封装版本。3.3 BLOCK2BLOCK_SYS_DATA—— 系统数据含可选唯一 ID存放OPTIONAL_UNIQUE_ID可选 128 位唯一 ID从 32 字节显示中取前 16 字节以及温度传感器、ADC 校准等系统标定数据。该块字段的完整位布局可在 show-efuse-table_ESP32-C61.rst 中查看OPTIONAL_UNIQUE_ID位于EFUSE_BLK2位 0~127其后为TEMPERATURE_SENSOR、OCODE、ADC1_*系列校准字段。3.4 BLOCK3BLOCK_USR_DATA—— 用户数据区整块 256 位可供用户自定义参数使用其中位 200~247 预留给CUSTOM_MAC自定义 MAC 地址子字段。向该块追加字段需通过自定义 CSV 表esp_efuse_custom_table.csv实现详见下文“字段定义与生成”。3.5 BLOCK4~BLOCK9BLOCK_KEY0~KEY5—— 密钥块六个 256 位密钥块用于存放 Secure Boot 密钥或 Flash 加密密钥若不使用这两项功能也可作为普通用户数据。每个密钥块的用途由 BLOCK0 中的KEY_PURPOSE_0~KEY_PURPOSE_5字段声明本例均为USER。转储中它们全为 0表示尚未写入任何密钥。3.6 BLOCK10BLOCK_SYS_DATA2—— 系统数据第二部分保留整块 256 位保留给系统使用即 esp_efuse_table.csv 中的SYS_DATA_PART2字段不用于用户参数。四、从原始寄存器到可读字段MAC 地址实例dump 给出的是原始比特必须结合字段表才能解读。以本例 BLOCK1 为例MAC_SPI_8M_0 (BLOCK1) [1] dump: a0e52520 000030ed 00000010 00000000 00000000 00000000而同一颗芯片执行idf.py efuse-summary时espefuse_summary_ESP32-C61.rst 中对应输出为Mac fuses: MAC (BLOCK1) MAC address 30:ed:a0:e5:25:20 (OK) R/W两者如何对应eFuse 位序为小端序little endian位从 LSB 到 MSB 读写。BLOCK1 的MAC字段占据位 0~47跨前两个寄存器寄存器 0 0xa0e52520按字节小端展开为20 25 e5 a0寄存器 1 0x000030ed低 16 位展开为ed 30。按 LSB 优先连续读出原始字节序列为20 25 e5 a0 ed 30espefuse 以高位字节优先的 MAC 显示格式反转后即得30:ed:a0:e5:25:20与 summary 输出完全一致。这也是为什么 dump 中“倒着看”才能对出 MAC 地址——这是 espefuse 对 MAC 类字段的常规处理并非数据损坏。再看第三个寄存器0x00000010它对应块内位 64~95其中位 68 被置 10x10 第 4 位而WAFER_VERSION_MAJOR恰好定义在EFUSE_BLK1位 682 位宽因此 summary 显示WAFER_VERSION_MAJOR 1 (0b01)。其余FLASH_CAP、FLASH_VENDOR、PSRAM_CAP等字段均为 0与转储中对应位全零相互印证。五、字段定义与代码生成CSV 表 → C 结构要“读懂”dump本质上是把每个块的比特位对照字段表做解码。ESP32-C61 的系统字段表位于 components/efuse/esp32c61/esp_efuse_table.csv每行记录格式为# field_name, efuse_block(EFUSE_BLK0..EFUSE_BLK10), bit_start(0..255), bit_count(1..256), comment规则要点field_name前缀ESP_EFUSE_后即为 C 代码中的字段名且全表必须唯一用.可定义子字段结构化字段如WR_DIS.RD_DIS表示WR_DIS的第 0 位子字段C 符号为ESP_EFUSE_WR_DIS_RD_DISbit_start可省略缺省时自动续接上一记录要求同块bit_count不可省略MAX_BLK_LEN表示占满整块可用长度。修改 CSV 后需运行idf.py efuse-common-table系统字段或idf.py efuse-custom-table用户自定义字段可传入main/esp_efuse_custom_table.csv由 efuse_table_gen.py 生成对应的esp_efuse_table.c/.h或esp_efuse_custom_table.c/.hC 结构供应用通过#include esp_efuse.h与#include esp_efuse_table.h使用。生成前工具会校验字段名唯一性与位重叠冲突时报Field at ... intersected with ...或... out of range ...错误。如需查看 ESP32-C61 全表位分配可执行./efuse_table_gen.py -t esp32c61 components/efuse/esp32c61/esp_efuse_table.csv --info或在项目内运行idf.py show-efuse-table。输出按块列出每个字段的bit_start与bit_count完整样例见 show-efuse-table_ESP32-C61.rst方括号未覆盖的位即为空闲位可供自定义使用注意 BLOCK0 中部分位保留给乐鑫。六、编码方案与写入约束ESP32-C61 不支持选择编码方案硬件自动施加BLOCK0 使用None方案无编码但硬件内部对该块维护 4 份备份因此 BLOCK0 可多次写入BLOCK1~BLOCK10 使用RSReed-Solomon方案软件对 32 字节块数据做RS(44, 32)编码生成 12 字节校验符号后与数据一同烧写硬件读取时自动纠错。由于校验符号跨整个 256 位块生成每个块只能整体写入一次运行时写入必须使用 Batch Writing Modeesp_efuse_batch_write_begin→ 各写入 API →esp_efuse_batch_write_commit。这解释了转储输出中的一个细节示例中MAC_SPI_8M_0行仅打印 6 个 32 位字192 位而其余全零块打印 8 个字256 位——RS 编码下块内部分比特被校验符号占用可用负载并非完整的 256 位。七、实战建议dump 与 summary 如何配合场景推荐命令理由快速确认芯片配置、安全特性状态idf.py efuse-summary输出已解码的字段名、含义、可读/可写属性与十六进制值人类可读性最好查看原始寄存器值、对比位级变化idf.py efuse-dump输出逐寄存器原始 32 位字适合与数据手册寄存器定义对照确认空闲位、规划新字段idf.py show-efuse-table直接给出每块的位占用区间批量/出厂前核对espefuse summary --format json可结合espefuse_get_json_summary()等 CMake 函数在构建期读取见 efuse.rst几点提醒eFuse 烧写不可逆量产前建议先通过CONFIG_EFUSE_VIRTUAL虚拟 eFuse写操作只改 RAM 副本验证流程或借助CONFIG_EFUSE_VIRTUAL_KEEP_IN_FLASH在开发板上反复测试安全启动/Flash 加密读出值必须结合字段表解读切勿直接从 dump 的十六进制字“望文生义”MAC 地址即为例证涉及密钥块时先确认RD_DIS读保护与WR_DIS写保护状态dump/summary 均会明确标注R/W、R或W属性。八、延伸阅读仓库内路径eFuse Manager 完整指南docs/en/api-reference/system/efuse.rst含 API 参考、Batch Writing Mode、虚拟 eFuse、Token Dump 等ESP32-C61 eFuse summary 输出样例docs/en/api-reference/system/inc/espefuse_summary_ESP32-C61.rstESP32-C61 eFuse 字段位表docs/en/api-reference/system/inc/show-efuse-table_ESP32-C61.rstESP32-C61 系统字段定义CSVcomponents/efuse/esp32c61/esp_efuse_table.csv字段代码生成工具components/efuse/efuse_table_gen.py其他芯片的 dump 样例对比不同目标布局docs/en/api-reference/system/inc/ 下的espefuse_summary_*_dump.rst系列文件【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表