feat(espefuse): Adds efuse calculation fields for ESP32-C5

This commit is contained in:
Konstantin Kondrashov
2025-06-03 19:05:03 +03:00
committed by Radim Karniš
parent c1025103a7
commit 9104038d00
2 changed files with 62 additions and 7 deletions

View File

@@ -301,20 +301,55 @@ class EfuseField(base_fields.EfuseFieldBase):
"keypurpose": EfuseKeyPurposeField,
"t_sensor": EfuseTempSensor,
"adc_tp": EfuseAdcPointCalibration,
"wafer": EfuseWafer,
"recovery_bootloader": EfuseBtldrRecoveryField,
"bootloader_anti_rollback": EfuseBtldrAntiRollbackField,
}.get(efuse.class_type, EfuseField)(parent, efuse)
class EfuseWafer(EfuseField):
class EfuseBtldrRecoveryField(EfuseField):
def get(self, from_read=True):
hi_bits = self.parent["WAFER_VERSION_MINOR_HI"].get(from_read)
assert self.parent["WAFER_VERSION_MINOR_HI"].bit_len == 1
lo_bits = self.parent["WAFER_VERSION_MINOR_LO"].get(from_read)
assert self.parent["WAFER_VERSION_MINOR_LO"].bit_len == 3
hi_bits = self.parent["RECOVERY_BOOTLOADER_FLASH_SECTOR_HI"].get(from_read)
assert self.parent["RECOVERY_BOOTLOADER_FLASH_SECTOR_HI"].bit_len == 3
lo_bits = self.parent["RECOVERY_BOOTLOADER_FLASH_SECTOR_LO"].get(from_read)
assert self.parent["RECOVERY_BOOTLOADER_FLASH_SECTOR_LO"].bit_len == 9
return (hi_bits << 9) + lo_bits
def save(self, new_value):
efuse = self.parent["RECOVERY_BOOTLOADER_FLASH_SECTOR_HI"]
efuse.save((new_value >> 9) & 3)
print(
f"\t - '{efuse.name}' {efuse.get_bitstring()} -> {efuse.get_bitstring(from_read=False)}"
)
efuse = self.parent["RECOVERY_BOOTLOADER_FLASH_SECTOR_LO"]
efuse.save(new_value & 0x1FF)
print(
f"\t - '{efuse.name}' {efuse.get_bitstring()} -> {efuse.get_bitstring(from_read=False)}"
)
class EfuseBtldrAntiRollbackField(EfuseField):
def get(self, from_read=True):
hi_bits = self.parent["BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_HI"].get(
from_read
)
assert self.parent["BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_HI"].bit_len == 1
lo_bits = self.parent["BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_LO"].get(
from_read
)
assert self.parent["BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_LO"].bit_len == 3
return (hi_bits << 3) + lo_bits
def save(self, new_value):
raise esptool.FatalError("Burning %s is not supported" % self.name)
efuse = self.parent["BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_HI"]
efuse.save((new_value >> 3) & 1)
print(
f"\t - '{efuse.name}' {efuse.get_bitstring()} -> {efuse.get_bitstring(from_read=False)}"
)
efuse = self.parent["BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_LO"]
efuse.save(new_value & 0x7)
print(
f"\t - '{efuse.name}' {efuse.get_bitstring()} -> {efuse.get_bitstring(from_read=False)}"
)
class EfuseTempSensor(EfuseField):

View File

@@ -158,6 +158,26 @@ class EfuseDefineFields(EfuseFieldsBase):
f.description = "calc MAC_EUI64 = MAC[0]:MAC[1]:MAC[2]:MAC_EXT[0]:MAC_EXT[1]:MAC[3]:MAC[4]:MAC[5]"
self.CALC.append(f)
f = Field()
f.name = "RECOVERY_BOOTLOADER_FLASH_SECTOR"
f.block = 0
f.bit_len = 12
f.type = f"uint:{f.bit_len}"
f.category = "config"
f.class_type = "recovery_bootloader"
f.description = "calc recovery_bootloader = recovery_bootloader_hi << 9 + recovery_bootloader_lo"
self.CALC.append(f)
f = Field()
f.name = "BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION"
f.block = 0
f.bit_len = 4
f.type = f"uint:{f.bit_len}"
f.category = "config"
f.class_type = "bootloader_anti_rollback"
f.description = "calc ANTI_ROLLBACK_SECURE_VERSION = ANTI_ROLLBACK_SECURE_VERSION_HI << 3 + ANTI_ROLLBACK_SECURE_VERSION_LO"
self.CALC.append(f)
for efuse in self.ALL_EFUSES:
if efuse is not None:
self.EFUSES.append(efuse)