Поддержка частичного стирания EEPROM для прошивки с драйвером

This commit is contained in:
sh-sergey 2025-04-01 14:44:32 +03:00
parent 0670b71ee7
commit c9c2fd8fa5
2 changed files with 33 additions and 7 deletions

View File

@ -33,8 +33,9 @@ def combine_pages(pages: Dict[int, List[int]]) -> List[int]:
class EEPROM(): class EEPROM():
openocd: OpenOcdTclRpc openocd: OpenOcdTclRpc
def __init__(self, openocd: OpenOcdTclRpc): def __init__(self, openocd: OpenOcdTclRpc, full_erase: bool = True):
self.openocd = openocd self.openocd = openocd
self.full_erase = full_erase
self.eeprom_sysinit() self.eeprom_sysinit()
@ -234,16 +235,32 @@ class EEPROM():
RAM_BUFFER_OFFSET = 0x02001800 RAM_BUFFER_OFFSET = 0x02001800
RAM_DRIVER_STATUS = 0x02003800 RAM_DRIVER_STATUS = 0x02003800
STATUS_CODE_S = 0
STATUS_CODE_M = 0x7F
STATUS_CODE_OK = 0
STATUS_CODE_START = 1
STATUS_CODE_MISMATCH = 2
STATUS_CODE_ERASE_S = 7
STATUS_CODE_ERASE_M = (1 << STATUS_CODE_ERASE_S)
STATUS_CODE_ERASE_FULL = 0
STATUS_CODE_ERASE_USED = STATUS_CODE_ERASE_M
bytes_list = combine_pages(pages) bytes_list = combine_pages(pages)
self.openocd.halt() self.openocd.halt()
# Отключение прерываний # Отключение прерываний
self.openocd.run("riscv.cpu set_reg {mstatus 0 mie 0}") self.openocd.run("riscv.cpu set_reg {mstatus 0 mie 0}")
STATUS_CODE_M = 0xFF
max_address = len(bytes_list) // 128 max_address = len(bytes_list) // 128
self.openocd.write_memory(RAM_DRIVER_STATUS, 32, [ self.openocd.write_memory(RAM_DRIVER_STATUS, 32, [
1 | (max_address << 8)]) (STATUS_CODE_START << STATUS_CODE_S) |
(max_address << 8) |
(
STATUS_CODE_ERASE_FULL if self.full_erase
else STATUS_CODE_ERASE_USED << STATUS_CODE_ERASE_S
)
])
pathname = os.path.dirname(sys.argv[0]) pathname = os.path.dirname(sys.argv[0])
@ -281,7 +298,7 @@ class EEPROM():
result = self.openocd.read_memory(RAM_DRIVER_STATUS, 32, 1)[0] result = self.openocd.read_memory(RAM_DRIVER_STATUS, 32, 1)[0]
if (result & STATUS_CODE_M) == 0: if (result & STATUS_CODE_M) == STATUS_CODE_OK:
print(f"EEPROM writing successfully completed!", flush=True) print(f"EEPROM writing successfully completed!", flush=True)
else: else:
miss_page = (result >> 8) & (64 - 1) miss_page = (result >> 8) & (64 - 1)

View File

@ -195,6 +195,7 @@ def upload_file(
post_action=default_post_action, post_action=default_post_action,
mik_version=MIK32_Version.MIK32V2, mik_version=MIK32_Version.MIK32V2,
use_driver=True, use_driver=True,
eeprom_full_erase=True,
) -> int: ) -> int:
""" """
Запись прошивки в формате Intel HEX или бинарном в память MIK32. Запись прошивки в формате Intel HEX или бинарном в память MIK32.
@ -264,7 +265,7 @@ def upload_file(
logging.debug("PM configured!") logging.debug("PM configured!")
if (pages.pages_eeprom.__len__() > 0): if (pages.pages_eeprom.__len__() > 0):
eeprom = EEPROM(openocd) eeprom = EEPROM(openocd, full_erase=eeprom_full_erase)
start_time = time.perf_counter() start_time = time.perf_counter()
@ -462,6 +463,13 @@ def createParser():
default=True, default=True,
help='Отключает прошивку с использованием драйвера в ОЗУ' help='Отключает прошивку с использованием драйвера в ОЗУ'
) )
parser.add_argument(
'--eeprom-partial-erase',
dest='eeprom_full_erase',
action='store_false',
default=True,
help='Включает режим очистки EEPROM по страницам для режима с использованием драйвера в ОЗУ'
)
return parser return parser
@ -492,6 +500,7 @@ if __name__ == '__main__':
post_action=namespace.post_action, post_action=namespace.post_action,
mik_version=namespace.mcu_type, mik_version=namespace.mcu_type,
use_driver=namespace.use_driver, use_driver=namespace.use_driver,
eeprom_full_erase=namespace.eeprom_full_erase,
) )
) )
else: else: