2003-11-18 Theodore A. Roth * avr.c: Index: avr.c =================================================================== RCS file: /cvsroot/avrdude/avrdude/avr.c,v retrieving revision 1.58 diff -u -p -r1.58 avr.c --- avr.c 5 Sep 2003 16:40:55 -0000 1.58 +++ avr.c 18 Nov 2003 21:09:36 -0000 @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include "avr.h" @@ -512,6 +514,7 @@ int avr_write_page(PROGRAMMER * pgm, AVR return 0; } +#include int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, unsigned long addr, unsigned char data) @@ -521,11 +524,15 @@ int avr_write_byte_default(PROGRAMMER * unsigned char r; int ready; int tries; + uint64_t start_time; + uint64_t prog_time; unsigned char b; unsigned short caddr; OPCODE * writeop; int rc; int readok=0; + struct timeval tv; + if (!mem->paged) { /* @@ -615,13 +622,6 @@ int avr_write_byte_default(PROGRAMMER * tries = 0; ready = 0; while (!ready) { - usleep(mem->min_write_delay); - rc = avr_read_byte(pgm, p, mem, addr, &r); - if (rc != 0) { - pgm->pgm_led(pgm, OFF); - pgm->err_led(pgm, ON); - return -4; - } if ((data == mem->readback[0]) || (data == mem->readback[1])) { @@ -639,6 +639,30 @@ int avr_write_byte_default(PROGRAMMER * return -5; } } + else { + gettimeofday (&tv, NULL); + start_time = (tv.tv_sec * 1000000) + tv.tv_usec; + do { + /* + * Do polling, but don't wait (much) longer than max_write_delay + * Granularity might need some tuning for best performance. + */ + rc = avr_read_byte(pgm, p, mem, addr, &r); + if (rc != 0) { + pgm->pgm_led(pgm, OFF); + pgm->err_led(pgm, ON); + return -4; + } + gettimeofday (&tv, NULL); + prog_time = (tv.tv_sec * 1000000) + tv.tv_usec; + } while ((r != data) && + ((prog_time-start_time) < mem->max_write_delay)); + } + + /* + * At this point we either have a valid readback or the + * max_write_delay is expired. + */ if (r == data) { ready = 1; @@ -651,7 +675,6 @@ int avr_write_byte_default(PROGRAMMER * * memory bits but not all. We only actually power-off the * device if the data read back does not match what we wrote. */ - usleep(mem->max_write_delay); /* maximum write delay */ pgm->pgm_led(pgm, OFF); fprintf(stderr, "%s: this device must be powered off and back on to continue\n",