ESP-IDF 实战:ESP32-C61 eFuse 全量转储(efuse-dump)输出逐字解析
2026/9/16 11:30:16 网站建设 项目流程

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 命令

在深入输出之前,先厘清三个概念:

  • eFuse:ESP32-C61 芯片内的一次性可编程熔丝,每个 eFuse 位只能从 0 烧写为 1,无法回退。位按 256 位一组组织成块(block),每块又划分为 8 个 32 位寄存器。
  • eFuse Manager:ESP-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_0BLOCK_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_DIS(32 位):每一位对应一个(或一组)字段的永久写保护;一旦某位烧写为 1,对应字段再也不能被修改。
  • 读保护RD_DIS(7 位):分别禁止读取 BLOCK4~BLOCK10(即 KEY0~KEY5 与 SYS_DATA2)。
  • 功能开关类DIS_ICACHE(禁用指令缓存)、DIS_DIRECT_BOOT(禁用直接启动模式)、UART_PRINT_CONTROL(UART 打印类型控制)、DIS_WIFI6(禁用 WiFi 6)、HYS_EN_PAD(PAD0~27 迟滞功能)、ECC_FORCE_CONST_TIME(强制 ECC 常量时间计算)。
  • 安全相关SPI_BOOT_CRYPT_CNT(Flash 加密使能计数,置 1 或 3 位时启用 Flash 加密)、SECURE_BOOT_EN(安全启动使能)、SECURE_BOOT_KEY_REVOKE0/1/2(吊销 1~3 号安全启动密钥)、KEY_PURPOSE_0~KEY_PURPOSE_5(六个密钥块的用途定义)、SEC_DPA_LEVELXTS_DPA_CLK_ENABLEXTS_DPA_PSEUDO_LEVELECDSA_DISABLE_P192SECURE_VERSION(ESP-IDF 防回滚版本号)、ENABLE_SECURITY_DOWNLOADDIS_DOWNLOAD_MODEDIS_FORCE_DOWNLOADSPI_DOWNLOAD_MSPI_DISDIS_DOWNLOAD_MANUAL_ENCRYPT等。
  • 启动与恢复BOOTLOADER_ANTI_ROLLBACK_ENBOOTLOADER_ANTI_ROLLBACK_UPDATE_IN_ROMBOOTLOADER_ANTI_ROLLBACK_SECURE_VERSIONRECOVERY_BOOTLOADER_FLASH_SECTOR(恢复引导加载器起始 Flash 扇区,默认 1008,0 或 0xFFF 表示禁用该特性)。
  • 保留区REPEAT_DATA4(保留 24 位)。

本例中BLOCK0第五个寄存器为0000fc00,高 16 位全 1,正是出厂时预烧写的保留位(REPEAT_DATA4区域),也是新片 BLOCK0 中唯一非零的内容,可作为“全新芯片”的判据之一。

3.2 BLOCK1(MAC_SPI_8M_0)—— 身份、版本与存储介质信息

MAC_SPI_8M_0混合存放身份与介质参数:

  • MAC(48 位):出厂 MAC 地址;
  • 版本字段WAFER_VERSION_MINOR(次版本)、WAFER_VERSION_MAJOR(主版本)、DISABLE_WAFER_VERSION_MAJORDISABLE_BLK_VERSION_MAJORBLK_VERSION_MINORBLK_VERSION_MAJOR
  • 介质参数FLASH_CAP(Flash 容量)、FLASH_VENDOR(Flash 厂商)、PSRAM_CAPPSRAM_VENDORTEMP(温度);
  • 封装信息PKG_VERSION(封装版本)。

3.3 BLOCK2(BLOCK_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_SENSOROCODEADC1_*系列校准字段)。

3.4 BLOCK3(BLOCK_USR_DATA)—— 用户数据区

整块 256 位可供用户自定义参数使用,其中位 200~247 预留给CUSTOM_MAC(自定义 MAC 地址)子字段。向该块追加字段需通过自定义 CSV 表(esp_efuse_custom_table.csv)实现,详见下文“字段定义与生成”。

3.5 BLOCK4~BLOCK9(BLOCK_KEY0~KEY5)—— 密钥块

六个 256 位密钥块,用于存放 Secure Boot 密钥或 Flash 加密密钥;若不使用这两项功能,也可作为普通用户数据。每个密钥块的用途由 BLOCK0 中的KEY_PURPOSE_0~KEY_PURPOSE_5字段声明(本例均为USER)。转储中它们全为 0,表示尚未写入任何密钥。

3.6 BLOCK10(BLOCK_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 30;espefuse 以高位字节优先的 MAC 显示格式反转后即得30:ed:a0:e5:25:20,与 summary 输出完全一致。这也是为什么 dump 中“倒着看”才能对出 MAC 地址——这是 espefuse 对 MAC 类字段的常规处理,并非数据损坏。

再看第三个寄存器0x00000010:它对应块内位 64~95,其中位 68 被置 1(0x10= 第 4 位),而WAFER_VERSION_MAJOR恰好定义在EFUSE_BLK1位 68(2 位宽),因此 summary 显示WAFER_VERSION_MAJOR = 1 (0b01)。其余FLASH_CAPFLASH_VENDORPSRAM_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_DIS
  • bit_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/.h)C 结构,供应用通过#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_startbit_count(完整样例见 show-efuse-table_ESP32-C61.rst),方括号未覆盖的位即为空闲位,可供自定义使用(注意 BLOCK0 中部分位保留给乐鑫)。

六、编码方案与写入约束

ESP32-C61 不支持选择编码方案,硬件自动施加:

  • BLOCK0 使用None方案:无编码,但硬件内部对该块维护 4 份备份,因此 BLOCK0 可多次写入;
  • BLOCK1~BLOCK10 使用RS(Reed-Solomon)方案:软件对 32 字节块数据做RS(44, 32)编码生成 12 字节校验符号后与数据一同烧写,硬件读取时自动纠错。由于校验符号跨整个 256 位块生成,每个块只能整体写入一次,运行时写入必须使用 Batch Writing Mode(esp_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/WRW属性。

八、延伸阅读(仓库内路径)

  • 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.rst
  • ESP32-C61 eFuse 字段位表:docs/en/api-reference/system/inc/show-efuse-table_ESP32-C61.rst
  • ESP32-C61 系统字段定义(CSV):components/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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询