From 048e8447a58d996e7be32ddc17194c591c1dc176 Mon Sep 17 00:00:00 2001 From: Gareth McMullin Date: Fri, 13 Oct 2017 08:58:37 +1300 Subject: [PATCH] target: Only support buffered flash writes --- src/target/efm32.c | 4 +--- src/target/kinetis.c | 1 - src/target/lmi.c | 1 - src/target/lpc11xx.c | 3 +-- src/target/lpc15xx.c | 3 +-- src/target/lpc_common.c | 5 +---- src/target/nrf51.c | 5 ++--- src/target/sam3x.c | 9 ++------- src/target/sam4l.c | 8 +++----- src/target/samd.c | 5 +---- src/target/stm32f1.c | 1 - src/target/stm32f4.c | 1 - src/target/stm32l0.c | 5 +---- src/target/stm32l4.c | 4 +--- src/target/target.c | 26 +++++++++++++------------- src/target/target_internal.h | 10 +--------- 16 files changed, 28 insertions(+), 63 deletions(-) diff --git a/src/target/efm32.c b/src/target/efm32.c index 97dc2eb..a67abed 100644 --- a/src/target/efm32.c +++ b/src/target/efm32.c @@ -239,9 +239,7 @@ static void efm32_add_flash(target *t, target_addr addr, size_t length, f->length = length; f->blocksize = page_size; f->erase = efm32_flash_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = efm32_flash_write; + f->write = efm32_flash_write; f->buf_size = page_size; target_add_flash(t, f); } diff --git a/src/target/kinetis.c b/src/target/kinetis.c index b65366c..037adf3 100644 --- a/src/target/kinetis.c +++ b/src/target/kinetis.c @@ -94,7 +94,6 @@ static void kl_gen_add_flash(target *t, f->erase = kl_gen_flash_erase; f->write = kl_gen_flash_write; f->done = kl_gen_flash_done; - f->align = 4; f->erased = 0xff; target_add_flash(t, f); } diff --git a/src/target/lmi.c b/src/target/lmi.c index ed54d57..e0ecd68 100644 --- a/src/target/lmi.c +++ b/src/target/lmi.c @@ -65,7 +65,6 @@ static void lmi_add_flash(target *t, size_t length) f->blocksize = 0x400; f->erase = lmi_flash_erase; f->write = lmi_flash_write; - f->align = 4; f->erased = 0xff; target_add_flash(t, f); } diff --git a/src/target/lpc11xx.c b/src/target/lpc11xx.c index 248e7ee..eb9919b 100644 --- a/src/target/lpc11xx.c +++ b/src/target/lpc11xx.c @@ -40,7 +40,7 @@ void lpc11xx_add_flash(target *t, uint32_t addr, size_t len, size_t erasesize) struct lpc_flash *lf = lpc_add_flash(t, addr, len); lf->f.blocksize = erasesize; lf->f.buf_size = IAP_PGM_CHUNKSIZE; - lf->f.write_buf = lpc_flash_write_magic_vect; + lf->f.write = lpc_flash_write_magic_vect; lf->iap_entry = IAP_ENTRYPOINT; lf->iap_ram = IAP_RAM_BASE; lf->iap_msp = IAP_RAM_BASE + MIN_RAM_SIZE - RAM_USAGE_FOR_IAP_ROUTINES; @@ -122,4 +122,3 @@ lpc11xx_probe(target *t) return false; } - diff --git a/src/target/lpc15xx.c b/src/target/lpc15xx.c index 4e362e2..7b86d42 100644 --- a/src/target/lpc15xx.c +++ b/src/target/lpc15xx.c @@ -40,7 +40,7 @@ void lpc15xx_add_flash(target *t, uint32_t addr, size_t len, size_t erasesize) struct lpc_flash *lf = lpc_add_flash(t, addr, len); lf->f.blocksize = erasesize; lf->f.buf_size = IAP_PGM_CHUNKSIZE; - lf->f.write_buf = lpc_flash_write_magic_vect; + lf->f.write = lpc_flash_write_magic_vect; lf->iap_entry = IAP_ENTRYPOINT; lf->iap_ram = IAP_RAM_BASE; lf->iap_msp = IAP_RAM_BASE + MIN_RAM_SIZE - RAM_USAGE_FOR_IAP_ROUTINES; @@ -77,4 +77,3 @@ lpc15xx_probe(target *t) return false; } - diff --git a/src/target/lpc_common.c b/src/target/lpc_common.c index 63d844e..bdae7e1 100644 --- a/src/target/lpc_common.c +++ b/src/target/lpc_common.c @@ -40,9 +40,7 @@ struct lpc_flash *lpc_add_flash(target *t, target_addr addr, size_t length) f->start = addr; f->length = length; f->erase = lpc_flash_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = lpc_flash_write; + f->write = lpc_flash_write; f->erased = 0xff; target_add_flash(t, f); return lf; @@ -148,4 +146,3 @@ int lpc_flash_write_magic_vect(struct target_flash *f, } return lpc_flash_write(f, dest, src, len); } - diff --git a/src/target/nrf51.c b/src/target/nrf51.c index 91f1d43..4f2ab44 100644 --- a/src/target/nrf51.c +++ b/src/target/nrf51.c @@ -97,7 +97,6 @@ static void nrf51_add_flash(target *t, f->blocksize = erasesize; f->erase = nrf51_flash_erase; f->write = nrf51_flash_write; - f->align = 4; f->erased = 0xff; target_add_flash(t, f); } @@ -112,7 +111,7 @@ bool nrf51_probe(target *t) case 0x0020: /* nRF51822 (rev 1) CEAA BA */ case 0x0024: /* nRF51422 (rev 1) QFAA C0 */ case 0x002A: /* nRF51822 (rev 2) QFAA FA0 */ - case 0x004A: /* nRF51822 (rev 3) QFAA G1 */ + case 0x004A: /* nRF51822 (rev 3) QFAA G1 */ case 0x002D: /* nRF51422 (rev 2) QFAA DAA */ case 0x002E: /* nRF51422 (rev 2) QFAA E0 */ case 0x002F: /* nRF51822 (rev 1) CEAA B0 */ @@ -129,7 +128,7 @@ bool nrf51_probe(target *t) case 0x0079: /* nRF51822 (rev 3) CEAA E0 */ case 0x007A: /* nRF51422 (rev 3) CEAA C0 */ case 0x008F: /* nRF51822 (rev 3) QFAA H1 See https://devzone.nordicsemi.com/question/97769/can-someone-conform-the-config-id-code-for-the-nrf51822qfaah1/ */ - case 0x00D1: /* nRF51822 (rev 3) QFAA H2 */ + case 0x00D1: /* nRF51822 (rev 3) QFAA H2 */ t->driver = "Nordic nRF51"; target_add_ram(t, 0x20000000, 0x4000); nrf51_add_flash(t, 0x00000000, 0x40000, NRF51_PAGE_SIZE); diff --git a/src/target/sam3x.c b/src/target/sam3x.c index 0a96308..48403d6 100644 --- a/src/target/sam3x.c +++ b/src/target/sam3x.c @@ -131,9 +131,7 @@ static void sam3_add_flash(target *t, f->length = length; f->blocksize = SAM3_PAGE_SIZE; f->erase = sam3_flash_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = sam3x_flash_write; + f->write = sam3x_flash_write; f->buf_size = SAM3_PAGE_SIZE; sf->eefc_base = eefc_base; sf->write_cmd = EEFC_FCR_FCMD_EWP; @@ -149,9 +147,7 @@ static void sam4_add_flash(target *t, f->length = length; f->blocksize = SAM4_PAGE_SIZE * 8; f->erase = sam4_flash_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = sam3x_flash_write; + f->write = sam3x_flash_write; f->buf_size = SAM4_PAGE_SIZE; sf->eefc_base = eefc_base; sf->write_cmd = EEFC_FCR_FCMD_WP; @@ -355,4 +351,3 @@ static bool sam3x_cmd_gpnvm_set(target *t, int argc, char *argv[]) return true; } - diff --git a/src/target/sam4l.c b/src/target/sam4l.c index cdb9072..54bcc52 100644 --- a/src/target/sam4l.c +++ b/src/target/sam4l.c @@ -173,9 +173,7 @@ static void sam4l_add_flash(target *t, uint32_t addr, size_t length) f->length = length; f->blocksize = SAM4L_PAGE_SIZE; f->erase = sam4l_flash_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = sam4l_flash_write_buf; + f->write = sam4l_flash_write_buf; f->buf_size = SAM4L_PAGE_SIZE; f->erased = 0xff; /* add it into the target structures flash chain */ @@ -238,7 +236,7 @@ bool sam4l_probe(target *t) DEBUG("\nSAM4L: RAM = 0x%x (%dK), FLASH = 0x%x (%dK)\n", (unsigned int) ram_size, (unsigned int) (ram_size / 1024), (unsigned int) flash_size, (unsigned int)(flash_size / 1024)); - + /* enable SMAP if not, check for HCR and reset if set */ sam4l_extended_reset(t); DEBUG("\nSAM4L: SAM4L Selected.\n"); @@ -331,7 +329,7 @@ sam4l_flash_write_buf(struct target_flash *f, target_addr addr, const void *src, uint32_t *src_data = (uint32_t *)src; uint32_t ndx; uint16_t page; - + DEBUG("\nSAM4L: sam4l_flash_write_buf: addr = 0x%08lx, len %d\n", (long unsigned int) addr, (int) len); /* This will fail with unaligned writes, the write_buf version */ page = addr / SAM4L_PAGE_SIZE; diff --git a/src/target/samd.c b/src/target/samd.c index 7861873..bc143b4 100644 --- a/src/target/samd.c +++ b/src/target/samd.c @@ -350,9 +350,7 @@ static void samd_add_flash(target *t, uint32_t addr, size_t length) f->length = length; f->blocksize = SAMD_ROW_SIZE; f->erase = samd_flash_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = samd_flash_write; + f->write = samd_flash_write; f->buf_size = SAMD_PAGE_SIZE; target_add_flash(t, f); } @@ -698,4 +696,3 @@ static bool samd_cmd_ssb(target *t) return true; } - diff --git a/src/target/stm32f1.c b/src/target/stm32f1.c index c9823db..688ce3e 100644 --- a/src/target/stm32f1.c +++ b/src/target/stm32f1.c @@ -109,7 +109,6 @@ static void stm32f1_add_flash(target *t, f->blocksize = erasesize; f->erase = stm32f1_flash_erase; f->write = stm32f1_flash_write; - f->align = 2; f->erased = 0xff; target_add_flash(t, f); } diff --git a/src/target/stm32f4.c b/src/target/stm32f4.c index c6a9a5f..ec5cdc7 100644 --- a/src/target/stm32f4.c +++ b/src/target/stm32f4.c @@ -161,7 +161,6 @@ static void stm32f4_add_flash(target *t, f->blocksize = blocksize; f->erase = stm32f4_flash_erase; f->write = stm32f4_flash_write; - f->align = 4; f->erased = 0xff; sf->base_sector = base_sector; sf->psize = 32; diff --git a/src/target/stm32l0.c b/src/target/stm32l0.c index ea22cb9..14e42d6 100644 --- a/src/target/stm32l0.c +++ b/src/target/stm32l0.c @@ -237,9 +237,7 @@ static void stm32l_add_flash(target *t, f->length = length; f->blocksize = erasesize; f->erase = stm32lx_nvm_prog_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = stm32lx_nvm_prog_write; + f->write = stm32lx_nvm_prog_write; f->buf_size = erasesize/2; target_add_flash(t, f); } @@ -252,7 +250,6 @@ static void stm32l_add_eeprom(target *t, uint32_t addr, size_t length) f->blocksize = 4; f->erase = stm32lx_nvm_data_erase; f->write = stm32lx_nvm_data_write; - f->align = 1; target_add_flash(t, f); } diff --git a/src/target/stm32l4.c b/src/target/stm32l4.c index c5432b4..54d0e54 100644 --- a/src/target/stm32l4.c +++ b/src/target/stm32l4.c @@ -135,9 +135,7 @@ static void stm32l4_add_flash(target *t, f->length = length; f->blocksize = blocksize; f->erase = stm32l4_flash_erase; - f->write = target_flash_write_buffered; - f->done = target_flash_done_buffered; - f->write_buf = stm32l4_flash_write; + f->write = stm32l4_flash_write; f->buf_size = 2048; f->erased = 0xff; sf->bank1_start = bank1_start; diff --git a/src/target/target.c b/src/target/target.c index e433bdb..7ad5716 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -26,6 +26,10 @@ target *target_list = NULL; +static int target_flash_write_buffered(struct target_flash *f, + target_addr dest, const void *src, size_t len); +static int target_flash_done_buffered(struct target_flash *f); + target *target_new(void) { target *t = (void*)calloc(1, sizeof(*t)); @@ -138,6 +142,8 @@ void target_add_ram(target *t, target_addr start, uint32_t len) void target_add_flash(target *t, struct target_flash *f) { + if (f->buf_size == 0) + f->buf_size = MIN(f->blocksize, 0x400); f->t = t; f->next = t->flash; t->flash = f; @@ -216,15 +222,7 @@ int target_flash_write(target *t, struct target_flash *f = flash_for_addr(t, dest); size_t tmptarget = MIN(dest + len, f->start + f->length); size_t tmplen = tmptarget - dest; - if (f->align > 1) { - uint32_t offset = dest % f->align; - uint8_t data[ALIGN(offset + tmplen, f->align)]; - memset(data, f->erased, sizeof(data)); - memcpy((uint8_t *)data + offset, src, tmplen); - ret |= f->write(f, dest - offset, data, sizeof(data)); - } else { - ret |= f->write(f, dest, src, tmplen); - } + ret |= target_flash_write_buffered(f, dest, src, tmplen); dest += tmplen; src += tmplen; len -= tmplen; @@ -235,6 +233,9 @@ int target_flash_write(target *t, int target_flash_done(target *t) { for (struct target_flash *f = t->flash; f; f = f->next) { + int tmp = target_flash_done_buffered(f); + if (tmp) + return tmp; if (f->done) { int tmp = f->done(f); if (tmp) @@ -260,8 +261,8 @@ int target_flash_write_buffered(struct target_flash *f, if (base != f->buf_addr) { if (f->buf_addr != (uint32_t)-1) { /* Write sector to flash if valid */ - ret |= f->write_buf(f, f->buf_addr, - f->buf, f->buf_size); + ret |= f->write(f, f->buf_addr, + f->buf, f->buf_size); } /* Setup buffer for a new sector */ f->buf_addr = base; @@ -282,7 +283,7 @@ int target_flash_done_buffered(struct target_flash *f) int ret = 0; if ((f->buf != NULL) &&(f->buf_addr != (uint32_t)-1)) { /* Write sector to flash if valid */ - ret = f->write_buf(f, f->buf_addr, f->buf, f->buf_size); + ret = f->write(f, f->buf_addr, f->buf, f->buf_size); f->buf_addr = -1; free(f->buf); f->buf = NULL; @@ -564,4 +565,3 @@ int tc_system(target *t, target_addr cmd, size_t cmdlen) } return t->tc->system(t->tc, cmd, cmdlen); } - diff --git a/src/target/target_internal.h b/src/target/target_internal.h index 33f1663..0ef0236 100644 --- a/src/target/target_internal.h +++ b/src/target/target_internal.h @@ -43,13 +43,9 @@ struct target_flash { flash_write_func write; flash_done_func done; target *t; - struct target_flash *next; - int align; uint8_t erased; - - /* For buffered flash */ size_t buf_size; - flash_write_func write_buf; + struct target_flash *next; target_addr buf_addr; void *buf; }; @@ -131,9 +127,6 @@ struct target_s { void target_add_commands(target *t, const struct command_s *cmds, const char *name); void target_add_ram(target *t, target_addr start, uint32_t len); void target_add_flash(target *t, struct target_flash *f); -int target_flash_write_buffered(struct target_flash *f, - target_addr dest, const void *src, size_t len); -int target_flash_done_buffered(struct target_flash *f); /* Convenience function for MMIO access */ uint32_t target_mem_read32(target *t, uint32_t addr); @@ -184,4 +177,3 @@ bool kinetis_probe(target *t); bool efm32_probe(target *t); #endif -