From eb6d32a981fafda2d0c2ff6e287dbde3f639b16c Mon Sep 17 00:00:00 2001 From: Sergey Shchelkanov Date: Thu, 18 May 2023 13:45:20 +0300 Subject: [PATCH] write flash by pages --- mik32_spifi.py | 43 ++++++++++++++++++++++++++++++++++++++++--- mik32_upload.py | 13 +++++++++---- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/mik32_spifi.py b/mik32_spifi.py index 6d189fa..0bdd9d3 100644 --- a/mik32_spifi.py +++ b/mik32_spifi.py @@ -1,4 +1,4 @@ -from typing import List +from typing import Dict, List import time from tclrpc import TclException from tclrpc import OpenOcdTclRpc @@ -398,9 +398,10 @@ def spifi_page_program(openocd: OpenOcdTclRpc, ByteAddress: int, data: List[int] (1 << SPIFI_CONFIG_CMD_DOUT_S) | (0 << SPIFI_CONFIG_CMD_POLL_S) | (byte_count << SPIFI_CONFIG_CMD_DATALEN_S)) - for i in range(ByteAddress, ByteAddress + byte_count, 1): + for i in range(byte_count): # openocd.write_word(SPIFI_CONFIG_DATA32, data[i+ByteAddress]) - # print(data[i]) + print(i) + print(data[i]) openocd.write_memory(SPIFI_CONFIG_DATA32, 8, [data[i]]) # spifi_intrq_clear(openocd) openocd.write_word(SPIFI_CONFIG_STAT, openocd.read_word( @@ -461,3 +462,39 @@ def spifi_write_file(bytes: List[int], openocd: OpenOcdTclRpc, is_resume=True): openocd.resume(0) return 0 + + +def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, is_resume=True): + """ + Write bytes in MIK32 External SPIFI Flash memory + + @bytes: list of bytes to write at offset 0x0 + + TODO: implement setting byte array offset, add error handling, + improve progress visualisation + """ + result = 0 + + openocd.halt() + spifi_init(openocd) + spifi_erase(openocd) + address = 0 + + for page_offset in list(pages): + print("Writing page %s, " % hex(page_offset)) + page_bytes = pages[page_offset] + + spifi_write_enable(openocd) + spifi_page_program(openocd, page_offset, page_bytes, 256) + spifi_wait_busy(openocd) + + # result = spifi_read_data(openocd, page_offset, 256, page_bytes) + + if result == 1: + print("Page mismatch!") + return result + + if is_resume: + openocd.resume(0) + + return 0 diff --git a/mik32_upload.py b/mik32_upload.py index cb534dd..c251662 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -163,7 +163,7 @@ def upload_file(filename: str, host: str = '127.0.0.1', port: int = OpenOcdTclRp # print(DEFAULT_OPENOCD_EXEC_FILE_PATH) # print(DEFAULT_OPENOCD_SCRIPTS_PATH) - result = 1 + result = 0 if not os.path.exists(filename): print("ERROR: File %s does not exist" % filename) @@ -191,9 +191,14 @@ def upload_file(filename: str, host: str = '127.0.0.1', port: int = OpenOcdTclRp with OpenOcdTclRpc() as openocd: pages_eeprom = segments_to_pages(list(filter( lambda segment: (segment.memory is not None) and (segment.memory.type == MemoryType.EEPROM), segments)), 128) - result = mik32_eeprom.write_pages(pages_eeprom, openocd, is_resume) - # elif segment_section.type == MemoryType.SPIFI: - # result = mik32_spifi.spifi_write_file(segment.data, openocd, is_resume) + pages_spifi = segments_to_pages(list(filter( + lambda segment: (segment.memory is not None) and (segment.memory.type == MemoryType.SPIFI), segments)), 256) + + if (pages_eeprom.__len__() > 0): + result |= mik32_eeprom.write_pages(pages_eeprom, openocd, is_resume) + if (pages_spifi.__len__() > 0): + # print(pages_spifi) + result |= mik32_spifi.write_pages(pages_spifi, openocd, is_resume) if run_openocd and proc is not None: proc.kill()