Update mik32_spifi.py

This commit is contained in:
spam-receiver 2024-07-18 22:31:17 +03:00 committed by GitHub
parent 4f60843fc5
commit 1201ab7228
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -140,13 +140,16 @@ SREG1_BUSY = 1
READ_LEN = 256 READ_LEN = 256
TIMEOUT = 1000 TIMEOUT = 1000
ENABLE_RESET_COMMAND = 0x66
RESET_COMMAND = 0x99
CHIP_ERASE_COMMAND = 0xC7 CHIP_ERASE_COMMAND = 0xC7
SECTOR_ERASE_COMMAND = 0x20 SECTOR_ERASE_COMMAND = 0x20
WRITE_ENABLE_COMMAND = 0x06 WRITE_ENABLE_COMMAND = 0x06
WRITE_DISABLE_COMMAND = 0x04 WRITE_DISABLE_COMMAND = 0x04
DISABLE_QPI_COMMAND = 0xFF #DISABLE_QPI_COMMAND = 0xFF
MEM_CONFIG_COMMAND = 0x61 MEM_CONFIG_COMMAND = 0x61
MEM_CONFIG_VALUE = 0x7F MEM_CONFIG_VALUE = 0x7F
@ -167,6 +170,8 @@ PAGE_PROGRAM_COMMAND = 0x02
QUAD_PAGE_PROGRAM_COMMAND = 0x32 QUAD_PAGE_PROGRAM_COMMAND = 0x32
JEDEC_ID_COMMAND = 0x9F
class SREG_Num(Enum): class SREG_Num(Enum):
SREG1 = 0x00 SREG1 = 0x00
@ -218,7 +223,7 @@ def spifi_init_memory(openocd: OpenOcdTclRpc):
openocd.write_word(SPIFI_CONFIG_MCMD, (0 << SPIFI_CONFIG_MCMD_INTLEN_S) | 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_FIELDFORM_ALL_SERIAL << SPIFI_CONFIG_MCMD_FIELDFORM_S) |
(SPIFI_CONFIG_CMD_FRAMEFORM_OPCODE_3ADDR << SPIFI_CONFIG_MCMD_FRAMEFORM_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) 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): def spifi_write_sreg(openocd: OpenOcdTclRpc, sreg1: int, sreg2: int):
spifi_send_command(openocd, 0xFF, # spifi_send_command(openocd, DISABLE_QPI_COMMAND,
SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL) # SPIFI_Frameform.OPCODE_NOADDR, SPIFI_Fieldform.ALL_PARALLEL)
spifi_write_enable(openocd) spifi_write_enable(openocd)
spifi_send_command( spifi_send_command(
openocd, openocd,
@ -374,11 +379,29 @@ def spifi_wait_busy(openocd: OpenOcdTclRpc):
if not (sreg1 & SREG1_BUSY): if not (sreg1 & SREG1_BUSY):
break break
RESET_DELAY = 0.001
def spifi_chip_disable_qpi(openocd: OpenOcdTclRpc): def spifi_chip_reset(openocd: OpenOcdTclRpc):
#print("Sending 'Disable QPI' command to external flash chip in QPI mode.", flush=True) #print("Sending 'Reset' to external chip in SPI mode", flush=True)
spifi_send_command(openocd, DISABLE_QPI_COMMAND, 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_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): 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) 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: 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): for i in range(byte_count):
if read_data[i] != bin_data[i]: if read_data[i] != bin_data[i]:
@ -508,19 +534,21 @@ def spifi_quad_page_program(
def spifi_quad_enable(openocd): def spifi_quad_enable(openocd):
spifi_write_sreg( if (spifi_check_quad_enable(openocd) != True):
openocd, spifi_write_sreg(
spifi_read_sreg(openocd, SREG_Num.SREG1), openocd,
spifi_read_sreg(openocd, SREG_Num.SREG2) | SREG2_QUAD_ENABLE_M spifi_read_sreg(openocd, SREG_Num.SREG1),
) spifi_read_sreg(openocd, SREG_Num.SREG2) | SREG2_QUAD_ENABLE_M
)
def spifi_quad_disable(openocd): #def spifi_quad_disable(openocd):
spifi_write_sreg( # if (spifi_check_quad_enable(openocd) == True):
openocd, # spifi_write_sreg(
spifi_read_sreg(openocd, SREG_Num.SREG1), # openocd,
spifi_read_sreg(openocd, SREG_Num.SREG2) & (0xFF ^ SREG2_QUAD_ENABLE_M) # 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): 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() openocd.halt()
spifi_init(openocd) 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 = DMA(openocd)
dma.init() 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 dma.channels[1].read_ack = ChannelAck.DISABLE
if (use_quad_spi): if (use_quad_spi):
print("Quad Enable") print("Using Quad SPI")
spifi_quad_enable(openocd) spifi_quad_enable(openocd)
else: else:
spifi_quad_disable(openocd) print("Using Single SPI")
# spifi_quad_disable(openocd)
pages_offsets = list(pages) 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) print(f"Check page {page_offset:#010x}... {(index*100)//pages_offsets.__len__()}%", flush=True)
page_bytes = pages[page_offset] 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: if result == 1:
print("Data error") print("Data error")
if (use_quad_spi): #if (use_quad_spi):
spifi_quad_disable(openocd) # spifi_quad_disable(openocd)
return result return result
if result == 0: if result == 0:
@ -624,12 +659,15 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp
openocd.halt() openocd.halt()
spifi_init(openocd) spifi_init(openocd)
# Выводим микросхему из режима QPI, так как SPIFI здесь будет работать в режиме SPI. # Сбрасываем микросхему в режиме QPI из всех состояний в нормальный SPI режим.
spifi_chip_disable_qpi(openocd) 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 = DMA(openocd)
dma.init() dma.init()
@ -692,7 +730,7 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp
spifi_quad_enable(openocd) spifi_quad_enable(openocd)
else: else:
print("Using Single SPI") print("Using Single SPI")
spifi_quad_disable(openocd) #spifi_quad_disable(openocd)
# print("SREG1", spifi_read_sreg(openocd, SREG_Num.SREG1)) # print("SREG1", spifi_read_sreg(openocd, SREG_Num.SREG1))
# print("SREG2", spifi_read_sreg(openocd, SREG_Num.SREG2)) # 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, spifi_page_program(openocd, page_offset, page_bytes,
256, f"{(index*100)//pages_offsets.__len__()}%", dma=dma) 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: if result == 1:
print("Data error") print("Data error")
return result return result
if (use_quad_spi): #if (use_quad_spi):
spifi_quad_disable(openocd) # spifi_quad_disable(openocd)
# # PROFILING GET STATS # # PROFILING GET STATS
# pr.disable() # pr.disable()