ESP系列杂谈(一): eFuse 简介

eFuse 是芯片中一块特殊的存储空间,它内部由熔丝相互连接。当流经的电流达到一定程度时,熔丝会被烧断,该位的值会改变。

熔丝熔断是单向的、不可恢复的。因此 eFuse 的值只能被烧写一次,只能由 0 变到 1。在烧写 eFuse 的时候,一定要十分小心,也要注意避免静电、高温等情况,以防 eFuse 被打坏。

乐鑫的芯片类型主要分为以下两类:ESP8266 系列和 ESP32 系列。

  • ESP8266 系列包括:ESP8266、ESP8285;
  • ESP32 系列包括:ESP32-D0WDQ6、ESP32-D0WD、ESP32-D2WD、ESP32-D0WDXMM、ESP8689、ESP32-PICO-D2、ESP32-PICO-D4、ESP32-PICO-D4XM。

注:由于 ESP8266 系列的芯片只有 1 个 bit 标识版本区别,ESP32 系列的芯片也只有几个 bit 标识版本区别,接下来的讨论会以 ESP8266 和 ESP32 为例,来介绍这两种芯片的 eFuse。


1. ESP8266 EFUSE 结构

ESP8266 的 EFUSE 大小为 128 bits。主要有两种结构:

  1. 通用结构:最常用的 eFuse 结构;
  2. 用户定制结构:在通用结构的基础上,用户自行烧写自定义的MAC 地址。

1.1 通用结构

eFuse_bit 位 bit 数 字段 检察规则
[127:124][3:0] [7:0] digital_use 必须为 0
[123:122] [1:0] flash 不需检查
[121] [0] SIP SIP 封装为 1,非 SIP 封装为 0
[120] [0] User_MAC 必须为 0
[119:96] [23:0] mac_h MAC 地址高 24 bit,不检查
[95:88] [7:0] mac_h_crc 需等于 mac_h 字段的 crc8 值
[87:80] [7:0] reverse_1 必须为 0
[79:76] [3:0] flag_1 必须为 10 或 11
[75:60] [15:0] reverse_2 必须为 0
[59:56] [3:0] version 必须为 2
[55:48] [7:0] mac_map 必须为 0
[47:24] [23:0] mac_l MAC 地址低 24 bit,不检查
[23:16] [7:0] crc8 等于 MAC 映射和 mac_l 的 crc8 值
[15:5] [10:0] reverse_3 必须为 0
[4] [0] flag_3 ESP8285 为 1,其他为 0

1.2 用户定制结构

用户可以将通用结构中的保留位,用来定制烧写 MAC 地址。

eFuse_bit 位 bit 数 字段 检察规则
[127:124][3:0] [7:0] digital_use 必须为0
[123:122] [1:0] flash ESP8266 必须为 0,SIP 及 ESP8285 不为 0
[120] [0] User_MAC 标志位,必须为 1
[119:96] [23:0] mac_h MAC 地址高 24 bit,不检查
[95:88] [7:0] mac_h_crc 需等于 mac_h 字段的 crc8 值
[87:80] [23:16] user_mac 不检查
[79:76] [3:0] flag_1 必须为 10 或 11
[75:60] [15:0] user_mac 不检查
[59:56] [3:0] version 必须为 2
[55:48] [7:0] mac_map 必须为 0
[47:24] [23:0] mac_l MAC 地址低 24 bit,不检查
[23:16] [7:0] crc8 等于 MAC 映射和 mac_l 的 crc8 值
[15:8] [7:0] user_mac_crc8 需等于用户定制 MAC(24bit) 的 crc8 值
[7:6] [1:0] user_mac_map 用户定制 MAC 地址高 24 bit,不检查
[5] [0] reserve_3 必须为 0
[4] [0] flag_3 ESP8285 为 1,其他为 0

1.4 ESP8266 与 ESP8285 的区别

ESP8266 与 ESP8285 的区别在于,ESP8285 内置了 1 MB 的 flash,可以节省模组上的空间。
这两种芯片在 eFuse 中几乎完全一样,只有一个 bit4(新版)/ bit80 (旧版) 标识了该芯片是 ESP8266 或是 ESP8285。


2. ESP32 eFuse 结构

ESP32 的 eFuse 大小比 ESP8266 大出很多,为 256 bit * 4,分为 4 个 BLOCK 存放 eFuse 信息。

BLOCK1-3 都由 8 个 WORD 组成,BLOCK0 由 7 个 WORD 组成,每个 WORD 大小为 32 bit,共计 256 bit。

2.1 BLOCK0

ESP32 芯片相关的信息时存放在 BLOCK0 中的。

当前对于 ESP32 eFuse 的检查,仅限于 MAC 地址和芯片类型的校验。

BLOCK0 中的 WORD1 和 WORD2 存放的就是 ESP32 的 MAC 地址与 CRC 值。

  • WORD1 中存放的是 MAC 地址的低 32 bit;
  • WORD2 中的 [15:0] 存放的是 MAC 地址的高 16 bit;
  • WORD2 中的 [23:16] 存放的是 CRC8 的值。

WORD3 的部分存放的是芯片类型标识。

  • WORD3 中的 [2] 存放的是 32pad 标识
  • WORD3 中的 [15] 存放的是 eco 标识
  • WORD3 中的 [11:9] 存放的是 version

注:eco 标识了芯片是否针对 PSRAM 进行过工厂返工。如果 eco 为 1,则芯片名称需要以 ‘E’ 结尾。

具体区分如下表:

Device Name Description 32pad version
ESP32-D0WDQ6 Original ESP32; 6*6 QFN48 0 0
ESP32-D0WD Original ESP32; 5*5 QFN48 0 1
ESP32-D2WD Original ESP32; 5*5 QFN48; 2MB ISSI flash 0 2
ESP32-D0WDXM Original ESP32 ;5*5 QFN48 ;customized efuse 0 3
ESP8689 Original ESP32; 5*5 QFN32 1 0
ESP32-PICO-D2 Original ESP32 SIP; 7*7 LGA49; 2MB ISSI Flash 0 4
ESP32-PICO-D4 Original ESP32 SIP; 7*7 LGA49; 4MB Flash(GD/MX) 0 5
ESP32-PICO-D4XM Original ESP32 SIP; 7*7 LGA49; 4MB Flash(GD/MX) 0 6

2.2 BLOCK1 & BLOCK2

这两个 BLOCK 存放的是加密相关的信息。如果启用了 flash 加密,会将密钥放在其中,且一旦打开了 flash 加密功能,BLOCK1 和 BLOCK2 就启用了读写保护,只能读出全 0 数据,无法知道实际的数据。

2.3 BLOCK3

BLOCK3 可支持用户烧写定制 MAC 地址。

eFuse_bit 位 bit 数 字段 检察规则
[184] [0] flag 若烧写定制 mac,则为 1
[183:72] [111:0] reserve 不检查
[71:8] [63:0] mac 进行过4/3编码的mac地址,不检查
[7:0] [7:0] mac_crc8 需等于 mac 地址的 crc8 值

3. ESP eFuse 使用

espefuse.py 是用于读取 ESP32 eFuse 的工具。

开头的 eFuses 详细介绍了 ESP32 完整的 BLOCK0 构成。还包括了很多对 eFuse 操作的方法:

  • dump:读取全 eFuse;
  • burn_efuse:烧写 eFuse 的某个 WORD;
  • read_protect_efuse:对某个 WORD 读保护;
  • write_protect_efuse:对某个 WORD 写保护;
  • burn_key:烧写加密的密钥;
  • and so on

调用参数与 esptool.py 接近。

例:如果需要查看 ESP32 的 eFuse,输入--port comX dump,可以得到如下反馈:

espefuse.py v2.2-dev
Connecting.....
EFUSE block 0:
00020100 a445b5f4 003730ae 00008000 00000034 00000000 00000054
EFUSE block 1:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
EFUSE block 2:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
EFUSE block 3:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

如果要查看 efuse 信息,可以在终端输入 espefuse.py --port /dev/ttyUSB0 summary

你可能感兴趣的:(ESP)