--- avr910.c Sun Sep 18 02:28:19 2005 +++ avr910-patched.c Thu Jun 22 04:15:31 2006 @@ -397,64 +397,77 @@ } -static int avr910_paged_write_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, - int page_size, int n_bytes) -{ - unsigned char cmd[] = {'c', 'C'}; - char buf[2]; - unsigned int addr = 0; - unsigned int max_addr = n_bytes; - unsigned int page_addr; - int page_bytes = page_size; - int page_wr_cmd_pending = 0; - - page_addr = addr; - avr910_set_addr(pgm, addr>>1); - - while (addr < max_addr) { - page_wr_cmd_pending = 1; - buf[0] = cmd[addr & 0x01]; - buf[1] = m->buf[addr]; - avr910_send(pgm, buf, sizeof(buf)); - avr910_vfy_cmd_sent(pgm, "write byte"); - - addr++; - page_bytes--; - - if (m->paged && (page_bytes == 0)) { - /* Send the "Issue Page Write" if we have sent a whole page. */ - - avr910_set_addr(pgm, page_addr>>1); - avr910_send(pgm, "m", 1); - avr910_vfy_cmd_sent(pgm, "flush page"); - - page_wr_cmd_pending = 0; - usleep(m->max_write_delay); - avr910_set_addr(pgm, addr>>1); - - /* Set page address for next page. */ - - page_addr = addr; - page_bytes = page_size; - } - else if ((has_auto_incr_addr != 'Y') && ((addr & 0x01) == 0)) { - avr910_set_addr(pgm, addr>>1); - } - - report_progress (addr, max_addr, NULL); - } - - /* If we didn't send the page wr cmd after the last byte written in the - loop, send it now. */ - - if (page_wr_cmd_pending) { - avr910_set_addr(pgm, page_addr>>1); - avr910_send(pgm, "m", 1); - avr910_vfy_cmd_sent(pgm, "flush final page"); - usleep(m->max_write_delay); - } - - return addr; -} +/* write one page of flash memory */ +static void avr910_write_flash_page(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, + int page_size, unsigned int page_addr) +{ + unsigned char cmd[] = {'c', 'C'}; + char buf[2]; + unsigned int offset = 0; + + if (has_auto_incr_addr == 'Y') { + avr910_set_addr(pgm, page_addr>>1); + } + + for (offset=0; offset < page_size; ++offset) { + + if ((has_auto_incr_addr != 'Y') && ((offset & 0x01) == 0)) { + avr910_set_addr(pgm, (page_addr + offset)>>1); + } + + buf[0] = cmd[offset & 0x01]; + buf[1] = m->buf[page_addr + offset]; + avr910_send(pgm, buf, sizeof(buf)); + avr910_vfy_cmd_sent(pgm, "write byte"); + } + + avr910_set_addr(pgm, page_addr>>1); // still needed? (addr is still on-page) + avr910_send(pgm, "m", 1); + avr910_vfy_cmd_sent(pgm, "flush page"); + usleep(m->max_write_delay); +} + + +/* determine whether page in buffer needs to be written + (ie. contains any byte != 0xFF */ +static int avr910_chk_buffer_page(AVRMEM * m, int page_size, unsigned int page_addr) +{ + unsigned int offset = 0; + + for (offset=0; offset < page_size; ++offset) { + + if (m->buf[page_addr + offset] != 0xFF) { + return 1; + } + } + + return 0; +} + + +/* write buffer to flash memory - this is the replacement for the old proc */ +static int avr910_paged_write_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, + int page_size, int n_bytes) +{ + unsigned int addr; + + for (addr=0; addr