Добавлена обработка ошибки при проверке

This commit is contained in:
sh-sergey 2024-11-02 17:13:52 +03:00
parent e66c5b0f03
commit c821a3c5fd
6 changed files with 167 additions and 111 deletions

View File

@ -1 +1 @@
applicaton_version = 'v0.2.1' applicaton_version = 'v0.3.0-alpha1'

View File

@ -41,7 +41,8 @@ def eeprom_execute_operation(openocd: OpenOcdTclRpc, op: EEPROM_Operation, affec
# start operation # start operation
openocd.write_word(mem_map.EEPROM_REGS_EECON, ( openocd.write_word(mem_map.EEPROM_REGS_EECON, (
(1 << eeprom_fields.EECON_EX_S) | (1 << eeprom_fields.EECON_BWE_S) | (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)}') 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] = [] bytes_list: List[int] = []
found_pages = 0 found_pages = 0
for page in range(64): for page in range(64):
@ -284,16 +288,25 @@ def collapse_pages(pages: Dict[int, List[int]]) -> List[int]:
def write_memory(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc) -> int: def write_memory(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc) -> int:
result = 0 """
Записать всю память с использованием драйвера.
bytes_list = collapse_pages(pages) pages: Dict[int, List[int]] -- страница - список байт, ключ - адрес в EEPROM
max_address = len(bytes_list) - 1 """
# TODO: добавить проверку на версию mik32 - текущий драйвер поддерживает
# только версию mik32v2
bytes_list = combine_pages(pages)
openocd.halt() 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]) pathname = os.path.dirname(sys.argv[0])
openocd.run("wp 0x2003800 4 w") openocd.run("wp 0x2003800 4 w") # готовимся поймать результат записи
print("Uploading driver...", flush=True) 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(os.path.join(pathname, "firmware.hex")))
@ -307,11 +320,24 @@ def write_memory(pages: Dict[int, List[int]], openocd: OpenOcdTclRpc) -> int:
print("Uploading data complete! Run driver...", flush=True) print("Uploading data complete! Run driver...", flush=True)
openocd.resume(0x2000000) openocd.resume(0x2000000)
wait_halted(openocd, 10) wait_halted(openocd, 10) # ждем, когда watchpoint сработает
openocd.run("rwp 0x02003800") openocd.run("rwp 0x02003800") # watchpoint ловит до изменения слова
openocd.run("step") openocd.run("step") # делаем шаг чтобы слово изменилось
print(f"Check page result {openocd.read_memory(0x2003800, 32, 1)}")
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 return 0

View File

@ -434,6 +434,7 @@ if __name__ == '__main__':
namespace = parser.parse_args() namespace = parser.parse_args()
print(program_name) print(program_name)
print(os.path.dirname(os.path.realpath(__file__)))
if namespace.filepath: if namespace.filepath:
upload_file( upload_file(

View File

@ -1,13 +1,13 @@
:020000040200F8 :020000040200F8
:10000000FD62938202400100FD12E39E02FE374131 :10000000FD62938202400100FD12E39E02FE374131
:10001000000213010100B70100029381016AB705D4 :10001000000213010100B70100029381016CB705D2
:1000200000029385056A370600021306066AB706C2 :1000200000029385056C370600021306066CB706BE
:1000300000029386066A39A083A2050023A0560019 :1000300000029386066C39A083A2050023A0560017
:1000400091059106E3EAC5FEB70500029385056AAE :1000400091059106E3EAC5FEB70500029385056CAC
:10005000370600021306066AB70600029386066A90 :10005000370600021306066CB70600029386066C8C
:1000600039A083A2050023A0560091059106E3EA7A :1000600039A083A2050023A0560091059106E3EA7A
:10007000C5FEB70500029385056A37060002130620 :10007000C5FEB70500029385056C3706000213061E
:10008000066A21A023A005009105E3EDC5FEB70097 :10008000066C21A023A005009105E3EDC5FEB70095
:100090000002E780C00AB7000002E780C00AB7008C :100090000002E780C00AB7000002E780C00AB7008C
:1000A0000002E780E02273005010F5BF828000005C :1000A0000002E780E02273005010F5BF828000005C
:1000B0000000000000000000000000000000000040 :1000B0000000000000000000000000000000000040
@ -33,77 +33,79 @@
:1001F000C1171D8F3E96E374C3F8A5B75D71130652 :1001F000C1171D8F3E96E374C3F8A5B75D71130652
:1002000080028145280886C6B137BD47230CF1001E :1002000080028145280886C6B137BD47230CF1001E
:100210008947230EF1003ED2E177938707082C0827 :100210008947230EF1003ED2E177938707082C0827
:100220000A85231AF1026526B64061618280317128 :100220000A85231AF102F926B64061618280317194
:1002300006DF22DD26DB4AD952D54ED7C1376146CB :1002300006DF22DD26DB4AD94ED752D55AD156D316
:1002400081452800013FB707070061679387074092 :10024000753F6146814528003137B707070093871E
:100250001307076A8D4613060002814548003724BC :100250000740B74900023EC2938709808443616723
:10026000000261693EC2130404809D288144130981 :100260001307076AA18093F4F4038D461306000276
:10027000096A130A000863E4F4018147A9A093996D :100270008145480037290002616A9E0469201309FC
:10028000040193D90901CA87014793060002228617 :100280000980014493890980130A0A6A130B000844
:10029000CE8548007D2013060008814508105D3D8D :10029000634494008147A9A8931A040193DA0A01E0
:1002A0004A87930600021010CE854800192A01479C :1002A000D2870147930600024A86D68548006D280A
:1002B0001410B3078700BA9683C6060083C70700E9 :1002B0001306000881450810713D5287930600021D
:1002C0006388F6008947374700022320F78001A0A2 :1002C0001010D68548000D2201471C10BA9783C62E
:1002D0000507E31F47FD938404081304040861BF66 :1002D0000700B307270183C70700638ED700935732
:1002E0001C418E0603A88700B3E6060193E60608C4 :1002E0007440A207E206D58F4207D98F93E7270013
:1002F00094C7144999CA814663DDC600CCC323A0C4 :1002F00023A0F90001A00507E31967FD1304040812
:1003000007003A850DE50D458280CCC3814663CC5C :100300001309090871B71C418E0603A88700B3E6DC
:10031000C600944793E6360094C775D7C8477D1743 :10031000060193E6060894C7144999CA814663DD2D
:10032000058965FD828023A007008506CDB703A857 :10032000C600CCC323A007003A850DE50D458280A9
:10033000C7007D1513781800E31608FC85069105A3 :10033000CCC3814663CCC600944793E6360094C78D
:1003400065BF032805000E0783288800336717015F :1003400075D7C8477D17058965FD828023A0070002
:10035000136707082324E800184905C301476353BE :100350008506CDB703A8C7007D1513781800E316EE
:10036000D702131527002322B80032950841232015 :1003600008FC8506910565BF032805000E07832854
:10037000A8003E850DED0D4582802322B80001477F :10037000880033671701136707082324E80018492A
:10038000634FD70003278800136757002324E80032 :1003800005C301476353D702131527002322B80082
:10039000FDD30325C800FD1705897DF982809315DB :10039000329508412320A8003E850DED0D45828051
:1003A0002700B2958C4105072320B800D1BF8328D0 :1003A0002322B8000147634FD70003278800136753
:1003B000C8007D1593F81800E39E08FA050791051B :1003B00057002324E800FDD30325C800FD17058955
:1003C00079BF1C4989CF814763FFD7000328050007 :1003C0007DF9828093152700B2958C410507232083
:1003D000BA882322B800639108020D458280084143 :1003D000B800D1BF8328C8007D1593F81800E39EAC
:1003E0004CC163E4D700014582800C41139727007C :1003E00008FA0507910579BF1C4989CF814763FF4A
:1003F00032970CC38507F5B70323C800FD181373A4 :1003F000D70003280500BA882322B80063910802B9
:100400001300E31A03FC832808001398270032988E :100400000D45828008414CC163E4D70001458280DC
:10041000232018018507910545BF0547AA87630575 :100410000C411397270032970CC38507F5B70323C8
:10042000E50209476300E506054591EBB7060600BE :10042000C800FD1813731300E31A03FC83280800A7
:10043000DC4A7D771307F73FF98FDCCA01458280DC :10043000139827003298232018018507910545BF9E
:100440007D1719EB0D4582809306004037A7070002 :100440000547AA876305E50209476300E5060545F8
:1004500013070712B7050500905D7D8E75D237062C :1004500091EBB7060600DC4A7D771307F73FF98F6B
:1004600006005C4A7D771307F73FF98FD58F41115E :10046000DCCA014582807D1719EB0D458280930619
:100470005CCA02C613073006B2476359F70001454C :10047000004037A7070013070712B7050500905D76
:1004800041018280856693860680C9B7B247850799 :100480007D8E75D2370606005C4A7D771307F73FED
:100490003EC6DDB791476307F50263EAA7008547CB :10049000F98FD58F41115CCA02C613073006B247E7
:1004A000630AF50489476309F50405458280A1477D :1004A0006359F70001454101828085669386068085
:1004B000E31DF5FE0947094501A8FD1781EFC8D2E4 :1004B000C9B7B24785073EC6DDB791476307F50266
:1004C0000D45828005470D45B7A7070093870712A2 :1004C00063EAA7008547630AF50489476309F504D1
:1004D000B7060500905E798E6DD28A05C98D4111EF :1004D00005458280A147E31DF5FE0947094501A8AE
:1004E000CCD202C613073006B247635AF700014563 :1004E000FD1781EFC8D20D45828005470D45B7A79E
:1004F000410182801147C9BF21470145F1B7B24789 :1004F000070093870712B7060500905E798E6DD2CC
:1005000085073EC6D5B70547AA876305E5020947B3 :100500008A05C98D4111CCD202C613073006B24705
:100510006302E506054591EBB70606009C4A7D7728 :10051000635AF7000145410182801147C9BF214755
:100520001307F73FF98F9CCA014582807D1719EBAD :100520000145F1B7B24785073EC6D5B70547AA874B
:100530000D4582809306004037A707001307071276 :100530006305E50209476302E506054591EBB70649
:10054000B7050500905D7D8E75D2370706001C4B00 :1005400006009C4A7D771307F73FF98F9CCA014547
:100550007D761306F63FF18FD58F1CCB85471CCFD8 :1005500082807D1719EB0D4582809306004037A7F6
:10056000411102C613073006B2476359F70001452F :10056000070013070712B7050500905D7D8E75D251
:10057000410182808566938606807DBFB2478507EC :10057000370706001C4B7D761306F63FF18FD58FAB
:100580003EC6DDB711C98547630DF502054582807A :100580001CCB85471CCF411102C613073006B2476A
:10059000FD1791EB0D4582800946B7A707009387A9 :100590006359F70001454101828085669386068094
:1005A0000712B7060500985E718F7DD34111C8D63A :1005A0007DBFB24785073EC6DDB711C98547630DDC
:1005B00002C613073006B2476357F70001454101F1 :1005B000F50205458280FD1791EB0D4582800946C5
:1005C00082800546D9BFB24785073EC6EDB7011107 :1005C000B7A7070093870712B7060500985E718FDB
:1005D00026CAB7040600DC4806CE22CC4AC84EC65E :1005D0007DD34111C8D602C613073006B247635710
:1005E00052C456C2F19BDCC89C482A89C845F19B7D :1005E000F7000145410182800546D9BFB247850722
:1005F0009CC883C7C5012E848A07DCC883C7D50180 :1005F0003EC6EDB7011126CAB7040600DC4806CE98
:100600008A079CC8193D0C44AA8A03454400593501 :1006000022CC4AC84EC652C456C2F19BDCC89C4894
:100610001848B70705002A8A98C358480850D8C315 :100610002A89C845F19B9CC883C7C5012E848A07D7
:10062000184C98C7CD35AA894850A93F8347040084 :10062000DCC883C7D5018A079CC8193D0C44AA8A37
:100630002A8793F6170089E6D44893E62600D4C8A3 :100630000345440059351848B70705002A8A98C36E
:1006400093F6270099E637060600544A93E616000B :1006400058480850D8C3184C98C7CD35AA89485087
:1006500054CA93F6470099E637060600144A93E613 :10065000A93F834704002A8793F6170089E6D44808
:10066000260014CAA18B99E7B70606009C4A93E7B7 :1006600093E62600D4C893F6270099E637060600DD
:1006700017009CCAF24062442320590123224901F9 :10067000544A93E6160054CA93F6470099E63706A3
:10068000232439012326E900D244B249224A924A5E :100680000600144A93E6260014CAA18B99E7B70620
:100690004A85424905618280000000000000000098 :1006900006009C4A93E717009CCAF240624423205C
:1006A000590123224901232439012326E900D24498
:1006B000B249224A924A4A85424905618280000035
:0400000502000000F5 :0400000502000000F5
:00000001FF :00000001FF

View File

@ -13,4 +13,3 @@ platform = MIK32
board = mik32v2 board = mik32v2
framework = framework-mik32v2-sdk framework = framework-mik32v2-sdk
board_debug.ldscript = ram board_debug.ldscript = ram
build_flags = -ffixed-x31 -D MIK32V2

View File

@ -4,6 +4,29 @@
#include "uart_lib.h" #include "uart_lib.h"
#include "xprintf.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; const int BUFFER_SIZE = 8 * 1024;
extern uint8_t *BUFFER[]; extern uint8_t *BUFFER[];
@ -14,8 +37,6 @@ extern uint32_t BUFFER_STATUS[];
#define EEPROM_PAGE_WORDS 32 #define EEPROM_PAGE_WORDS 32
#define EEPROM_PAGE_COUNT 64 #define EEPROM_PAGE_COUNT 64
register uint32_t max_address_reg asm("x31");
void SystemClock_Config(void); void SystemClock_Config(void);
void EEPROM_Init(void); void EEPROM_Init(void);
@ -34,42 +55,49 @@ int main()
.Instance = EEPROM_REGS, .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); HAL_EEPROM_Erase(&heeprom, 0, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_ALL, EEPROM_OP_TIMEOUT);
int result = 0; for (int addr = 0; addr < max_address; addr += (EEPROM_PAGE_WORDS * 4))
for (int ad = 0; ad < max_address_reg; ad += (EEPROM_PAGE_WORDS * 4))
{ {
#ifdef UART_DEBUG #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 #endif
HAL_EEPROM_Write( HAL_EEPROM_Write(
&heeprom, &heeprom,
ad, addr,
(uint32_t *)((uint32_t)BUFFER + ad), (uint32_t *)((uint32_t)BUFFER + addr),
EEPROM_PAGE_WORDS, EEPROM_PAGE_WORDS,
HAL_EEPROM_WRITE_SINGLE, HAL_EEPROM_WRITE_SINGLE,
EEPROM_OP_TIMEOUT); EEPROM_OP_TIMEOUT);
uint8_t rb[EEPROM_PAGE_WORDS * 4] = {0}; 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++) 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]) if (ebuf != rb[b])
{ {
#ifdef UART_DEBUG #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 #endif
result = 2; result = STATUS_CODE(STATUS_CODE_MISMATCH) |
goto error_exit; 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; *BUFFER_STATUS = result;
// asm ("wfi"); // asm ("wfi");