diff --git a/src/dfuse.c b/src/dfuse.c index 1ee6575..77648c2 100644 --- a/src/dfuse.c +++ b/src/dfuse.c @@ -248,6 +248,9 @@ int dfuse_special_command(struct dfu_if *dif, unsigned int address, } milli_sleep(dst.bwPollTimeout); + if (command == SET_ADDRESS) + return ret; + ret = dfu_abort(dif->dev_handle, dif->interface); if (ret < 0) { errx(EX_IOERR, "Error sending dfu abort request"); @@ -401,11 +404,18 @@ int dfuse_dnload_element(struct dfu_if *dif, unsigned int dwElementAddress, dwElementAddress + dwElementSize - 1); } + for (p = 0; p < (int)dwElementSize;) { + unsigned int address = dwElementAddress + p; + segment = find_segment(mem_layout, address); + if ((segment->memtype & DFUSE_ERASABLE) && !dfuse_mass_erase) { + dfuse_special_command(dif, address, ERASE_PAGE); + } + p = p + segment->pagesize; + } + dfu_progress_bar("Download", 0, 1); for (p = 0; p < (int)dwElementSize; p += xfer_size) { - int page_size; - unsigned int erase_address; unsigned int address = dwElementAddress + p; int chunk_size = xfer_size; @@ -414,35 +424,11 @@ int dfuse_dnload_element(struct dfu_if *dif, unsigned int dwElementAddress, errx(EX_IOERR, "Page at 0x%08x is not writeable", address); } - page_size = segment->pagesize; /* check if this is the last chunk */ if (p + chunk_size > (int)dwElementSize) chunk_size = dwElementSize - p; - /* Erase only for flash memory downloads */ - if ((segment->memtype & DFUSE_ERASABLE) && !dfuse_mass_erase) { - /* erase all involved pages */ - for (erase_address = address; - erase_address < address + chunk_size; - erase_address += page_size) - if ((erase_address & ~(page_size - 1)) != - last_erased_page) - dfuse_special_command(dif, - erase_address, - ERASE_PAGE); - - if (((address + chunk_size - 1) & ~(page_size - 1)) != - last_erased_page) { - if (verbose > 2) - printf(" Chunk extends into next page," - " erase it as well\n"); - dfuse_special_command(dif, - address + chunk_size - 1, - ERASE_PAGE); - } - } - if (verbose) { printf(" Download from image offset " "%08x to memory %08x-%08x, size %i\n",