diff --git a/mik32_eeprom.py b/mik32_eeprom.py index c696656..5a8c0d5 100644 --- a/mik32_eeprom.py +++ b/mik32_eeprom.py @@ -1,7 +1,7 @@ from typing import Dict, List import time from tclrpc import OpenOcdTclRpc -from mik32_upload import Segment, MemorySection, bytes2words +from utils import bytes2words # -------------------------- # PM register offset diff --git a/mik32_ram.py b/mik32_ram.py index 4237470..fd0ffb8 100644 --- a/mik32_ram.py +++ b/mik32_ram.py @@ -1,7 +1,11 @@ +from typing import List +from mik32_upload import Segment from tclrpc import TclException from tclrpc import OpenOcdTclRpc from pathlib import Path +from utils import bytes2words + def write_file(filename, is_resume=True): with OpenOcdTclRpc() as openocd: @@ -10,3 +14,13 @@ def write_file(filename, is_resume=True): if is_resume: openocd.resume(0) print("RAM write file maybe done") + + +def write_segments(segments: List[Segment], openocd: OpenOcdTclRpc, is_resume=True): + openocd.reset_halt() + for segment in segments: + print("Writing segment %s with size %d..." % (hex(segment.offset), segment.data.__len__())) + segment_words = bytes2words(segment.data) + openocd.write_memory(segment.offset, 32, segment_words) + if is_resume: + openocd.resume(0) diff --git a/mik32_upload.py b/mik32_upload.py index 34d909a..c2baf7a 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -193,12 +193,17 @@ def upload_file(filename: str, host: str = '127.0.0.1', port: int = OpenOcdTclRp lambda segment: (segment.memory is not None) and (segment.memory.type == MemoryType.EEPROM), segments)), 128) pages_spifi = segments_to_pages(list(filter( lambda segment: (segment.memory is not None) and (segment.memory.type == MemoryType.SPIFI), segments)), 256) + segments_ram = list(filter( + lambda segment: (segment.memory is not None) and (segment.memory.type == MemoryType.RAM), segments)) 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, use_quad_spi) + if (segments_ram.__len__() > 0): + mik32_ram.write_segments(segments_ram, openocd, is_resume) + result |= 0 if run_openocd and proc is not None: proc.kill() @@ -206,19 +211,6 @@ def upload_file(filename: str, host: str = '127.0.0.1', port: int = OpenOcdTclRp return result -def bytes2words(arr: List[int]) -> List[int]: - bytes = [] - words = [] - for byte in arr: - bytes.append(byte) - if bytes.__len__() == 4: - words.append(bytes[0]+2**8*bytes[1]+2**16*bytes[2]+2**24*bytes[3]) - bytes = [] - if bytes.__len__() != 0: - print("WARNING: skipping not-word-aligned byte") - return words - - def createParser(): parser = argparse.ArgumentParser() parser.add_argument('filepath', nargs='?') diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..2c0ee9b --- /dev/null +++ b/utils.py @@ -0,0 +1,14 @@ +from typing import List + + +def bytes2words(arr: List[int]) -> List[int]: + bytes = [] + words = [] + for byte in arr: + bytes.append(byte) + if bytes.__len__() == 4: + words.append(bytes[0]+2**8*bytes[1]+2**16*bytes[2]+2**24*bytes[3]) + bytes = [] + if bytes.__len__() != 0: + print("WARNING: skipping not-word-aligned byte") + return words \ No newline at end of file