diff --git a/avrdude.conf.in b/avrdude.conf.in index 7b2fae76..4e229bba 100644 --- a/avrdude.conf.in +++ b/avrdude.conf.in @@ -1782,12 +1782,12 @@ part max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", + read_lo = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; - write = " 1 1 0 0 0 0 0 0", + write_lo = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; @@ -1817,6 +1817,7 @@ part " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; + loadpage_lo = " 0 1 0 0 0 0 0 0", " x x x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", @@ -1934,12 +1935,12 @@ part max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", + read_lo = " 1 0 1 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; - write = " 1 1 0 0 0 0 0 0", + write_lo = " 1 1 0 0 0 0 0 0", " x x x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; diff --git a/stk500v2.c b/stk500v2.c index b6361b98..eaf54095 100644 --- a/stk500v2.c +++ b/stk500v2.c @@ -495,7 +495,8 @@ static int stk500v2_loadaddr(PROGRAMMER * pgm, unsigned int addr) static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, int page_size, int n_bytes) { - int addr, block_size; + int addr, block_size, last_addr; + int a_div=1; unsigned char commandbuf[10]; unsigned char buf[266]; unsigned char cmds[4]; @@ -507,6 +508,7 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, // determine which command is to be used if (strcmp(m->desc, "flash") == 0) { + a_div=2; commandbuf[0] = CMD_PROGRAM_FLASH_ISP; } else if (strcmp(m->desc, "eeprom") == 0) { commandbuf[0] = CMD_PROGRAM_EEPROM_ISP; @@ -543,7 +545,8 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, return -1; } avr_set_bits(m->op[AVR_OP_WRITE_LO], cmds); - commandbuf[6] = cmds[0]; + commandbuf[5] = cmds[0]; + commandbuf[6] = 0; } // the read command is common to both methods @@ -558,7 +561,7 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, commandbuf[8] = m->readback[0]; commandbuf[9] = m->readback[1]; - stk500v2_loadaddr(pgm, 0); + last_addr=-1; for (addr=0; addr < n_bytes; addr += page_size) { report_progress(addr,n_bytes,NULL); @@ -567,13 +570,25 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, block_size = n_bytes - addr; else block_size = page_size; + DEBUG("block_size at addr %d is %d\n",addr,block_size); + if(commandbuf[0] == CMD_PROGRAM_FLASH_ISP){ + if (stk500v2_is_page_empty(addr, block_size, m->buf)) { + continue; + } + } + memcpy(buf,commandbuf,sizeof(commandbuf)); buf[1] = block_size >> 8; buf[2] = block_size & 0xff; + if((last_addr==-1)||(last_addr+block_size != addr)){ + stk500v2_loadaddr(pgm, addr/a_div); + } + last_addr=addr; + memcpy(buf+10,m->buf+addr, block_size); result = stk500v2_command(pgm,buf,block_size+10, sizeof(buf)); @@ -609,7 +624,7 @@ static int stk500v2_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, unsigned char commandbuf[4]; unsigned char buf[275]; // max buffer size for stk500v2 at this point unsigned char cmds[4]; - int result, i; + int result; DEBUG("STK500V2: stk500v2_paged_load(..,%s,%d,%d)\n",m->desc,page_size,n_bytes); @@ -624,7 +639,7 @@ static int stk500v2_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, // the read command is common to both methods if (m->op[AVR_OP_READ_LO] == NULL) { - fprintf(stderr, "%s: stk500v2_paged_write: read instruction not defined for part \"%s\"\n", + fprintf(stderr, "%s: stk500v2_paged_load: read instruction not defined for part \"%s\"\n", progname, p->desc); return -1; } @@ -649,7 +664,7 @@ static int stk500v2_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, result = stk500v2_command(pgm,buf,4,sizeof(buf)); if (buf[1] != STATUS_CMD_OK) { - fprintf(stderr,"%s: stk500v2_paged_write: read command failed with %d\n", + fprintf(stderr,"%s: stk500v2_paged_load: read command failed with %d\n", progname,buf[1]); return -1; } @@ -663,7 +678,7 @@ static int stk500v2_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, memcpy(&m->buf[addr], &buf[2], block_size); } - return 0; + return n_bytes; }