diff --git a/flashloaders/stm32l0x.s b/flashloaders/stm32l0x.s index 9fc44468f..6c863c64a 100644 --- a/flashloaders/stm32l0x.s +++ b/flashloaders/stm32l0x.s @@ -34,8 +34,8 @@ .global write /* - r0 - destination address - r1 - source address + r0 - source address + r1 - destination address r2 - count */ @@ -46,9 +46,9 @@ write_word: // Load one word from address in r0, increment by 4 - ldr r4, [r1] + ldr r4, [r0] // Store the word to address in r1, increment by 4 - str r4, [r0] + str r4, [r1] // Increment r3 adds r3, #1 adds r1, #4 diff --git a/flashloaders/stm32lx.s b/flashloaders/stm32lx.s index 799d1345c..764594d9c 100644 --- a/flashloaders/stm32lx.s +++ b/flashloaders/stm32lx.s @@ -34,8 +34,8 @@ .global write /* - r0 - destination address - r1 - source address + r0 - source address + r1 - destination address r2 - count */ @@ -46,9 +46,9 @@ write_word: // Load one word from address in r0, increment by 4 - ldr.w ip, [r1], #4 + ldr.w ip, [r0], #4 // Store the word to address in r1, increment by 4 - str.w ip, [r0], #4 + str.w ip, [r1], #4 // Increment r3 adds r3, #1 diff --git a/src/stlink-common.c b/src/stlink-common.c index 5fbf57542..01ce06c6f 100644 --- a/src/stlink-common.c +++ b/src/stlink-common.c @@ -1501,8 +1501,8 @@ int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) { static const uint8_t loader_code_stm32l[] = { /* openocd.git/contrib/loaders/flash/stm32lx.S - r0, input, dest addr - r1, input, source addr + r0, input, source addr + r1, input, dest addr r2, input, word count r3, output, word count */ @@ -1510,8 +1510,8 @@ int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) { 0x00, 0x23, 0x04, 0xe0, - 0x51, 0xf8, 0x04, 0xcb, - 0x40, 0xf8, 0x04, 0xcb, + 0x50, 0xf8, 0x04, 0xcb, + 0x41, 0xf8, 0x04, 0xcb, 0x01, 0x33, 0x93, 0x42, @@ -1522,8 +1522,8 @@ int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) { static const uint8_t loader_code_stm32l0[] = { /* - r0, input, dest addr - r1, input, source addr + r0, input, source addr + r1, input, dest addr r2, input, word count r3, output, word count */ @@ -1531,8 +1531,8 @@ int write_loader_to_sram(stlink_t *sl, stm32_addr_t* addr, size_t* size) { 0x00, 0x23, 0x04, 0xe0, - 0x0c, 0x68, - 0x04, 0x60, + 0x04, 0x68, + 0x0c, 0x60, 0x01, 0x33, 0x04, 0x31, 0x04, 0x30, @@ -2064,7 +2064,7 @@ int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) { int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, const uint8_t* buf, size_t size) { reg rr; - int target_reg, source_reg, i = 0; + int i = 0; size_t count; DLOG("Running flash loader, write address:%#x, size: %zd\n", target, size); @@ -2075,19 +2075,13 @@ int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, cons return -1; } - if (sl->flash_type == FLASH_TYPE_L0) { - count = size / sizeof(uint32_t); - if (size % sizeof(uint32_t)) - ++count; - target_reg = 0; - source_reg = 1; - } else if (sl->flash_type == FLASH_TYPE_F0) { + if (sl->flash_type == FLASH_TYPE_F0) { count = size / sizeof(uint16_t); if (size % sizeof(uint16_t)) ++count; - target_reg = 1; - source_reg = 0; - } else if (sl->flash_type == FLASH_TYPE_F4 || sl->flash_type == FLASH_TYPE_L4) { + } else if (sl->flash_type == FLASH_TYPE_F4 || + sl->flash_type == FLASH_TYPE_L4 || + sl->flash_type == FLASH_TYPE_L0) { count = size / sizeof(uint32_t); if (size % sizeof(uint32_t)) ++count; @@ -2095,16 +2089,14 @@ int run_flash_loader(stlink_t *sl, flash_loader_t* fl, stm32_addr_t target, cons if (count % 2) ++count; } - target_reg = 1; - source_reg = 0; } else { fprintf(stderr, "unknown coreid 0x%x, don't know what flash loader to use\n", sl->core_id); return -1; } /* setup core */ - stlink_write_reg(sl, fl->buf_addr, source_reg); /* source */ - stlink_write_reg(sl, target, target_reg); /* target */ + stlink_write_reg(sl, fl->buf_addr, 0); /* source */ + stlink_write_reg(sl, target, 1); /* target */ stlink_write_reg(sl, count, 2); /* count */ stlink_write_reg(sl, 0, 3); /* flash bank 0 (input), only used on F0, but armless fopr others */ stlink_write_reg(sl, fl->loader_addr, 15); /* pc register */