Skip to content

Commit a47e86f

Browse files
committed
feat(espefuse): Add ESP32-E22 support
1 parent ce838cd commit a47e86f

File tree

9 files changed

+1077
-9
lines changed

9 files changed

+1077
-9
lines changed

.gitlab-ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ host_tests_espefuse:
119119
- esp32s3
120120
- esp32h21
121121
- esp32h4
122+
- esp32e22
122123
script:
123124
- coverage run --parallel-mode -m pytest ${CI_PROJECT_DIR}/test/test_espefuse.py --chip ${TARGET}
124125
# some .coverage files in sub-directories are not collected on some runners, move them first
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from . import operations
2+
from .emulate_efuse_controller import EmulateEfuseController
3+
from .fields import EspEfuses
4+
5+
commands = operations.ESP32E22Commands
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# This file describes eFuses controller for ESP32-E22 chip
2+
#
3+
# SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
4+
#
5+
# SPDX-License-Identifier: GPL-2.0-or-later
6+
7+
from bitstring import BitStream
8+
import reedsolo
9+
10+
from espefuse.efuse.mem_definition_base import BlockDefinition
11+
12+
from .mem_definition import EfuseDefineBlocks, EfuseDefineFields, EfuseDefineRegisters
13+
from ..emulate_efuse_controller_base import EmulateEfuseControllerBase
14+
from esptool import FatalError
15+
16+
17+
class EmulateEfuseController(EmulateEfuseControllerBase):
18+
"""The class for virtual efuse operation. Using for HOST_TEST."""
19+
20+
CHIP_NAME = "ESP32-E22"
21+
Blocks: type[EfuseDefineBlocks]
22+
Fields: EfuseDefineFields
23+
REGS: type[EfuseDefineRegisters]
24+
25+
def __init__(self, efuse_file: str | None = None, debug: bool = False):
26+
self.Blocks = EfuseDefineBlocks
27+
self.Fields = EfuseDefineFields(None)
28+
self.REGS = EfuseDefineRegisters
29+
super().__init__(efuse_file, debug)
30+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
31+
32+
""" esptool method start >>"""
33+
34+
def get_major_chip_version(self) -> int:
35+
return 0
36+
37+
def get_minor_chip_version(self) -> int:
38+
return 0
39+
40+
def get_crystal_freq(self) -> int:
41+
return 40 # MHz (common for all chips)
42+
43+
def get_security_info(self) -> dict[str, int]:
44+
return {
45+
"flags": 0,
46+
"flash_crypt_cnt": 0,
47+
"key_purposes": 0,
48+
"chip_id": 0,
49+
"api_version": 0,
50+
}
51+
52+
""" << esptool method end """
53+
54+
def handle_writing_event(self, addr: int, value: int) -> None:
55+
if addr == self.REGS.EFUSE_CMD_REG:
56+
if value & self.REGS.EFUSE_PGM_CMD:
57+
self.copy_blocks_wr_regs_to_rd_regs(updated_block=(value >> 2) & 0xF)
58+
self.clean_blocks_wr_regs()
59+
self.check_rd_protection_area()
60+
self.write_reg(addr, 0)
61+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
62+
elif value == self.REGS.EFUSE_READ_CMD:
63+
self.write_reg(addr, 0)
64+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
65+
self.save_to_file()
66+
67+
def get_bitlen_of_block(self, blk: BlockDefinition, wr: bool = False) -> int:
68+
if blk.id == 0:
69+
if wr:
70+
return 32 * 8
71+
else:
72+
return 32 * blk.len
73+
else:
74+
if wr:
75+
rs_coding = 32 * 3
76+
return 32 * 8 + rs_coding
77+
else:
78+
return 32 * blk.len
79+
80+
def handle_coding_scheme(self, blk: BlockDefinition, data: BitStream) -> BitStream:
81+
if blk.id != 0:
82+
# CODING_SCHEME RS applied only for all blocks except BLK0.
83+
coded_bytes = 12
84+
data.pos = coded_bytes * 8
85+
plain_data = data.readlist("32*uint:8")[::-1]
86+
# takes 32 bytes
87+
# apply RS encoding
88+
rs = reedsolo.RSCodec(coded_bytes)
89+
# 32 byte of data + 12 bytes RS
90+
calc_encoded_data = list(rs.encode([x for x in plain_data]))
91+
data.pos = 0
92+
if calc_encoded_data != data.readlist("44*uint:8")[::-1]:
93+
raise FatalError("Error in coding scheme data")
94+
data = data[coded_bytes * 8 :]
95+
if blk.len < 8:
96+
data = data[(8 - blk.len) * 32 :]
97+
return data

0 commit comments

Comments
 (0)