Merge pull request #4 from spam-receiver/master

Update mik32_spifi.py
This commit is contained in:
sh-sergey 2024-08-13 14:45:37 +03:00 committed by GitHub
commit 0809df33b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 119 additions and 30 deletions

View File

@ -140,12 +140,17 @@ 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
MEM_CONFIG_COMMAND = 0x61
MEM_CONFIG_VALUE = 0x7F
@ -165,6 +170,8 @@ PAGE_PROGRAM_COMMAND = 0x02
QUAD_PAGE_PROGRAM_COMMAND = 0x32
JEDEC_ID_COMMAND = 0x9F
class SREG_Num(Enum):
SREG1 = 0x00
@ -216,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)
@ -351,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,
@ -372,6 +379,30 @@ def spifi_wait_busy(openocd: OpenOcdTclRpc):
if not (sreg1 & SREG1_BUSY):
break
RESET_DELAY = 0.001
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):
print("Chip erase...", flush=True)
@ -385,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]:
@ -500,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):
@ -531,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()
@ -578,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)
@ -589,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:
@ -615,10 +658,16 @@ def write_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()
@ -681,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))
@ -698,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()

37
mik32_upload.spec Normal file
View File

@ -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,
)

1
mik32_upload_build.bat Normal file
View File

@ -0,0 +1 @@
pyinstaller mik32_upload.spec

View File

@ -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