Merge branch 'dev'

This commit is contained in:
Sergey Shchelkanov 2024-08-13 15:46:55 +03:00
commit 38631f0b63

View File

@ -1,4 +1,7 @@
from enum import Enum from enum import Enum
import os
import pathlib
import sys
from typing import Dict, List, Union from typing import Dict, List, Union
import time import time
from tclrpc import TclException from tclrpc import TclException
@ -769,3 +772,115 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp
# Прошивка страниц флеш памяти по SPIFI была завершена # Прошивка страниц флеш памяти по SPIFI была завершена
print("Flashing of flash memory pages via SPIFI has been completed", flush=True) print("Flashing of flash memory pages via SPIFI has been completed", flush=True)
return 0 return 0
def wait_halted(openocd: OpenOcdTclRpc, timeout_seconds: float = 2) -> int:
start_time = time.perf_counter()
while ("halted" not in openocd.run("riscv.cpu curstate")):
if (time.perf_counter() - start_time) > timeout_seconds:
print("Wait halted TIMEOUT!")
openocd.halt()
return 1
time.sleep(0.01)
return 0
def write_pages_by_sectors(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_spi=False, use_chip_erase=False):
result = 0
openocd.halt()
spifi_init(openocd)
JEDEC_ID = spifi_send_command(openocd, 0x9F, SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_SERIAL, 3)
print(f"JEDEC_ID {JEDEC_ID[0]:02x} {JEDEC_ID[1]:02x} {JEDEC_ID[2]:02x}")
sectors_list = get_segments_list(list(pages), 4*1024)
openocd.halt()
pathname = os.path.dirname(sys.argv[0])
# openocd.run("load_image {%s}" % pathlib.Path(os.path.join(pathname, "firmware.hex")))
openocd.run("rbp all")
openocd.run("load_image {%s}" % pathlib.Path("C:\\Users\\user\\Documents\\PlatformIO\\Projects\\SPIFI_JTAG_driver\\.pio\\build\\mik32v2\\firmware.hex"))
openocd.run("bp 0x02002010 1 hw")
openocd.resume(0x02000000)
if wait_halted(openocd) != 0:
return 1
# spifi erase
for sector in sectors_list:
print(f"Erase sector {sector}", flush=True)
openocd.write_word(0x02002000, 0b0010 | (sector << 8))
openocd.resume()
if wait_halted(openocd) != 0:
return 1
print(f"Erase sector {sector} result {openocd.read_word(0x02002008)}", flush=True)
return 1
# spifi erase check
for sector in sectors_list:
# print(f"Erase sector {sector}", flush=True)
# openocd.write_word(0x02002000, 0b0010 | sector)
# openocd.resume()
# if wait_halted(openocd) != 0:
# return 1
# print(f"Erase sector {sector} result {openocd.read_word(0x02002008)}", flush=True)
page_bytes = [0xff] * 256
result = spifi_read_data(openocd, sector, 256, page_bytes)
if result == 1:
print("Data error")
return result
for sector in sectors_list:
print(f"Program sector {sector}", flush=True)
bytes_list: List[int] = []
for page in range(16):
page = pages.get(page * 256 + sector * 4096)
if page is not None:
bytes_list.extend(page)
else:
bytes_list.extend([0]*256)
extend_value = 1 + sector
bytes_list.extend([(extend_value >> 0) & 0xFF, (extend_value >> 8) & 0xFF, (extend_value >> 16) & 0xFF, (extend_value >> 24) & 0xFF])
# print(bytes_list)
while (openocd.read_word(0x0200200c) != 1):
openocd.resume()
openocd.halt()
openocd.write_memory(0x02001000, 8, bytes_list)
while (openocd.read_word(0x0200200c) != 1):
openocd.resume()
openocd.halt()
time.sleep(0.5)
openocd.halt()
print(f"Program sector {sector} result {openocd.read_word(0x02002008)}", flush=True)
spifi_init_memory(openocd)
# check write
pages_offsets = list(pages)
for index, page_offset in enumerate(pages_offsets):
page_bytes = pages[page_offset]
memory_bytes = openocd.read_memory(page_offset + 0x80000000, 8, 256)
print(page_offset, memory_bytes)
for i, byte in enumerate(memory_bytes):
if byte != page_bytes[i]:
print("Data error!")
openocd.run("rbp 0x02002010")
return result
openocd.run("rbp 0x02002010")
if result == 0:
# Прошивка страниц флеш памяти по SPIFI была завершена
print("Flashing of flash memory pages via SPIFI has been completed", flush=True)
return 0