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",