From c821a3c5fd9ccb2ed12abe83eea3e152a047d218 Mon Sep 17 00:00:00 2001 From: sh-sergey Date: Sat, 2 Nov 2024 17:13:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _version.py | 2 +- mik32_debug_hal/eeprom.py | 60 +++++-- mik32_upload.py | 1 + .../.pio/build/mik32v2/firmware.hex | 160 +++++++++--------- upload_drivers/jtag_eeprom/platformio.ini | 1 - upload_drivers/jtag_eeprom/src/main.c | 54 ++++-- 6 files changed, 167 insertions(+), 111 deletions(-) diff --git a/_version.py b/_version.py index 5c0ccce..7c2f766 100644 --- a/_version.py +++ b/_version.py @@ -1 +1 @@ -applicaton_version = 'v0.2.1' +applicaton_version = 'v0.3.0-alpha1' diff --git a/mik32_debug_hal/eeprom.py b/mik32_debug_hal/eeprom.py index 53eaf1e..d480ab9 100644 --- a/mik32_debug_hal/eeprom.py +++ b/mik32_debug_hal/eeprom.py @@ -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") # делаем шаг чтобы слово изменилось - if result == 0: - print(f"{datetime.datetime.now().time()} EEPROM recording has been completed", flush=True) + 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 + return 0 diff --git a/mik32_upload.py b/mik32_upload.py index c5f2a1b..a130ff9 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -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( diff --git a/upload_drivers/jtag_eeprom/.pio/build/mik32v2/firmware.hex b/upload_drivers/jtag_eeprom/.pio/build/mik32v2/firmware.hex index 9f62f3a..d290042 100644 --- a/upload_drivers/jtag_eeprom/.pio/build/mik32v2/firmware.hex +++ b/upload_drivers/jtag_eeprom/.pio/build/mik32v2/firmware.hex @@ -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 diff --git a/upload_drivers/jtag_eeprom/platformio.ini b/upload_drivers/jtag_eeprom/platformio.ini index a8a79a9..c7b09a0 100644 --- a/upload_drivers/jtag_eeprom/platformio.ini +++ b/upload_drivers/jtag_eeprom/platformio.ini @@ -13,4 +13,3 @@ platform = MIK32 board = mik32v2 framework = framework-mik32v2-sdk board_debug.ldscript = ram -build_flags = -ffixed-x31 -D MIK32V2 diff --git a/upload_drivers/jtag_eeprom/src/main.c b/upload_drivers/jtag_eeprom/src/main.c index f142b89..e011359 100644 --- a/upload_drivers/jtag_eeprom/src/main.c +++ b/upload_drivers/jtag_eeprom/src/main.c @@ -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");