2022-08-27 23:44:39 -04:00
|
|
|
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
from _pytest.fixtures import FixtureRequest
|
|
|
|
from _pytest.monkeypatch import MonkeyPatch
|
|
|
|
from pytest_embedded_idf.app import FlashFile
|
|
|
|
from pytest_embedded_idf.serial import IdfSerial
|
|
|
|
|
|
|
|
|
|
|
|
# This is a custom IdfSerial class to support custom functionality
|
|
|
|
# which is required only for this test
|
|
|
|
class EfuseFlashEncSerial(IdfSerial):
|
|
|
|
|
2022-10-31 01:47:49 -04:00
|
|
|
@IdfSerial.use_esptool()
|
2022-08-27 23:44:39 -04:00
|
|
|
def write_flash_no_enc(self) -> None:
|
|
|
|
self.app.flash_settings['encrypt'] = False
|
|
|
|
flash_files = []
|
|
|
|
for file in self.app.flash_files:
|
|
|
|
# Set encrypted flag to false for each file.
|
|
|
|
flash_files.append(file._replace(encrypted=False))
|
|
|
|
# Replace the original tuple with modified tuple with all the files marked as unencrypted.
|
|
|
|
self.app.flash_files = tuple(flash_files)
|
|
|
|
# Now flash the files
|
|
|
|
self.flash()
|
|
|
|
|
|
|
|
def bootloader_flash(self) -> None:
|
|
|
|
"""
|
|
|
|
Flash bootloader.
|
|
|
|
|
|
|
|
:return: None
|
|
|
|
"""
|
|
|
|
logging.info('Flashing bootloader')
|
|
|
|
bootloader_path = os.path.join(self.app.binary_path, 'bootloader', 'bootloader.bin')
|
2022-10-02 16:01:27 -04:00
|
|
|
offs = int(self.app.sdkconfig.get('BOOTLOADER_OFFSET_IN_FLASH', 0))
|
2022-08-27 23:44:39 -04:00
|
|
|
logging.info('bootloader offset is {0}'.format(hex(offs)))
|
|
|
|
prev_flash_files = self.app.flash_files
|
|
|
|
flash_files = []
|
|
|
|
flash_files.append(
|
|
|
|
FlashFile(
|
|
|
|
offs,
|
|
|
|
bootloader_path,
|
|
|
|
False,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
self.app.flash_files = flash_files
|
|
|
|
self.app.flash_settings['encrypt'] = False
|
|
|
|
self.flash()
|
|
|
|
# Restore self.app.flash files to original value
|
|
|
|
self.app.flash_files = prev_flash_files
|
|
|
|
|
|
|
|
def erase_field_on_emul_efuse(self, pos_of_bits: list) -> None:
|
|
|
|
emul_efuse_bin_path = os.path.join(self.app.binary_path, 'emul_efuse.bin')
|
|
|
|
self.dump_flash(output=emul_efuse_bin_path, partition='emul_efuse')
|
|
|
|
logging.info('Erasing field on emulated efuse')
|
|
|
|
|
|
|
|
def erase_bit(pos_of_bit: int) -> None:
|
|
|
|
nbytes, nbits = divmod(pos_of_bit, 8)
|
|
|
|
with open(emul_efuse_bin_path, 'r+b') as f:
|
|
|
|
f.seek(nbytes)
|
|
|
|
data = ord(f.read(1))
|
|
|
|
data &= ~(1 << nbits)
|
|
|
|
f.seek(-1, os.SEEK_CUR)
|
|
|
|
f.write(bytes([data]))
|
|
|
|
|
|
|
|
for pos_of_bit in sorted(pos_of_bits):
|
|
|
|
erase_bit(pos_of_bit)
|
|
|
|
|
|
|
|
offs = self.app.partition_table['emul_efuse']['offset']
|
|
|
|
logging.info('emul efuse offset is {0}'.format(hex(offs)))
|
|
|
|
prev_flash_files = self.app.flash_files
|
|
|
|
|
|
|
|
flash_files = []
|
|
|
|
flash_files.append(
|
|
|
|
FlashFile(
|
|
|
|
offs,
|
|
|
|
emul_efuse_bin_path,
|
|
|
|
False,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
self.app.flash_files = flash_files
|
|
|
|
self.app.flash_settings['encrypt'] = False
|
|
|
|
self.flash()
|
|
|
|
self.app.flash_files = prev_flash_files
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='module')
|
|
|
|
def monkeypatch_module(request: FixtureRequest) -> MonkeyPatch:
|
|
|
|
mp = MonkeyPatch()
|
|
|
|
request.addfinalizer(mp.undo)
|
|
|
|
return mp
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='module', autouse=True)
|
|
|
|
def replace_dut_class(monkeypatch_module: MonkeyPatch) -> None:
|
2022-10-28 04:13:53 -04:00
|
|
|
monkeypatch_module.setattr('pytest_embedded_idf.IdfSerial', EfuseFlashEncSerial)
|