Skip to content

Commit

Permalink
Merge pull request #377 from gtalusan/master
Browse files Browse the repository at this point in the history
be quicker about determining erased byte pattern when flashing
  • Loading branch information
texane committed Feb 27, 2016
2 parents ccb1fd0 + 60bd03a commit 44375c9
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 10 deletions.
2 changes: 1 addition & 1 deletion gdbserver/gdb-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
18 changes: 10 additions & 8 deletions src/stlink-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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) ||
Expand Down Expand Up @@ -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*/
Expand Down
2 changes: 1 addition & 1 deletion src/stlink-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 44375c9

Please sign in to comment.