From 1afa1cfc136ad45b36e093dcfe9d3380c46eab9e Mon Sep 17 00:00:00 2001 From: spam-receiver <48826370+spam-receiver@users.noreply.github.com> Date: Wed, 17 Jul 2024 00:31:34 +0300 Subject: [PATCH 1/6] Update mik32_spifi.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Переключаем флеш-память из QPI в SPI режим перед прошивкой. --- mik32_spifi.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mik32_spifi.py b/mik32_spifi.py index 48647e4..425329a 100644 --- a/mik32_spifi.py +++ b/mik32_spifi.py @@ -146,6 +146,8 @@ SECTOR_ERASE_COMMAND = 0x20 WRITE_ENABLE_COMMAND = 0x06 WRITE_DISABLE_COMMAND = 0x04 +DISABLE_QPI_COMMAND = 0xFF + MEM_CONFIG_COMMAND = 0x61 MEM_CONFIG_VALUE = 0x7F @@ -373,6 +375,12 @@ def spifi_wait_busy(openocd: OpenOcdTclRpc): break +def spifi_chip_disable_qpi(openocd: OpenOcdTclRpc): + #print("Sending 'Disable QPI' command to external flash chip in QPI mode.", flush=True) + spifi_send_command(openocd, DISABLE_QPI_COMMAND, + SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) + + def spifi_chip_erase(openocd: OpenOcdTclRpc): print("Chip erase...", flush=True) spifi_send_command(openocd, CHIP_ERASE_COMMAND, @@ -615,6 +623,9 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp openocd.halt() spifi_init(openocd) + + # Выводим микросхему из режима QPI, так как SPIFI здесь будет работать в режиме SPI. + spifi_chip_disable_qpi(openocd) JEDEC_ID = spifi_send_command(openocd, 0x9F, SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_SERIAL, 3) From 1201ab7228b5b0f5a0b58b71933204b6e2bae0f6 Mon Sep 17 00:00:00 2001 From: spam-receiver <48826370+spam-receiver@users.noreply.github.com> Date: Thu, 18 Jul 2024 22:31:17 +0300 Subject: [PATCH 2/6] Update mik32_spifi.py --- mik32_spifi.py | 108 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 35 deletions(-) diff --git a/mik32_spifi.py b/mik32_spifi.py index 425329a..43c397f 100644 --- a/mik32_spifi.py +++ b/mik32_spifi.py @@ -140,13 +140,16 @@ SREG1_BUSY = 1 READ_LEN = 256 TIMEOUT = 1000 +ENABLE_RESET_COMMAND = 0x66 +RESET_COMMAND = 0x99 + CHIP_ERASE_COMMAND = 0xC7 SECTOR_ERASE_COMMAND = 0x20 WRITE_ENABLE_COMMAND = 0x06 WRITE_DISABLE_COMMAND = 0x04 -DISABLE_QPI_COMMAND = 0xFF +#DISABLE_QPI_COMMAND = 0xFF MEM_CONFIG_COMMAND = 0x61 MEM_CONFIG_VALUE = 0x7F @@ -167,6 +170,8 @@ PAGE_PROGRAM_COMMAND = 0x02 QUAD_PAGE_PROGRAM_COMMAND = 0x32 +JEDEC_ID_COMMAND = 0x9F + class SREG_Num(Enum): SREG1 = 0x00 @@ -218,7 +223,7 @@ def spifi_init_memory(openocd: OpenOcdTclRpc): openocd.write_word(SPIFI_CONFIG_MCMD, (0 << SPIFI_CONFIG_MCMD_INTLEN_S) | (SPIFI_CONFIG_CMD_FIELDFORM_ALL_SERIAL << SPIFI_CONFIG_MCMD_FIELDFORM_S) | (SPIFI_CONFIG_CMD_FRAMEFORM_OPCODE_3ADDR << SPIFI_CONFIG_MCMD_FRAMEFORM_S) | - (0x03 << SPIFI_CONFIG_MCMD_OPCODE_S)) + (READ_DATA_COMMAND << SPIFI_CONFIG_MCMD_OPCODE_S)) time.sleep(INIT_DELAY) @@ -353,8 +358,8 @@ def spifi_read_sreg(openocd: OpenOcdTclRpc, sreg: SREG_Num) -> int: def spifi_write_sreg(openocd: OpenOcdTclRpc, sreg1: int, sreg2: int): - spifi_send_command(openocd, 0xFF, - SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) +# spifi_send_command(openocd, DISABLE_QPI_COMMAND, +# SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) spifi_write_enable(openocd) spifi_send_command( openocd, @@ -374,11 +379,29 @@ def spifi_wait_busy(openocd: OpenOcdTclRpc): if not (sreg1 & SREG1_BUSY): break +RESET_DELAY = 0.001 -def spifi_chip_disable_qpi(openocd: OpenOcdTclRpc): - #print("Sending 'Disable QPI' command to external flash chip in QPI mode.", flush=True) - spifi_send_command(openocd, DISABLE_QPI_COMMAND, +def spifi_chip_reset(openocd: OpenOcdTclRpc): + #print("Sending 'Reset' to external chip in SPI mode", flush=True) + spifi_send_command(openocd, ENABLE_RESET_COMMAND, + SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_SERIAL) + spifi_send_command(openocd, RESET_COMMAND, + SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_SERIAL) + time.sleep(RESET_DELAY) + + +def spifi_chip_reset_qpi(openocd: OpenOcdTclRpc): + #print("Sending 'Reset' to external chip in QPI mode", flush=True) + spifi_send_command(openocd, ENABLE_RESET_COMMAND, SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) + spifi_send_command(openocd, RESET_COMMAND, + SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) + time.sleep(RESET_DELAY) + +#def spifi_chip_disable_qpi(openocd: OpenOcdTclRpc): + #print("Sending 'Disable QPI' command to external flash chip in QPI mode.", flush=True) +# spifi_send_command(openocd, DISABLE_QPI_COMMAND, +# SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) def spifi_chip_erase(openocd: OpenOcdTclRpc): @@ -393,10 +416,13 @@ def spifi_sector_erase(openocd: OpenOcdTclRpc, address: int): SPIFI_Frameform.OPCODE_3ADDR, SPIFI_Fieldform.ALL_SERIAL, address=address) -def spifi_read_data(openocd: OpenOcdTclRpc, address: int, byte_count: int, bin_data: List[int], dma: Union[DMA, None] = None) -> int: +def spifi_read_data(openocd: OpenOcdTclRpc, address: int, byte_count: int, bin_data: List[int], dma: Union[DMA, None] = None, use_quad_spi=False) -> int: read_data: List[int] = [] - read_data = spifi_send_command(openocd, READ_DATA_COMMAND, SPIFI_Frameform.OPCODE_3ADDR, SPIFI_Fieldform.ALL_SERIAL, byte_count=byte_count, address=address, dma=dma) + if (use_quad_spi): + read_data = spifi_send_command(openocd, FAST_READ_QUAD_OUTPUT_COMMAND, SPIFI_Frameform.OPCODE_3ADDR, SPIFI_Fieldform.DATA_PARALLEL, byte_count=byte_count, address=address, idata_length=1, dma=dma) + else: + read_data = spifi_send_command(openocd, READ_DATA_COMMAND, SPIFI_Frameform.OPCODE_3ADDR, SPIFI_Fieldform.ALL_SERIAL, byte_count=byte_count, address=address, dma=dma) for i in range(byte_count): if read_data[i] != bin_data[i]: @@ -508,19 +534,21 @@ def spifi_quad_page_program( def spifi_quad_enable(openocd): - spifi_write_sreg( - openocd, - spifi_read_sreg(openocd, SREG_Num.SREG1), - spifi_read_sreg(openocd, SREG_Num.SREG2) | SREG2_QUAD_ENABLE_M - ) + if (spifi_check_quad_enable(openocd) != True): + 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): - spifi_write_sreg( - openocd, - spifi_read_sreg(openocd, SREG_Num.SREG1), - spifi_read_sreg(openocd, SREG_Num.SREG2) & (0xFF ^ SREG2_QUAD_ENABLE_M) - ) +#def spifi_quad_disable(openocd): +# if (spifi_check_quad_enable(openocd) == True): +# spifi_write_sreg( +# openocd, +# spifi_read_sreg(openocd, SREG_Num.SREG1), +# spifi_read_sreg(openocd, SREG_Num.SREG2) & (0xFF ^ SREG2_QUAD_ENABLE_M) +# ) def spifi_check_quad_enable(openocd): @@ -539,10 +567,16 @@ def check_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp openocd.halt() spifi_init(openocd) + + # Сбрасываем микросхему в режиме QPI из всех состояний в нормальный SPI режим. + spifi_chip_reset_qpi(openocd) + + # Сбрасываем микросхему в режиме SPI из всех состояний в нормальный SPI режим. + spifi_chip_reset(openocd) - JEDEC_ID = spifi_send_command(openocd, 0x9F, SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_SERIAL, 3) + JEDEC_ID = spifi_send_command(openocd, JEDEC_ID_COMMAND, 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}") + print(f"JEDEC ID = {JEDEC_ID[0]:02x} {JEDEC_ID[1]:02x} {JEDEC_ID[2]:02x}") dma = DMA(openocd) dma.init() @@ -586,10 +620,11 @@ def check_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp dma.channels[1].read_ack = ChannelAck.DISABLE if (use_quad_spi): - print("Quad Enable") + print("Using Quad SPI") spifi_quad_enable(openocd) else: - spifi_quad_disable(openocd) + print("Using Single SPI") + # spifi_quad_disable(openocd) pages_offsets = list(pages) @@ -597,12 +632,12 @@ def check_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp print(f"Check page {page_offset:#010x}... {(index*100)//pages_offsets.__len__()}%", flush=True) page_bytes = pages[page_offset] - result = spifi_read_data(openocd, page_offset, 256, page_bytes, dma=dma) + result = spifi_read_data(openocd, page_offset, 256, page_bytes, dma=dma, use_quad_spi=use_quad_spi) if result == 1: print("Data error") - if (use_quad_spi): - spifi_quad_disable(openocd) + #if (use_quad_spi): + # spifi_quad_disable(openocd) return result if result == 0: @@ -624,12 +659,15 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp openocd.halt() spifi_init(openocd) - # Выводим микросхему из режима QPI, так как SPIFI здесь будет работать в режиме SPI. - spifi_chip_disable_qpi(openocd) + # Сбрасываем микросхему в режиме QPI из всех состояний в нормальный SPI режим. + spifi_chip_reset_qpi(openocd) + + # Сбрасываем микросхему в режиме SPI из всех состояний в нормальный SPI режим. + spifi_chip_reset(openocd) - JEDEC_ID = spifi_send_command(openocd, 0x9F, SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_SERIAL, 3) + JEDEC_ID = spifi_send_command(openocd, JEDEC_ID_COMMAND, 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}") + print(f"JEDEC ID = {JEDEC_ID[0]:02x} {JEDEC_ID[1]:02x} {JEDEC_ID[2]:02x}") dma = DMA(openocd) dma.init() @@ -692,7 +730,7 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp spifi_quad_enable(openocd) else: print("Using Single SPI") - spifi_quad_disable(openocd) + #spifi_quad_disable(openocd) # print("SREG1", spifi_read_sreg(openocd, SREG_Num.SREG1)) # print("SREG2", spifi_read_sreg(openocd, SREG_Num.SREG2)) @@ -709,14 +747,14 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp spifi_page_program(openocd, page_offset, page_bytes, 256, f"{(index*100)//pages_offsets.__len__()}%", dma=dma) - result = spifi_read_data(openocd, page_offset, 256, page_bytes, dma=dma) + result = spifi_read_data(openocd, page_offset, 256, page_bytes, dma=dma, use_quad_spi=use_quad_spi) if result == 1: print("Data error") return result - if (use_quad_spi): - spifi_quad_disable(openocd) + #if (use_quad_spi): + # spifi_quad_disable(openocd) # # PROFILING GET STATS # pr.disable() From e49328c1a9a33b0476ec01ece669af2ea1266612 Mon Sep 17 00:00:00 2001 From: spam-receiver <48826370+spam-receiver@users.noreply.github.com> Date: Thu, 18 Jul 2024 22:42:02 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=A4=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20mik32=5Fu?= =?UTF-8?q?pload.exe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mik32_upload.spec | 37 +++++++++++++++++++++++++++++++++++++ mik32_upload_build.bat | 1 + 2 files changed, 38 insertions(+) create mode 100644 mik32_upload.spec create mode 100644 mik32_upload_build.bat diff --git a/mik32_upload.spec b/mik32_upload.spec new file mode 100644 index 0000000..f88166e --- /dev/null +++ b/mik32_upload.spec @@ -0,0 +1,37 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['mik32_upload.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='mik32_upload', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/mik32_upload_build.bat b/mik32_upload_build.bat new file mode 100644 index 0000000..b1f9159 --- /dev/null +++ b/mik32_upload_build.bat @@ -0,0 +1 @@ +pyinstaller mik32_upload.spec \ No newline at end of file From 094a94276878d72564566a1481b6cddccf1e4b81 Mon Sep 17 00:00:00 2001 From: spam-receiver <48826370+spam-receiver@users.noreply.github.com> Date: Fri, 19 Jul 2024 03:31:15 +0300 Subject: [PATCH 4/6] Update mikron-link.cfg --- openocd-scripts/interface/ftdi/mikron-link.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openocd-scripts/interface/ftdi/mikron-link.cfg b/openocd-scripts/interface/ftdi/mikron-link.cfg index b2d7f1f..9cf6086 100644 --- a/openocd-scripts/interface/ftdi/mikron-link.cfg +++ b/openocd-scripts/interface/ftdi/mikron-link.cfg @@ -2,7 +2,9 @@ # FT2232HL for openOCD Device # -interface ftdi +adapter driver ftdi +adapter speed 500 + # ftdi_device_desc "Dual RS232-HS (Interface 1)" ftdi vid_pid 0x0403 0x6010 From cc8598f055a34a01bed17d7dfa994e36218dd32e Mon Sep 17 00:00:00 2001 From: spam-receiver <48826370+spam-receiver@users.noreply.github.com> Date: Tue, 23 Jul 2024 05:42:32 +0300 Subject: [PATCH 5/6] Update mik32_check.py --- mik32_check.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mik32_check.py b/mik32_check.py index 5096b1d..1960640 100644 --- a/mik32_check.py +++ b/mik32_check.py @@ -7,7 +7,7 @@ import time from typing import List, Union from mik32_pm import pm_init -from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32v0_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size +from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32v2_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size from mik32_gpio import MIK32_Version, gpio_init, gpio_deinit import mik32_eeprom import mik32_spifi @@ -47,7 +47,7 @@ def upload_file( print(f"ERROR: File {filename} does not exist") exit(1) - file = FirmwareFile(filename, mik32v0_sections) + file = FirmwareFile(filename, mik32v2_sections) segments: List[Segment] = file.get_segments() pages: Pages = form_pages(segments, boot_mode) From aa6c5d5cbd8d658359b0470948728919df6042ca Mon Sep 17 00:00:00 2001 From: spam-receiver <48826370+spam-receiver@users.noreply.github.com> Date: Tue, 23 Jul 2024 05:53:57 +0300 Subject: [PATCH 6/6] Update mik32_check.py --- mik32_check.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mik32_check.py b/mik32_check.py index 1960640..5096b1d 100644 --- a/mik32_check.py +++ b/mik32_check.py @@ -7,7 +7,7 @@ import time from typing import List, Union from mik32_pm import pm_init -from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32v2_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size +from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32v0_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size from mik32_gpio import MIK32_Version, gpio_init, gpio_deinit import mik32_eeprom import mik32_spifi @@ -47,7 +47,7 @@ def upload_file( print(f"ERROR: File {filename} does not exist") exit(1) - file = FirmwareFile(filename, mik32v2_sections) + file = FirmwareFile(filename, mik32v0_sections) segments: List[Segment] = file.get_segments() pages: Pages = form_pages(segments, boot_mode)