From 77ce067841d3d6504aa3269463022b135ab45953 Mon Sep 17 00:00:00 2001 From: Live session user Date: Thu, 18 Apr 2024 14:41:25 +0000 Subject: [PATCH 1/5] linux support test --- mik32_upload.py | 22 ++++++++++++++++------ tclrpc.py | 19 +++++++++++++++++-- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/mik32_upload.py b/mik32_upload.py index 7d02557..7f192de 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 @@ -226,7 +233,10 @@ def upload_file( except OSError as e: raise OpenOCDStartupException(e) try: + # time.sleep(0.1) + with OpenOcdTclRpc(host, port) as openocd: + print('try beginning') if (all(openocd_interface.find(i) == -1 for i in adapter_speed_not_supported)): openocd.run(f"adapter speed {adapter_speed}") openocd.run(f"log_output \"{log_path}\"") diff --git a/tclrpc.py b/tclrpc.py index 8e99d54..8da0176 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,11 @@ 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.sock.connect((self.host, self.port)) + self.wait_for_port() + # except Exception as e: + # print(e) except socket.timeout: logger.debug("Test connection timed out, try again") self.sock.close() @@ -87,6 +90,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""" From ffd52233b871ef1532b20067210709b5997c9da4 Mon Sep 17 00:00:00 2001 From: Sergey Shchelkanov Date: Thu, 18 Apr 2024 18:30:35 +0300 Subject: [PATCH 2/5] cleanup --- mik32_upload.py | 3 --- tclrpc.py | 3 --- 2 files changed, 6 deletions(-) diff --git a/mik32_upload.py b/mik32_upload.py index 7f192de..036fe93 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -233,10 +233,7 @@ def upload_file( except OSError as e: raise OpenOCDStartupException(e) try: - # time.sleep(0.1) - with OpenOcdTclRpc(host, port) as openocd: - print('try beginning') if (all(openocd_interface.find(i) == -1 for i in adapter_speed_not_supported)): openocd.run(f"adapter speed {adapter_speed}") openocd.run(f"log_output \"{log_path}\"") diff --git a/tclrpc.py b/tclrpc.py index 8da0176..af50acd 100644 --- a/tclrpc.py +++ b/tclrpc.py @@ -54,10 +54,7 @@ class OpenOcdTclRpc: def __enter__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: - # self.sock.connect((self.host, self.port)) self.wait_for_port() - # except Exception as e: - # print(e) except socket.timeout: logger.debug("Test connection timed out, try again") self.sock.close() From 6c5bbd58d45b9e858bc3b3df69bdb26450e2aadb Mon Sep 17 00:00:00 2001 From: Sergey Shchelkanov Date: Tue, 28 May 2024 17:02:51 +0300 Subject: [PATCH 3/5] fixed connection attempt before openocd init --- mik32_upload.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mik32_upload.py b/mik32_upload.py index 036fe93..9ae09d2 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -233,6 +233,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}") From 43ea7057b72851a8cdfdff93ae6ecdf115df241f Mon Sep 17 00:00:00 2001 From: Sergey Shchelkanov Date: Mon, 15 Jul 2024 15:07:47 +0300 Subject: [PATCH 4/5] Fix writing SREG registers according actual datasheet --- mik32_spifi.py | 67 +++++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/mik32_spifi.py b/mik32_spifi.py index 846f34f..48647e4 100644 --- a/mik32_spifi.py +++ b/mik32_spifi.py @@ -137,7 +137,6 @@ SPIFI_CONFIG_STAT_VERSION_M = (0xFF << SPIFI_CONFIG_STAT_VERSION_S) # -------------------------- SREG1_BUSY = 1 -READ_SREG_LEN = 1 READ_LEN = 256 TIMEOUT = 1000 @@ -155,11 +154,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) @@ -173,7 +169,6 @@ QUAD_PAGE_PROGRAM_COMMAND = 0x32 class SREG_Num(Enum): SREG1 = 0x00 SREG2 = 0x30 - SREG3 = 0x10 def spifi_intrq_clear(openocd: OpenOcdTclRpc): @@ -346,14 +341,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) @@ -488,24 +500,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]: @@ -663,11 +674,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) From 59c98dc725059e9d232dd83b8a89086ef284b119 Mon Sep 17 00:00:00 2001 From: Sergey Shchelkanov Date: Wed, 17 Jul 2024 13:20:03 +0300 Subject: [PATCH 5/5] Reset DMA registers to initial values --- mik32_dma.py | 1 + 1 file changed, 1 insertion(+) 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)