Skip to content

Commit cb6e820

Browse files
feat(examples): Get offsets for efuses from espefuse.py
1 parent fdac9bb commit cb6e820

File tree

2 files changed

+38
-37
lines changed

2 files changed

+38
-37
lines changed

examples/system/efuse/conftest.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
1+
# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
22
# SPDX-License-Identifier: Apache-2.0
3-
3+
import json
44
import logging
55
import os
6+
import tempfile
7+
from typing import Any
68

9+
import espefuse
710
import pytest
811
from _pytest.fixtures import FixtureRequest
912
from _pytest.monkeypatch import MonkeyPatch
@@ -52,6 +55,12 @@ def bootloader_flash(self) -> None:
5255
# Restore self.app.flash files to original value
5356
self.app.flash_files = prev_flash_files
5457

58+
def erase_field_on_emul_efuse_by_name(self, efuse_names: list) -> None:
59+
pos_of_bits = []
60+
for name in efuse_names:
61+
pos_of_bits.append(self.get_efuse_offset(name))
62+
self.erase_field_on_emul_efuse(pos_of_bits)
63+
5564
def erase_field_on_emul_efuse(self, pos_of_bits: list) -> None:
5665
emul_efuse_bin_path = os.path.join(self.app.binary_path, 'emul_efuse.bin')
5766
self.dump_flash(output=emul_efuse_bin_path, partition='emul_efuse')
@@ -86,6 +95,20 @@ def erase_bit(pos_of_bit: int) -> None:
8695
self.flash()
8796
self.app.flash_files = prev_flash_files
8897

98+
def get_efuse_offset(self, efuse_name: str) -> Any:
99+
with tempfile.NamedTemporaryFile(suffix='.json') as temp_file:
100+
temp_file_path = temp_file.name
101+
espefuse.main(f'--virt -c {self.target} summary --format json --file {temp_file_path}'.split())
102+
with open(temp_file_path, 'r') as file:
103+
efuse_summary = json.load(file)
104+
if efuse_name in efuse_summary:
105+
data = efuse_summary[efuse_name]
106+
offset = int(data['word'] * 32) + data['pos']
107+
print(f'{efuse_name} offset = {offset}')
108+
return offset
109+
else:
110+
raise ValueError(f"eFuse '{efuse_name}' not found in the summary.")
111+
89112

90113
@pytest.fixture(scope='module')
91114
def monkeypatch_module(request: FixtureRequest) -> MonkeyPatch:

examples/system/efuse/pytest_system_efuse_example.py

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -174,23 +174,12 @@ def test_examples_efuse_with_virt_flash_enc_pre_loaded(dut: Dut) -> None:
174174
dut.expect('example: Done')
175175

176176
if dut.app.target == 'esp32':
177-
print(' - Flash emul_efuse with pre-loaded efuses (FLASH_CRYPT_CNT 1 -> 0)')
178-
# offset of this eFuse is taken from components/efuse/esp32/esp_efuse_table.csv
179-
FLASH_CRYPT_CNT = 20
180-
# Resets eFuse, which enables Flash encryption feature
181-
dut.serial.erase_field_on_emul_efuse([FLASH_CRYPT_CNT])
182-
elif dut.app.target == 'esp32c2':
183-
FLASH_CRYPT_CNT = 39
184-
dut.serial.erase_field_on_emul_efuse([FLASH_CRYPT_CNT])
177+
CRYPT_CNT_EFUSE_NAME = 'FLASH_CRYPT_CNT'
185178
else:
186-
# offset of this eFuse is taken from components/efuse/{target}/esp_efuse_table.csv
187-
print(' - Flash emul_efuse with pre-loaded efuses (SPI_BOOT_CRYPT_CNT 1 -> 0)')
188-
if dut.app.target == 'esp32c61':
189-
SPI_BOOT_CRYPT_CNT = 55
190-
else:
191-
SPI_BOOT_CRYPT_CNT = 82
192-
# Resets eFuse, which enables Flash encryption feature
193-
dut.serial.erase_field_on_emul_efuse([SPI_BOOT_CRYPT_CNT])
179+
CRYPT_CNT_EFUSE_NAME = 'SPI_BOOT_CRYPT_CNT'
180+
print(f' - Flash emul_efuse with pre-loaded efuses ({CRYPT_CNT_EFUSE_NAME} 1 -> 0)')
181+
# Resets eFuse, which enables Flash encryption feature
182+
dut.serial.erase_field_on_emul_efuse_by_name([CRYPT_CNT_EFUSE_NAME])
194183

195184
print(' - Start app (flash partition_table and app)')
196185
dut.serial.write_flash_no_enc()
@@ -350,10 +339,8 @@ def test_examples_efuse_with_virt_secure_boot_v1_pre_loaded(dut: Dut) -> None:
350339
dut.expect('example: Done')
351340

352341
print(' - Flash emul_efuse with pre-loaded efuses (ABS_DONE_0 1 -> 0)')
353-
# offset of this eFuse is taken from components/efuse/esp32/esp_efuse_table.csv
354-
ABS_DONE_0 = 196
355342
# Resets eFuse, which enables Secure boot (V1) feature
356-
dut.serial.erase_field_on_emul_efuse([ABS_DONE_0])
343+
dut.serial.erase_field_on_emul_efuse_by_name(['ABS_DONE_0'])
357344

358345
print(' - Start app (flash partition_table and app)')
359346
dut.serial.flash()
@@ -456,10 +443,8 @@ def test_examples_efuse_with_virt_secure_boot_v2(dut: Dut) -> None:
456443
dut.expect('example: Done')
457444

458445
print(' - Flash emul_efuse with pre-loaded efuses (ABS_DONE_1 1 -> 0)')
459-
# offset of this eFuse is taken from components/efuse/esp32/esp_efuse_table.csv
460-
ABS_DONE_1 = 197
461446
# Resets eFuse, which enables Secure boot (V2) feature
462-
dut.serial.erase_field_on_emul_efuse([ABS_DONE_1])
447+
dut.serial.erase_field_on_emul_efuse_by_name(['ABS_DONE_1'])
463448

464449
print(' - Start app (flash partition_table and app)')
465450
dut.serial.flash()
@@ -521,10 +506,8 @@ def test_examples_efuse_with_virt_secure_boot_v2_pre_loaded(dut: Dut) -> None:
521506
dut.expect('example: Done')
522507

523508
print(' - Flash emul_efuse with pre-loaded efuses (ABS_DONE_1 1 -> 0)')
524-
# offset of this eFuse is taken from components/efuse/esp32/esp_efuse_table.csv
525-
ABS_DONE_1 = 197
526509
# Resets eFuse, which enables Secure boot (V2) feature
527-
dut.serial.erase_field_on_emul_efuse([ABS_DONE_1])
510+
dut.serial.erase_field_on_emul_efuse_by_name(['ABS_DONE_1'])
528511

529512
print(' - Start app (flash partition_table and app)')
530513
dut.serial.flash()
@@ -673,17 +656,12 @@ def test_example_efuse_with_virt_secure_boot_v2_esp32xx_pre_loaded(dut: Dut) ->
673656

674657
print(' - Flash emul_efuse with pre-loaded efuses (SECURE_BOOT_EN 1 -> 0, SECURE_BOOT_KEY_REVOKE[0..2] -> 0)')
675658
# offsets of eFuses are taken from components/efuse/{target}/esp_efuse_table.csv
676-
if dut.app.target == 'esp32c2':
677-
SECURE_BOOT_EN = 53
678-
dut.serial.erase_field_on_emul_efuse([SECURE_BOOT_EN])
659+
# Resets eFuse, which enables Secure boot feature
660+
# Resets eFuses, which control digest slots
661+
if dut.app.sdkconfig.get('SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS'):
662+
dut.serial.erase_field_on_emul_efuse_by_name(['SECURE_BOOT_EN', 'SECURE_BOOT_KEY_REVOKE0', 'SECURE_BOOT_KEY_REVOKE1', 'SECURE_BOOT_KEY_REVOKE2'])
679663
else:
680-
SECURE_BOOT_EN = 116
681-
SECURE_BOOT_KEY_REVOKE0 = 85
682-
SECURE_BOOT_KEY_REVOKE1 = 86
683-
SECURE_BOOT_KEY_REVOKE2 = 87
684-
# Resets eFuse, which enables Secure boot feature
685-
# Resets eFuses, which control digest slots
686-
dut.serial.erase_field_on_emul_efuse([SECURE_BOOT_EN, SECURE_BOOT_KEY_REVOKE0, SECURE_BOOT_KEY_REVOKE1, SECURE_BOOT_KEY_REVOKE2])
664+
dut.serial.erase_field_on_emul_efuse_by_name(['SECURE_BOOT_EN'])
687665

688666
print(' - Start app (flash partition_table and app)')
689667
dut.serial.flash()

0 commit comments

Comments
 (0)