From 60bd03a5178e338b04703783a686d9c73633ba63 Mon Sep 17 00:00:00 2001 From: George Talusan Date: Sat, 27 Feb 2016 11:41:39 -0500 Subject: [PATCH] be quicker about determining erased byte pattern when flashing --- gdbserver/gdb-server.c | 2 +- src/stlink-common.c | 18 ++++++++++-------- src/stlink-common.h | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/gdbserver/gdb-server.c b/gdbserver/gdb-server.c index 0c31cff..ef289f2 100644 --- a/gdbserver/gdb-server.c +++ b/gdbserver/gdb-server.c @@ -752,7 +752,7 @@ static int flash_go(stlink_t *sl) { DLOG("flash_do: page %08x\n", page); unsigned send = length > FLASH_PAGE ? FLASH_PAGE : length; if(stlink_write_flash(sl, page, fb->data + (page - fb->addr), - send) < 0) + send, 0) < 0) goto error; length -= send; diff --git a/src/stlink-common.c b/src/stlink-common.c index 90d71f3..917a1e0 100644 --- a/src/stlink-common.c +++ b/src/stlink-common.c @@ -1723,7 +1723,7 @@ int stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uin return 0; } -int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len) { +int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len, uint8_t eraseonly) { size_t off; flash_loader_t fl; ILOG("Attempting to write %d (%#x) bytes to stm32 address: %u (%#x)\n", @@ -1769,6 +1769,9 @@ int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t ILOG("Finished erasing %d pages of %d (%#x) bytes\n", page_count, sl->flash_pgsz, sl->flash_pgsz); + if (eraseonly) + return 0; + if ((sl->chip_id == STM32_CHIPID_F2) || (sl->chip_id == STM32_CHIPID_F4) || (sl->chip_id == STM32_CHIPID_F4_DE) || @@ -1972,19 +1975,18 @@ int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) { ELOG("map_file() == -1\n"); return -1; } - for(index = 0; index < mf.len; index ++) { - if (mf.base[index] == erased_pattern) - num_empty ++; - else - num_empty = 0; + for(index = mf.len - 1; num_empty < mf.len; index --) { + if (mf.base[index] != erased_pattern) { + break; + } + num_empty ++; } /* Round down to words */ num_empty -= (num_empty & 3); if(num_empty != 0) { ILOG("Ignoring %d bytes of 0x%02x at end of file\n", num_empty, erased_pattern); - mf.len -= num_empty; } - err = stlink_write_flash(sl, addr, mf.base, mf.len); + err = stlink_write_flash(sl, addr, mf.base, num_empty == mf.len? mf.len : mf.len - num_empty, num_empty == mf.len); /* set stack*/ stlink_write_reg(sl, stlink_read_debug32(sl, addr ),13); /* Set PC to the reset routine*/ diff --git a/src/stlink-common.h b/src/stlink-common.h index a0bd649..2751ac8 100644 --- a/src/stlink-common.h +++ b/src/stlink-common.h @@ -655,7 +655,7 @@ extern "C" { // unprocessed int stlink_erase_flash_mass(stlink_t* sl); - int stlink_write_flash(stlink_t* sl, stm32_addr_t address, uint8_t* data, uint32_t length); + int stlink_write_flash(stlink_t* sl, stm32_addr_t address, uint8_t* data, uint32_t length, uint8_t eraseonly); int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr); int stlink_fwrite_sram(stlink_t *sl, const char* path, stm32_addr_t addr); int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, uint32_t length); -- 2.47.2