mirror of
https://github.com/MikronMIK32/mik32-uploader.git
synced 2026-01-01 13:37:03 +03:00
Добавлена обработка ошибки при проверке
This commit is contained in:
parent
e66c5b0f03
commit
c821a3c5fd
@ -1 +1 @@
|
||||
applicaton_version = 'v0.2.1'
|
||||
applicaton_version = 'v0.3.0-alpha1'
|
||||
|
||||
@ -32,7 +32,7 @@ class EEPROM_AffectedPages(Enum):
|
||||
def eeprom_execute_operation(openocd: OpenOcdTclRpc, op: EEPROM_Operation, affected_pages: EEPROM_AffectedPages, offset: int, buffer: List[int]):
|
||||
# buffer write enable and select affected pages
|
||||
openocd.write_memory(mem_map.EEPROM_REGS_EEA, 32, [offset, (1 << eeprom_fields.EECON_BWE_S)
|
||||
| (affected_pages.value << eeprom_fields.EECON_WRBEH_S)])
|
||||
| (affected_pages.value << eeprom_fields.EECON_WRBEH_S)])
|
||||
|
||||
if buffer.__len__() > 32:
|
||||
return
|
||||
@ -41,7 +41,8 @@ def eeprom_execute_operation(openocd: OpenOcdTclRpc, op: EEPROM_Operation, affec
|
||||
# start operation
|
||||
openocd.write_word(mem_map.EEPROM_REGS_EECON, (
|
||||
(1 << eeprom_fields.EECON_EX_S) | (1 << eeprom_fields.EECON_BWE_S) |
|
||||
(op.value << eeprom_fields.EECON_OP_S) | (affected_pages.value << eeprom_fields.EECON_WRBEH_S)
|
||||
(op.value << eeprom_fields.EECON_OP_S) | (
|
||||
affected_pages.value << eeprom_fields.EECON_WRBEH_S)
|
||||
))
|
||||
|
||||
|
||||
@ -267,7 +268,10 @@ def wait_halted(openocd: OpenOcdTclRpc, timeout_seconds: float = 2):
|
||||
openocd.run(f'wait_halt {int(timeout_seconds * 1000)}')
|
||||
|
||||
|
||||
def collapse_pages(pages: Dict[int, List[int]]) -> List[int]:
|
||||
def combine_pages(pages: Dict[int, List[int]]) -> List[int]:
|
||||
"""
|
||||
Объединить страницы в последовательность байт с заполнением промежутков
|
||||
"""
|
||||
bytes_list: List[int] = []
|
||||
found_pages = 0
|
||||
for page in range(64):
|
||||
@ -284,22 +288,31 @@ def collapse_pages(pages: Dict[int, List[int]]) -> List[int]:
|
||||
|
||||
|
||||
def write_memory(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc) -> int:
|
||||
result = 0
|
||||
"""
|
||||
Записать всю память с использованием драйвера.
|
||||
|
||||
bytes_list = collapse_pages(pages)
|
||||
max_address = len(bytes_list) - 1
|
||||
pages: Dict[int, List[int]] -- страница - список байт, ключ - адрес в EEPROM
|
||||
"""
|
||||
|
||||
# TODO: добавить проверку на версию mik32 - текущий драйвер поддерживает
|
||||
# только версию mik32v2
|
||||
|
||||
bytes_list = combine_pages(pages)
|
||||
openocd.halt()
|
||||
openocd.write_memory(0x02003800, 32, [1])
|
||||
openocd.run(f"set_reg {{t6 {max_address}}}")
|
||||
|
||||
STATUS_CODE_M = 0xFF
|
||||
|
||||
max_address = len(bytes_list) // 128
|
||||
openocd.write_memory(0x02003800, 32, [1 | (max_address << 8)])
|
||||
|
||||
pathname = os.path.dirname(sys.argv[0])
|
||||
openocd.run("wp 0x2003800 4 w")
|
||||
openocd.run("wp 0x2003800 4 w") # готовимся поймать результат записи
|
||||
|
||||
print("Uploading driver...", flush=True)
|
||||
# openocd.run("load_image {%s}" % pathlib.Path(os.path.join(pathname, "firmware.hex")))
|
||||
openocd.run("load_image {%s}" % pathlib.Path(
|
||||
"C:\\Users\\user\\.platformio\\packages\\tool-mik32-uploader\\upload_drivers\\jtag_eeprom\\.pio\\build\\mik32v2\\firmware.hex"
|
||||
))
|
||||
))
|
||||
|
||||
print("Uploading data...", flush=True)
|
||||
openocd.write_memory(0x02001800, 8, bytes_list)
|
||||
@ -307,11 +320,24 @@ def write_memory(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc) -> int:
|
||||
print("Uploading data complete! Run driver...", flush=True)
|
||||
openocd.resume(0x2000000)
|
||||
|
||||
wait_halted(openocd, 10)
|
||||
openocd.run("rwp 0x02003800")
|
||||
openocd.run("step")
|
||||
print(f"Check page result {openocd.read_memory(0x2003800, 32, 1)}")
|
||||
wait_halted(openocd, 10) # ждем, когда watchpoint сработает
|
||||
openocd.run("rwp 0x02003800") # watchpoint ловит до изменения слова
|
||||
openocd.run("step") # делаем шаг чтобы слово изменилось
|
||||
|
||||
result = openocd.read_memory(0x2003800, 32, 1)[0]
|
||||
|
||||
if (result & 0xFF) == 0:
|
||||
print(f"EEPROM writing successfully completed!", flush=True)
|
||||
else:
|
||||
miss_page = (result >> 8) & (64 - 1)
|
||||
miss_byte = (result >> 16) & (128 - 1)
|
||||
expected_byte = pages(miss_page*128)[miss_byte]
|
||||
miss_byte = (result >> 24) & 0xFF
|
||||
|
||||
print(f"EEPROM writing failed!", flush=True)
|
||||
print(f"First mismatched byte in page {miss_page},")
|
||||
print(f"byte {miss_byte}, expected {expected_byte}, read {miss_byte}")
|
||||
|
||||
return 1
|
||||
|
||||
if result == 0:
|
||||
print(f"{datetime.datetime.now().time()} EEPROM recording has been completed", flush=True)
|
||||
return 0
|
||||
|
||||
@ -434,6 +434,7 @@ if __name__ == '__main__':
|
||||
namespace = parser.parse_args()
|
||||
|
||||
print(program_name)
|
||||
print(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
if namespace.filepath:
|
||||
upload_file(
|
||||
|
||||
@ -1,13 +1,13 @@
|
||||
:020000040200F8
|
||||
:10000000FD62938202400100FD12E39E02FE374131
|
||||
:10001000000213010100B70100029381016AB705D4
|
||||
:1000200000029385056A370600021306066AB706C2
|
||||
:1000300000029386066A39A083A2050023A0560019
|
||||
:1000400091059106E3EAC5FEB70500029385056AAE
|
||||
:10005000370600021306066AB70600029386066A90
|
||||
:10001000000213010100B70100029381016CB705D2
|
||||
:1000200000029385056C370600021306066CB706BE
|
||||
:1000300000029386066C39A083A2050023A0560017
|
||||
:1000400091059106E3EAC5FEB70500029385056CAC
|
||||
:10005000370600021306066CB70600029386066C8C
|
||||
:1000600039A083A2050023A0560091059106E3EA7A
|
||||
:10007000C5FEB70500029385056A37060002130620
|
||||
:10008000066A21A023A005009105E3EDC5FEB70097
|
||||
:10007000C5FEB70500029385056C3706000213061E
|
||||
:10008000066C21A023A005009105E3EDC5FEB70095
|
||||
:100090000002E780C00AB7000002E780C00AB7008C
|
||||
:1000A0000002E780E02273005010F5BF828000005C
|
||||
:1000B0000000000000000000000000000000000040
|
||||
@ -33,77 +33,79 @@
|
||||
:1001F000C1171D8F3E96E374C3F8A5B75D71130652
|
||||
:1002000080028145280886C6B137BD47230CF1001E
|
||||
:100210008947230EF1003ED2E177938707082C0827
|
||||
:100220000A85231AF1026526B64061618280317128
|
||||
:1002300006DF22DD26DB4AD952D54ED7C1376146CB
|
||||
:1002400081452800013FB707070061679387074092
|
||||
:100250001307076A8D4613060002814548003724BC
|
||||
:10026000000261693EC2130404809D288144130981
|
||||
:10027000096A130A000863E4F4018147A9A093996D
|
||||
:10028000040193D90901CA87014793060002228617
|
||||
:10029000CE8548007D2013060008814508105D3D8D
|
||||
:1002A0004A87930600021010CE854800192A01479C
|
||||
:1002B0001410B3078700BA9683C6060083C70700E9
|
||||
:1002C0006388F6008947374700022320F78001A0A2
|
||||
:1002D0000507E31F47FD938404081304040861BF66
|
||||
:1002E0001C418E0603A88700B3E6060193E60608C4
|
||||
:1002F00094C7144999CA814663DDC600CCC323A0C4
|
||||
:1003000007003A850DE50D458280CCC3814663CC5C
|
||||
:10031000C600944793E6360094C775D7C8477D1743
|
||||
:10032000058965FD828023A007008506CDB703A857
|
||||
:10033000C7007D1513781800E31608FC85069105A3
|
||||
:1003400065BF032805000E0783288800336717015F
|
||||
:10035000136707082324E800184905C301476353BE
|
||||
:10036000D702131527002322B80032950841232015
|
||||
:10037000A8003E850DED0D4582802322B80001477F
|
||||
:10038000634FD70003278800136757002324E80032
|
||||
:10039000FDD30325C800FD1705897DF982809315DB
|
||||
:1003A0002700B2958C4105072320B800D1BF8328D0
|
||||
:1003B000C8007D1593F81800E39E08FA050791051B
|
||||
:1003C00079BF1C4989CF814763FFD7000328050007
|
||||
:1003D000BA882322B800639108020D458280084143
|
||||
:1003E0004CC163E4D700014582800C41139727007C
|
||||
:1003F00032970CC38507F5B70323C800FD181373A4
|
||||
:100400001300E31A03FC832808001398270032988E
|
||||
:10041000232018018507910545BF0547AA87630575
|
||||
:10042000E50209476300E506054591EBB7060600BE
|
||||
:10043000DC4A7D771307F73FF98FDCCA01458280DC
|
||||
:100440007D1719EB0D4582809306004037A7070002
|
||||
:1004500013070712B7050500905D7D8E75D237062C
|
||||
:1004600006005C4A7D771307F73FF98FD58F41115E
|
||||
:100470005CCA02C613073006B2476359F70001454C
|
||||
:1004800041018280856693860680C9B7B247850799
|
||||
:100490003EC6DDB791476307F50263EAA7008547CB
|
||||
:1004A000630AF50489476309F50405458280A1477D
|
||||
:1004B000E31DF5FE0947094501A8FD1781EFC8D2E4
|
||||
:1004C0000D45828005470D45B7A7070093870712A2
|
||||
:1004D000B7060500905E798E6DD28A05C98D4111EF
|
||||
:1004E000CCD202C613073006B247635AF700014563
|
||||
:1004F000410182801147C9BF21470145F1B7B24789
|
||||
:1005000085073EC6D5B70547AA876305E5020947B3
|
||||
:100510006302E506054591EBB70606009C4A7D7728
|
||||
:100520001307F73FF98F9CCA014582807D1719EBAD
|
||||
:100530000D4582809306004037A707001307071276
|
||||
:10054000B7050500905D7D8E75D2370706001C4B00
|
||||
:100550007D761306F63FF18FD58F1CCB85471CCFD8
|
||||
:10056000411102C613073006B2476359F70001452F
|
||||
:10057000410182808566938606807DBFB2478507EC
|
||||
:100580003EC6DDB711C98547630DF502054582807A
|
||||
:10059000FD1791EB0D4582800946B7A707009387A9
|
||||
:1005A0000712B7060500985E718F7DD34111C8D63A
|
||||
:1005B00002C613073006B2476357F70001454101F1
|
||||
:1005C00082800546D9BFB24785073EC6EDB7011107
|
||||
:1005D00026CAB7040600DC4806CE22CC4AC84EC65E
|
||||
:1005E00052C456C2F19BDCC89C482A89C845F19B7D
|
||||
:1005F0009CC883C7C5012E848A07DCC883C7D50180
|
||||
:100600008A079CC8193D0C44AA8A03454400593501
|
||||
:100610001848B70705002A8A98C358480850D8C315
|
||||
:10062000184C98C7CD35AA894850A93F8347040084
|
||||
:100630002A8793F6170089E6D44893E62600D4C8A3
|
||||
:1006400093F6270099E637060600544A93E616000B
|
||||
:1006500054CA93F6470099E637060600144A93E613
|
||||
:10066000260014CAA18B99E7B70606009C4A93E7B7
|
||||
:1006700017009CCAF24062442320590123224901F9
|
||||
:10068000232439012326E900D244B249224A924A5E
|
||||
:100690004A85424905618280000000000000000098
|
||||
:100220000A85231AF102F926B64061618280317194
|
||||
:1002300006DF22DD26DB4AD94ED752D55AD156D316
|
||||
:10024000753F6146814528003137B707070093871E
|
||||
:100250000740B74900023EC2938709808443616723
|
||||
:100260001307076AA18093F4F4038D461306000276
|
||||
:100270008145480037290002616A9E0469201309FC
|
||||
:100280000980014493890980130A0A6A130B000844
|
||||
:10029000634494008147A9A8931A040193DA0A01E0
|
||||
:1002A000D2870147930600024A86D68548006D280A
|
||||
:1002B0001306000881450810713D5287930600021D
|
||||
:1002C0001010D68548000D2201471C10BA9783C62E
|
||||
:1002D0000700B307270183C70700638ED700935732
|
||||
:1002E0007440A207E206D58F4207D98F93E7270013
|
||||
:1002F00023A0F90001A00507E31967FD1304040812
|
||||
:100300001309090871B71C418E0603A88700B3E6DC
|
||||
:10031000060193E6060894C7144999CA814663DD2D
|
||||
:10032000C600CCC323A007003A850DE50D458280A9
|
||||
:10033000CCC3814663CCC600944793E6360094C78D
|
||||
:1003400075D7C8477D17058965FD828023A0070002
|
||||
:100350008506CDB703A8C7007D1513781800E316EE
|
||||
:1003600008FC8506910565BF032805000E07832854
|
||||
:10037000880033671701136707082324E80018492A
|
||||
:1003800005C301476353D702131527002322B80082
|
||||
:10039000329508412320A8003E850DED0D45828051
|
||||
:1003A0002322B8000147634FD70003278800136753
|
||||
:1003B00057002324E800FDD30325C800FD17058955
|
||||
:1003C0007DF9828093152700B2958C410507232083
|
||||
:1003D000B800D1BF8328C8007D1593F81800E39EAC
|
||||
:1003E00008FA0507910579BF1C4989CF814763FF4A
|
||||
:1003F000D70003280500BA882322B80063910802B9
|
||||
:100400000D45828008414CC163E4D70001458280DC
|
||||
:100410000C411397270032970CC38507F5B70323C8
|
||||
:10042000C800FD1813731300E31A03FC83280800A7
|
||||
:10043000139827003298232018018507910545BF9E
|
||||
:100440000547AA876305E50209476300E5060545F8
|
||||
:1004500091EBB7060600DC4A7D771307F73FF98F6B
|
||||
:10046000DCCA014582807D1719EB0D458280930619
|
||||
:10047000004037A7070013070712B7050500905D76
|
||||
:100480007D8E75D2370606005C4A7D771307F73FED
|
||||
:10049000F98FD58F41115CCA02C613073006B247E7
|
||||
:1004A0006359F70001454101828085669386068085
|
||||
:1004B000C9B7B24785073EC6DDB791476307F50266
|
||||
:1004C00063EAA7008547630AF50489476309F504D1
|
||||
:1004D00005458280A147E31DF5FE0947094501A8AE
|
||||
:1004E000FD1781EFC8D20D45828005470D45B7A79E
|
||||
:1004F000070093870712B7060500905E798E6DD2CC
|
||||
:100500008A05C98D4111CCD202C613073006B24705
|
||||
:10051000635AF7000145410182801147C9BF214755
|
||||
:100520000145F1B7B24785073EC6D5B70547AA874B
|
||||
:100530006305E50209476302E506054591EBB70649
|
||||
:1005400006009C4A7D771307F73FF98F9CCA014547
|
||||
:1005500082807D1719EB0D4582809306004037A7F6
|
||||
:10056000070013070712B7050500905D7D8E75D251
|
||||
:10057000370706001C4B7D761306F63FF18FD58FAB
|
||||
:100580001CCB85471CCF411102C613073006B2476A
|
||||
:100590006359F70001454101828085669386068094
|
||||
:1005A0007DBFB24785073EC6DDB711C98547630DDC
|
||||
:1005B000F50205458280FD1791EB0D4582800946C5
|
||||
:1005C000B7A7070093870712B7060500985E718FDB
|
||||
:1005D0007DD34111C8D602C613073006B247635710
|
||||
:1005E000F7000145410182800546D9BFB247850722
|
||||
:1005F0003EC6EDB7011126CAB7040600DC4806CE98
|
||||
:1006000022CC4AC84EC652C456C2F19BDCC89C4894
|
||||
:100610002A89C845F19B9CC883C7C5012E848A07D7
|
||||
:10062000DCC883C7D5018A079CC8193D0C44AA8A37
|
||||
:100630000345440059351848B70705002A8A98C36E
|
||||
:1006400058480850D8C3184C98C7CD35AA89485087
|
||||
:10065000A93F834704002A8793F6170089E6D44808
|
||||
:1006600093E62600D4C893F6270099E637060600DD
|
||||
:10067000544A93E6160054CA93F6470099E63706A3
|
||||
:100680000600144A93E6260014CAA18B99E7B70620
|
||||
:1006900006009C4A93E717009CCAF240624423205C
|
||||
:1006A000590123224901232439012326E900D24498
|
||||
:1006B000B249224A924A4A85424905618280000035
|
||||
:0400000502000000F5
|
||||
:00000001FF
|
||||
|
||||
@ -13,4 +13,3 @@ platform = MIK32
|
||||
board = mik32v2
|
||||
framework = framework-mik32v2-sdk
|
||||
board_debug.ldscript = ram
|
||||
build_flags = -ffixed-x31 -D MIK32V2
|
||||
|
||||
@ -4,6 +4,29 @@
|
||||
#include "uart_lib.h"
|
||||
#include "xprintf.h"
|
||||
|
||||
/*
|
||||
31 8 7 0
|
||||
|--------------|----|
|
||||
code data code
|
||||
*/
|
||||
|
||||
#define STATUS_CODE_S 0
|
||||
#define STATUS_CODE(X) ((X) << STATUS_CODE_S)
|
||||
|
||||
#define STATUS_CODE_OK 0
|
||||
#define STATUS_CODE_START 1
|
||||
#define STATUS_CODE_MISMATCH 2
|
||||
|
||||
#define STATUS_CODE_START_PAGE_COUNT_S 8
|
||||
#define STATUS_CODE_START_PAGE_COUNT_M ((64 - 1) << STATUS_CODE_START_PAGE_COUNT_S)
|
||||
|
||||
#define STATUS_CODE_MISMATCH_PAGE_S 8
|
||||
#define STATUS_CODE_MISMATCH_BYTE_S 16
|
||||
#define STATUS_CODE_MISMATCH_VALUE_S 24
|
||||
|
||||
#define STATUS_CODE_MISMATCH_PAGE(X) ((X) << STATUS_CODE_MISMATCH_PAGE_S)
|
||||
#define STATUS_CODE_MISMATCH_BYTE(X) ((X) << STATUS_CODE_MISMATCH_BYTE_S)
|
||||
#define STATUS_CODE_MISMATCH_VALUE(X) ((X) << STATUS_CODE_MISMATCH_VALUE_S)
|
||||
|
||||
const int BUFFER_SIZE = 8 * 1024;
|
||||
extern uint8_t *BUFFER[];
|
||||
@ -14,8 +37,6 @@ extern uint32_t BUFFER_STATUS[];
|
||||
#define EEPROM_PAGE_WORDS 32
|
||||
#define EEPROM_PAGE_COUNT 64
|
||||
|
||||
register uint32_t max_address_reg asm("x31");
|
||||
|
||||
void SystemClock_Config(void);
|
||||
void EEPROM_Init(void);
|
||||
|
||||
@ -34,42 +55,49 @@ int main()
|
||||
.Instance = EEPROM_REGS,
|
||||
};
|
||||
|
||||
int result = STATUS_CODE(STATUS_CODE_OK);
|
||||
int max_address = ((*BUFFER_STATUS & STATUS_CODE_START_PAGE_COUNT_M) >>
|
||||
STATUS_CODE_START_PAGE_COUNT_S) *
|
||||
EEPROM_PAGE_WORDS * 4;
|
||||
|
||||
HAL_EEPROM_Erase(&heeprom, 0, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_ALL, EEPROM_OP_TIMEOUT);
|
||||
|
||||
int result = 0;
|
||||
for (int ad = 0; ad < max_address_reg; ad += (EEPROM_PAGE_WORDS * 4))
|
||||
for (int addr = 0; addr < max_address; addr += (EEPROM_PAGE_WORDS * 4))
|
||||
{
|
||||
#ifdef UART_DEBUG
|
||||
xprintf("Write Page 0x%04x from 0x%08x\n", ad, (uint8_t *)((uint32_t)BUFFER + ad));
|
||||
xprintf("Write Page 0x%04x from 0x%08x\n", addr, (uint8_t *)((uint32_t)BUFFER + addr));
|
||||
#endif
|
||||
|
||||
HAL_EEPROM_Write(
|
||||
&heeprom,
|
||||
ad,
|
||||
(uint32_t *)((uint32_t)BUFFER + ad),
|
||||
addr,
|
||||
(uint32_t *)((uint32_t)BUFFER + addr),
|
||||
EEPROM_PAGE_WORDS,
|
||||
HAL_EEPROM_WRITE_SINGLE,
|
||||
EEPROM_OP_TIMEOUT);
|
||||
|
||||
uint8_t rb[EEPROM_PAGE_WORDS * 4] = {0};
|
||||
|
||||
HAL_EEPROM_Read(&heeprom, ad, (uint32_t *)rb, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
|
||||
HAL_EEPROM_Read(&heeprom, addr, (uint32_t *)rb, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
|
||||
|
||||
for (uint32_t b = 0; b < (EEPROM_PAGE_WORDS * 4); b++)
|
||||
{
|
||||
uint8_t ebuf = *(uint8_t *)((uint32_t)BUFFER + ad + b);
|
||||
uint8_t ebuf = *(uint8_t *)((uint32_t)BUFFER + addr + b);
|
||||
if (ebuf != rb[b])
|
||||
{
|
||||
#ifdef UART_DEBUG
|
||||
xprintf("addr[0x%04x:0x%08x] buf:mem = 0x%02x != 0x%02x\n", (uint32_t)BUFFER + ad + b, 0x01000000 + ad + b, ebuf, rb[b]);
|
||||
xprintf("addr[0x%04x:0x%08x] buf:mem = 0x%02x != 0x%02x\n", (uint32_t)BUFFER + addr + b, 0x01000000 + addr + b, ebuf, rb[b]);
|
||||
#endif
|
||||
result = 2;
|
||||
goto error_exit;
|
||||
result = STATUS_CODE(STATUS_CODE_MISMATCH) |
|
||||
STATUS_CODE_MISMATCH_PAGE(addr >> 7) |
|
||||
STATUS_CODE_MISMATCH_BYTE(b) |
|
||||
STATUS_CODE_MISMATCH_VALUE(rb[b]);
|
||||
goto debugger_return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
error_exit:
|
||||
debugger_return:
|
||||
|
||||
*BUFFER_STATUS = result;
|
||||
// asm ("wfi");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user