config gpio in spifi mode for v2, fix large hex upload

This commit is contained in:
Sergey Shchelkanov 2023-09-26 12:55:35 +03:00
parent c274798f6d
commit 1febc24a8e
4 changed files with 144 additions and 30 deletions

83
mik32_gpio.py Normal file
View File

@ -0,0 +1,83 @@
# --------------------------
# PM register offset
# --------------------------
from enum import Enum
from tclrpc import OpenOcdTclRpc
class MIK_VERSION(Enum):
MIK32V0 = "MIK32V0"
MIK32V2 = "MIK32V2"
def __str__(self):
return self.value
PAD_CONFIG_BASE_ADDRESS = 0x00050C00
class PAD_CONFIG_REGS_V0(Enum):
PORT_0_CFG = 0x00
PORT_1_CFG = 0x04
PORT_2_CFG = 0x08
PORT_0_DS = 0x0C
PORT_1_DS = 0x10
PORT_2_DS = 0x14
PORT_0_PUD = 0x18
PORT_1_PUD = 0x1C
PORT_2_PUD = 0x20
class PAD_CONFIG_REGS_V2(Enum):
PORT_0_CFG = 0x00
PORT_0_DS = 0x04
PORT_0_PUD = 0x08
PORT_1_CFG = 0x0C
PORT_1_DS = 0x10
PORT_1_PUD = 0x14
PORT_2_CFG = 0x18
PORT_2_DS = 0x1C
PORT_2_PUD = 0x20
port2_value = 0
def gpio_init(openocd: OpenOcdTclRpc, version: MIK_VERSION):
port2_addr = 0
if version == MIK_VERSION.MIK32V0:
port2_addr = PAD_CONFIG_BASE_ADDRESS + PAD_CONFIG_REGS_V0.PORT_2_CFG.value
elif version == MIK_VERSION.MIK32V2:
port2_addr = PAD_CONFIG_BASE_ADDRESS + PAD_CONFIG_REGS_V2.PORT_2_CFG.value
else:
return
openocd.halt()
port2_value = openocd.read_memory(port2_addr, 32, 1)[0]
port2_value_updated = port2_value
port2_value_updated &= 0xF000
if version == MIK_VERSION.MIK32V0:
port2_value_updated |= 0x000
elif version == MIK_VERSION.MIK32V2:
port2_value_updated |= 0x555
else:
return
openocd.write_word(port2_addr, port2_value_updated)
openocd.write_word(port2_addr + 8, 0x0500)
def gpio_deinit(openocd: OpenOcdTclRpc, version: MIK_VERSION):
if version == MIK_VERSION.MIK32V0:
port2_addr = PAD_CONFIG_BASE_ADDRESS + PAD_CONFIG_REGS_V0.PORT_2_CFG.value
elif version == MIK_VERSION.MIK32V2:
port2_addr = PAD_CONFIG_BASE_ADDRESS + PAD_CONFIG_REGS_V2.PORT_2_CFG.value
else:
return
openocd.write_word(port2_addr, port2_value)

View File

@ -131,7 +131,7 @@ def pm_init(openocd: OpenOcdTclRpc):
PM_CLOCK_APB_M_WU_M PM_CLOCK_APB_M_WU_M
) )
# 0x89 # 0x89
APB_P_default = 0 APB_P_default = PM_CLOCK_APB_P_GPIO_2_M
# 0x00 # 0x00
openocd.halt() openocd.halt()

View File

@ -278,7 +278,7 @@ def spifi_send_command(
data: List[int] = [], data: List[int] = [],
dma: Union[DMA, None] = None dma: Union[DMA, None] = None
) -> List[int]: ) -> List[int]:
if dma is not None and direction == SPIFI_Direction.WRITE: if (dma is not None) and (direction == SPIFI_Direction.WRITE):
openocd.write_memory(0x02003F00, 8, data) openocd.write_memory(0x02003F00, 8, data)
dma.channels[0].start( dma.channels[0].start(
@ -286,28 +286,36 @@ def spifi_send_command(
SPIFI_CONFIG_DATA32, SPIFI_CONFIG_DATA32,
255 255
) )
elif dma is not None and direction == SPIFI_Direction.READ: elif (dma is not None) and (direction == SPIFI_Direction.READ):
dma.channels[1].start( dma.channels[1].start(
SPIFI_CONFIG_DATA32, SPIFI_CONFIG_DATA32,
0x02003F00, 0x02003F00,
255 255
) )
if address != 0:
openocd.write_word(SPIFI_CONFIG_ADDR, address) openocd.write_word(SPIFI_CONFIG_ADDR, address)
if idata != 0: # if idata != 0:
openocd.write_word(SPIFI_CONFIG_IDATA, idata) # openocd.write_word(SPIFI_CONFIG_IDATA, idata)
if cache_limit != 0: # if cache_limit != 0:
openocd.write_word(SPIFI_CONFIG_CLIMIT, cache_limit) # openocd.write_word(SPIFI_CONFIG_CLIMIT, cache_limit)
# spifi_intrq_clear(openocd) # # spifi_intrq_clear(openocd)
openocd.write_word(SPIFI_CONFIG_CMD, (cmd << SPIFI_CONFIG_CMD_OPCODE_S) | # openocd.write_word(SPIFI_CONFIG_CMD, (cmd << SPIFI_CONFIG_CMD_OPCODE_S) |
# (frameform.value << SPIFI_CONFIG_CMD_FRAMEFORM_S) |
# (fieldform.value << SPIFI_CONFIG_CMD_FIELDFORM_S) |
# (byte_count << SPIFI_CONFIG_CMD_DATALEN_S) |
# (idata_length << SPIFI_CONFIG_CMD_INTLEN_S) |
# (direction.value << SPIFI_CONFIG_CMD_DOUT_S))
# # spifi_wait_intrq_timeout(openocd, "Timeout executing write enable command")
cmd_write_value = ((cmd << SPIFI_CONFIG_CMD_OPCODE_S) |
(frameform.value << SPIFI_CONFIG_CMD_FRAMEFORM_S) | (frameform.value << SPIFI_CONFIG_CMD_FRAMEFORM_S) |
(fieldform.value << SPIFI_CONFIG_CMD_FIELDFORM_S) | (fieldform.value << SPIFI_CONFIG_CMD_FIELDFORM_S) |
(byte_count << SPIFI_CONFIG_CMD_DATALEN_S) | (byte_count << SPIFI_CONFIG_CMD_DATALEN_S) |
(idata_length << SPIFI_CONFIG_CMD_INTLEN_S) | (idata_length << SPIFI_CONFIG_CMD_INTLEN_S) |
(direction.value << SPIFI_CONFIG_CMD_DOUT_S)) (direction.value << SPIFI_CONFIG_CMD_DOUT_S))
# spifi_wait_intrq_timeout(openocd, "Timeout executing write enable command")
openocd.write_memory(SPIFI_CONFIG_CMD, 32, [cmd_write_value, address, idata, cache_limit])
if direction == SPIFI_Direction.READ: if direction == SPIFI_Direction.READ:
out_list = [] out_list = []
@ -519,6 +527,10 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp
openocd.halt() openocd.halt()
spifi_init(openocd) spifi_init(openocd)
JEDEC_ID = spifi_send_command(openocd, 0x9F, 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}")
dma = DMA(openocd) dma = DMA(openocd)
dma.init() dma.init()
@ -565,10 +577,16 @@ def write_pages(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc, use_quad_sp
else: else:
spifi_erase(openocd, EraseType.SECTOR_ERASE, spifi_erase(openocd, EraseType.SECTOR_ERASE,
get_segments_list(list(pages), 4*1024)) get_segments_list(list(pages), 4*1024))
address = 0
# for addr in range(0, 4096*2, 256):
# result = spifi_read_data(openocd, addr, 256, [0xFF]*256, dma=dma)
# if result == 1:
# print("Data error")
# return result
if (use_quad_spi): if (use_quad_spi):
print("quad enable") print("Quad Enable")
spifi_quad_enable(openocd) spifi_quad_enable(openocd)
else: else:
spifi_quad_disable(openocd) spifi_quad_disable(openocd)

View File

@ -7,6 +7,7 @@ import time
from enum import Enum from enum import Enum
from typing import List, Dict, NamedTuple, Union from typing import List, Dict, NamedTuple, Union
from tclrpc import OpenOcdTclRpc, TclException from tclrpc import OpenOcdTclRpc, TclException
from mik32_gpio import MIK_VERSION, gpio_init, gpio_deinit
import mik32_eeprom import mik32_eeprom
import mik32_spifi import mik32_spifi
import mik32_ram import mik32_ram
@ -219,25 +220,15 @@ class OpenOCDStartupException(Exception):
return f"OpenOCD Startup Exception: {self.msg}" return f"OpenOCD Startup Exception: {self.msg}"
adapter_speed_not_supported = [
"altera-usb-blaster",
]
def run_openocd( def run_openocd(
openocd_exec=openocd_exec_path, openocd_exec=openocd_exec_path,
openocd_scripts=openocd_scripts_path, openocd_scripts=openocd_scripts_path,
openocd_interface=openocd_interface_path, openocd_interface=openocd_interface_path,
openocd_target=openocd_target_path, openocd_target=openocd_target_path,
adapter_speed=adapter_default_speed,
is_open_console=False is_open_console=False
) -> subprocess.Popen: ) -> subprocess.Popen:
cmd = [openocd_exec, "-s", openocd_scripts, "-f", openocd_interface] cmd = [openocd_exec, "-s", openocd_scripts,
"-f", openocd_interface, "-f", openocd_target]
if (all(openocd_interface.find(i) == -1 for i in adapter_speed_not_supported)):
cmd.extend(["-c", f"adapter speed {adapter_speed}"])
cmd.extend(["-f", openocd_target])
creation_flags = subprocess.SW_HIDE creation_flags = subprocess.SW_HIDE
if is_open_console: if is_open_console:
@ -282,6 +273,11 @@ def form_pages(segments: List[Segment], boot_mode=BootMode.UNDEFINED) -> Pages:
return Pages(pages_eeprom, pages_spifi) return Pages(pages_eeprom, pages_spifi)
adapter_speed_not_supported = [
"altera-usb-blaster",
]
def upload_file( def upload_file(
filename: str, filename: str,
host: str = '127.0.0.1', host: str = '127.0.0.1',
@ -296,7 +292,8 @@ def upload_file(
is_open_console=False, is_open_console=False,
boot_mode=BootMode.UNDEFINED, boot_mode=BootMode.UNDEFINED,
log_path=default_log_path, log_path=default_log_path,
post_action=default_post_action post_action=default_post_action,
mik_version=MIK_VERSION.MIK32V2
) -> int: ) -> int:
""" """
Write ihex or binary file into MIK32 EEPROM or external flash memory Write ihex or binary file into MIK32 EEPROM or external flash memory
@ -304,6 +301,8 @@ def upload_file(
@return: return 0 if successful, 1 if failed @return: return 0 if successful, 1 if failed
""" """
print(f"Using {mik_version.value}")
result = 0 result = 0
if not os.path.exists(filename): if not os.path.exists(filename):
@ -320,8 +319,8 @@ def upload_file(
try: try:
logging.debug("OpenOCD try start!") logging.debug("OpenOCD try start!")
proc = run_openocd(openocd_exec, openocd_scripts, openocd_interface, proc = run_openocd(openocd_exec, openocd_scripts,
openocd_target, adapter_speed, is_open_console) openocd_interface, openocd_target, is_open_console)
logging.debug("OpenOCD started!") logging.debug("OpenOCD started!")
@ -329,6 +328,8 @@ def upload_file(
raise OpenOCDStartupException(e) raise OpenOCDStartupException(e)
try: try:
with OpenOcdTclRpc(host, port) as openocd: 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}")
openocd.run(f"log_output \"{log_path}\"") openocd.run(f"log_output \"{log_path}\"")
openocd.run(f"debug_level 1") openocd.run(f"debug_level 1")
@ -348,6 +349,7 @@ def upload_file(
write_size = pages.pages_eeprom.__len__() * memory_page_size[MemoryType.EEPROM] write_size = pages.pages_eeprom.__len__() * memory_page_size[MemoryType.EEPROM]
print(f"Wrote {write_size} bytes in {write_time:.2f} seconds (effective {(write_size/(write_time*1024)):.1f} kbyte/s)") print(f"Wrote {write_size} bytes in {write_time:.2f} seconds (effective {(write_size/(write_time*1024)):.1f} kbyte/s)")
if (pages.pages_spifi.__len__() > 0): if (pages.pages_spifi.__len__() > 0):
gpio_init(openocd, mik_version)
start_time = time.perf_counter() start_time = time.perf_counter()
result |= mik32_spifi.write_pages( result |= mik32_spifi.write_pages(
@ -356,6 +358,7 @@ def upload_file(
write_time = time.perf_counter() - start_time write_time = time.perf_counter() - start_time
write_size = pages.pages_spifi.__len__() * memory_page_size[MemoryType.SPIFI] write_size = pages.pages_spifi.__len__() * memory_page_size[MemoryType.SPIFI]
print(f"Wrote {write_size} bytes in {write_time:.2f} seconds (effective {(write_size/(write_time*1024)):.1f} kbyte/s)") print(f"Wrote {write_size} bytes in {write_time:.2f} seconds (effective {(write_size/(write_time*1024)):.1f} kbyte/s)")
gpio_deinit(openocd, mik_version)
segments_ram = list(filter( segments_ram = list(filter(
lambda segment: (segment.memory is not None) and (segment.memory.type == MemoryType.RAM), segments)) lambda segment: (segment.memory is not None) and (segment.memory.type == MemoryType.RAM), segments))
@ -488,7 +491,16 @@ def createParser():
default=False, default=False,
help='Вывод без последовательностей управления терминалом. Временно не используется' help='Вывод без последовательностей управления терминалом. Временно не используется'
) )
parser.add_argument(
'-t',
'--mcu-type',
dest='mcu_type',
type=MIK_VERSION,
choices=list(MIK_VERSION),
default=MIK_VERSION.MIK32V2,
help="Выбор микроконтроллера. "
f"По умолчанию: {MIK_VERSION.MIK32V2}"
)
return parser return parser
@ -514,6 +526,7 @@ if __name__ == '__main__':
boot_mode=namespace.boot_mode, boot_mode=namespace.boot_mode,
log_path=namespace.log_path, log_path=namespace.log_path,
post_action=namespace.post_action, post_action=namespace.post_action,
mik_version=namespace.mcu_type
) )
else: else:
print("Nothing to upload") print("Nothing to upload")