diff --git a/mik32_dma.py b/mik32_dma.py index e2da677..9ac5a34 100644 --- a/mik32_dma.py +++ b/mik32_dma.py @@ -264,6 +264,7 @@ class DMA: self.current_value = CurrentValue.ENABLE self.write_buffer = 0 + self.openocd.write_memory(0x40000, 32, [0] * 16) self.clear_irq() self.set_current_value(self.current_value) diff --git a/mik32_spifi.py b/mik32_spifi.py index 1d68ac3..ca88dab 100644 --- a/mik32_spifi.py +++ b/mik32_spifi.py @@ -140,7 +140,6 @@ SPIFI_CONFIG_STAT_VERSION_M = (0xFF << SPIFI_CONFIG_STAT_VERSION_S) # -------------------------- SREG1_BUSY = 1 -READ_SREG_LEN = 1 READ_LEN = 256 TIMEOUT = 1000 @@ -158,11 +157,8 @@ READ_DATA_COMMAND = 0x03 FAST_READ_QUAD_OUTPUT_COMMAND = 0x6B READ_SREG1_COMMAND = 0x05 -WRITE_SREG1_COMMAND = 0x01 READ_SREG2_COMMAND = 0x35 -WRITE_SREG2_COMMAND = 0x31 -READ_SREG3_COMMAND = 0x15 -WRITE_SREG3_COMMAND = 0x11 +WRITE_SREG_COMMAND = 0x01 SREG2_QUAD_ENABLE = 9 SREG2_QUAD_ENABLE_S = (SREG2_QUAD_ENABLE-8) @@ -176,7 +172,6 @@ QUAD_PAGE_PROGRAM_COMMAND = 0x32 class SREG_Num(Enum): SREG1 = 0x00 SREG2 = 0x30 - SREG3 = 0x10 def spifi_intrq_clear(openocd: OpenOcdTclRpc): @@ -349,14 +344,31 @@ def spifi_write_enable(openocd: OpenOcdTclRpc): def spifi_read_sreg(openocd: OpenOcdTclRpc, sreg: SREG_Num) -> int: - read_sreg: int = 0 - return spifi_send_command( - openocd, READ_SREG1_COMMAND | sreg.value, SPIFI_Frameform.OPCODE_NOADDR, - SPIFI_Fieldform.ALL_SERIAL, byte_count=READ_SREG_LEN + openocd, + READ_SREG1_COMMAND | sreg.value, + SPIFI_Frameform.OPCODE_NOADDR, + SPIFI_Fieldform.ALL_SERIAL, + byte_count=1 )[0] +def spifi_write_sreg(openocd: OpenOcdTclRpc, sreg1: int, sreg2: int): + spifi_send_command(openocd, 0xFF, + SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) + spifi_write_enable(openocd) + spifi_send_command( + openocd, + WRITE_SREG_COMMAND, + SPIFI_Frameform.OPCODE_NOADDR, + SPIFI_Fieldform.ALL_SERIAL, + byte_count=2, + direction=SPIFI_Direction.WRITE, + data=[sreg1, sreg2] + ) + spifi_wait_busy(openocd) + + def spifi_wait_busy(openocd: OpenOcdTclRpc): while 1: sreg1 = spifi_read_sreg(openocd, SREG_Num.SREG1) @@ -491,24 +503,23 @@ def spifi_quad_page_program( def spifi_quad_enable(openocd): - sreg2 = spifi_read_sreg(openocd, SREG_Num.SREG2) - - spifi_write_enable(openocd) - spifi_send_command(openocd, WRITE_SREG2_COMMAND, SPIFI_Frameform.OPCODE_3ADDR, - SPIFI_Fieldform.ALL_SERIAL, byte_count=1, - idata=0, cache_limit=0, direction=SPIFI_Direction.WRITE, data=[sreg2 | SREG2_QUAD_ENABLE_M]) - spifi_wait_busy(openocd) + spifi_write_sreg( + openocd, + spifi_read_sreg(openocd, SREG_Num.SREG1), + spifi_read_sreg(openocd, SREG_Num.SREG2) | SREG2_QUAD_ENABLE_M + ) def spifi_quad_disable(openocd): - sreg2 = spifi_read_sreg(openocd, SREG_Num.SREG2) + spifi_write_sreg( + openocd, + spifi_read_sreg(openocd, SREG_Num.SREG1), + spifi_read_sreg(openocd, SREG_Num.SREG2) & (0xFF ^ SREG2_QUAD_ENABLE_M) + ) - spifi_write_enable(openocd) - spifi_send_command(openocd, WRITE_SREG2_COMMAND, SPIFI_Frameform.OPCODE_3ADDR, - SPIFI_Fieldform.ALL_SERIAL, byte_count=1, - idata=0, cache_limit=0, direction=SPIFI_Direction.WRITE, data=[ - sreg2 & (~SREG2_QUAD_ENABLE_M)]) - spifi_wait_busy(openocd) + +def spifi_check_quad_enable(openocd): + return (spifi_read_sreg(openocd, SREG_Num.SREG2) & SREG2_QUAD_ENABLE_M) != 0 def get_segments_list(pages_offsets: List[int], segment_size: int) -> List[int]: @@ -666,11 +677,17 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp # print("Data error") # return result + print("Quad Enable", spifi_check_quad_enable(openocd)) + if (use_quad_spi): - print("Quad Enable") + print("Using Quad SPI") spifi_quad_enable(openocd) else: + print("Using Single SPI") spifi_quad_disable(openocd) + + # print("SREG1", spifi_read_sreg(openocd, SREG_Num.SREG1)) + # print("SREG2", spifi_read_sreg(openocd, SREG_Num.SREG2)) pages_offsets = list(pages) diff --git a/mik32_upload.py b/mik32_upload.py index 021d462..4a6cd98 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -26,9 +26,13 @@ import sys # BOLD = '\033[1m' # UNDERLINE = '\033[4m' +if os.name == 'nt': + openocd_exec = "openocd.exe" +else: + openocd_exec = "openocd" default_openocd_host = '127.0.0.1' -openocd_exec_path = os.path.join("openocd", "bin", "openocd.exe") +openocd_exec_path = os.path.join("openocd", "bin", openocd_exec) openocd_scripts_path = os.path.join("openocd", "share", "openocd", "scripts") openocd_interface_path = os.path.join("interface", "ftdi", "m-link.cfg") openocd_target_path = os.path.join("target", "mik32.cfg") @@ -129,12 +133,15 @@ def run_openocd( cmd = [openocd_exec, "-s", openocd_scripts, "-f", openocd_interface, "-f", openocd_target] - creation_flags = subprocess.SW_HIDE - if is_open_console: - creation_flags |= subprocess.CREATE_NEW_CONSOLE + if os.name == 'nt': + creation_flags = subprocess.SW_HIDE + if is_open_console: + creation_flags |= subprocess.CREATE_NEW_CONSOLE - proc = subprocess.Popen( - cmd, creationflags=creation_flags) + proc = subprocess.Popen( + cmd, creationflags=creation_flags) + else: + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) return proc @@ -228,6 +235,7 @@ def upload_file( except OSError as e: raise OpenOCDStartupException(e) try: + time.sleep(0.1) with OpenOcdTclRpc(host, port) as openocd: if (all(openocd_interface.find(i) == -1 for i in adapter_speed_not_supported)): openocd.run(f"adapter speed {adapter_speed}") diff --git a/tclrpc.py b/tclrpc.py index 8e99d54..af50acd 100644 --- a/tclrpc.py +++ b/tclrpc.py @@ -1,6 +1,7 @@ import re import socket from logging import getLogger +import time from typing import List logger = getLogger(__name__) @@ -52,9 +53,8 @@ class OpenOcdTclRpc: def __enter__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.settimeout(5.0) try: - self.sock.connect((self.host, self.port)) + self.wait_for_port() except socket.timeout: logger.debug("Test connection timed out, try again") self.sock.close() @@ -87,6 +87,18 @@ class OpenOcdTclRpc: if index != len(data) - 1: raise Exception('Unhandled extra bytes after %r'.format(self.SEPARATOR_BYTES)) return data[:-1] + + def wait_for_port(self, timeout: float = 5.0): + sock = None + start_time = time.perf_counter() + while time.perf_counter() - start_time < timeout: + try: + sock = self.sock.connect((self.host, self.port)) + break + except OSError as ex: + time.sleep(0.01) + if sock != None: + self.sock = sock def run(self, cmd): """Run a command and raise an error if it returns an error"""