diff --git a/ChangeLog b/ChangeLog index f8e2fcba..bdb3a30c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021-11-07 Joerg Wunsch + + Submitted by Martin Thierer: + bug #60863: avrftdi programming error probably caused by multiple, consecutive empty pages + * avrftdi.c (avrftdi_flash_write): Skip empty pages + 2021-11-07 Joerg Wunsch Submitted by Matwey V. Kornilov: diff --git a/NEWS b/NEWS index 8fffebef..22f24697 100644 --- a/NEWS +++ b/NEWS @@ -63,6 +63,7 @@ Current: bug #55009: no efuses for m164a/pa bug #55734: USBtiny programming of ATmega328p broken by Patch #9278 bug #58495: Add atmega324pb support to avrdude.conf.in + bug #60863: avrftdi programming error probably caused by multiple, consecutive empty pages * Patches: patch #9482: Add support for UPDI and AVR8X diff --git a/avrftdi.c b/avrftdi.c index 29d10332..dc3ab939 100644 --- a/avrftdi.c +++ b/avrftdi.c @@ -1045,16 +1045,6 @@ static int avrftdi_flash_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, bufptr += 4; } - buf_size = bufptr - buf; - - if(verbose > TRACE) - buf_dump(buf, buf_size, "command buffer", 0, 16*2); - - log_info("Transmitting buffer of size: %d\n", buf_size); - if (0 > avrftdi_transmit(pgm, MPSSE_DO_WRITE, buf, buf, buf_size)) - return -1; - - bufptr = buf; /* find a poll byte. we cannot poll a value of 0xff, so look * for a value != 0xff */ @@ -1064,6 +1054,17 @@ static int avrftdi_flash_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, if((poll_index < addr + len) && m->buf[poll_index] != 0xff) { + buf_size = bufptr - buf; + + if(verbose > TRACE) + buf_dump(buf, buf_size, "command buffer", 0, 16*2); + + log_info("Transmitting buffer of size: %d\n", buf_size); + if (0 > avrftdi_transmit(pgm, MPSSE_DO_WRITE, buf, buf, buf_size)) + return -1; + + bufptr = buf; + log_info("Using m->buf[%d] = 0x%02x as polling value ", poll_index, m->buf[poll_index]); /* poll page write ready */ @@ -1077,9 +1078,7 @@ static int avrftdi_flash_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, } else { - log_warn("No suitable byte (!=0xff) for polling found.\n"); - log_warn("Trying to sleep instead, but programming errors may occur.\n"); - log_warn("Be sure to verify programmed memory (no -V option)\n"); + log_warn("Skipping empty page (containing only 0xff bytes)\n"); /* TODO sync write */ /* sleep */ usleep((m->max_write_delay));