From f027e70cdfd112787f9c860711bcc2abe218e74f Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Thu, 18 Apr 2024 15:07:31 +0100 Subject: [PATCH] Rework butterfly_paged_load() - Return correct value (number of bytes loaded) - Do not use m->desc for memory type: use mem_is_...(m) --- src/butterfly.c | 47 +++++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/src/butterfly.c b/src/butterfly.c index 8084b5d5..2662232a 100644 --- a/src/butterfly.c +++ b/src/butterfly.c @@ -636,43 +636,38 @@ static int butterfly_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const A unsigned int addr, unsigned int n_bytes) { unsigned int max_addr = addr + n_bytes; - int rd_size = 2; int blocksize = PDATA(pgm)->buffersize; - int use_ext_addr = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL; + int ext_addr = m->op[AVR_OP_LOAD_EXT_ADDR] != NULL; + int isee = mem_is_eeprom(m); - /* check parameter syntax: only "flash", "eeprom" or "usersig"/"userrow" is allowed */ - if (!mem_is_flash(m) && !mem_is_eeprom(m) && !mem_is_userrow(m)) + // Only flash, EEPROM or usersig/userrow is allowed + if (!mem_is_flash(m) && !isee && !mem_is_userrow(m)) return -2; - if (m->desc[0] == 'e') - rd_size = blocksize = 1; /* Read from eeprom single bytes only */ + if(isee) // Read single bytes from EEPROM + blocksize = 1; - { /* use buffered mode */ - char cmd[4]; + char cmd[4]; - cmd[0] = 'g'; - cmd[3] = toupper((int)(m->desc[0])); + cmd[0] = 'g'; + cmd[3] = isee? 'E': mem_is_flash(m)? 'F': 'U'; - if (use_ext_addr) { - butterfly_set_extaddr(pgm, addr / rd_size); - } else { - butterfly_set_addr(pgm, addr / rd_size); - } - while (addr < max_addr) { - if ((max_addr - addr) < (unsigned int) blocksize) { - blocksize = max_addr - addr; - }; - cmd[1] = (blocksize >> 8) & 0xff; - cmd[2] = blocksize & 0xff; + (ext_addr? butterfly_set_extaddr: butterfly_set_addr)(pgm, isee? addr: addr>>1); - EI(butterfly_send(pgm, cmd, 4)); - EI(butterfly_recv(pgm, (char *) &m->buf[addr], blocksize)); + while (addr < max_addr) { + if ((max_addr - addr) < (unsigned int) blocksize) + blocksize = max_addr - addr; - addr += blocksize; - } /* while */ + cmd[1] = (blocksize >> 8) & 0xff; + cmd[2] = blocksize & 0xff; + + EI(butterfly_send(pgm, cmd, 4)); + EI(butterfly_recv(pgm, (char *) &m->buf[addr], blocksize)); + + addr += blocksize; } - return addr * rd_size; + return n_bytes; }