Fix programming of write-only memories (such as lock bits on the
2313). git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@116 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
45765ef2d7
commit
ecf7476537
51
avr.c
51
avr.c
|
@ -42,6 +42,8 @@
|
|||
#include "ppi.h"
|
||||
|
||||
|
||||
#define DEBUG 0
|
||||
|
||||
extern char * progname;
|
||||
extern char progbuf[];
|
||||
extern PROGRAMMER * pgm;
|
||||
|
@ -377,9 +379,11 @@ int avr_read_byte(int fd, AVRPART * p, AVRMEM * mem, unsigned long addr,
|
|||
}
|
||||
|
||||
if (readop == NULL) {
|
||||
#if DEBUG
|
||||
fprintf(stderr,
|
||||
"avr_read_byte(): operation not supported on memory type \"%s\"\n",
|
||||
p->desc);
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -430,11 +434,15 @@ int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose)
|
|||
rc = avr_read_byte(fd, p, mem, i, &rbyte);
|
||||
if (rc != 0) {
|
||||
fprintf(stderr, "avr_read(): error reading address 0x%04lx\n", i);
|
||||
if (rc == -1)
|
||||
fprintf(stderr,
|
||||
" read operation not supported for memory \"%s\"\n",
|
||||
memtype);
|
||||
return -2;
|
||||
}
|
||||
buf[i] = rbyte;
|
||||
if (verbose) {
|
||||
if (i % 16 == 0)
|
||||
if ((i % 16 == 0)||(i == (size-1)))
|
||||
fprintf(stderr, " \r%4lu 0x%02x", i, rbyte);
|
||||
}
|
||||
}
|
||||
|
@ -505,6 +513,7 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
|
|||
unsigned short caddr;
|
||||
OPCODE * writeop;
|
||||
int rc;
|
||||
int readok=0;
|
||||
|
||||
if (!mem->paged) {
|
||||
/*
|
||||
|
@ -513,11 +522,19 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
|
|||
* use this optimization for paged addressing.
|
||||
*/
|
||||
rc = avr_read_byte(fd, p, mem, addr, &b);
|
||||
if (rc != 0)
|
||||
return -1;
|
||||
|
||||
if (b == data) {
|
||||
return 0;
|
||||
if (rc != 0) {
|
||||
if (rc != -1) {
|
||||
return -1;
|
||||
}
|
||||
/*
|
||||
* the read operation is not support on this memory type
|
||||
*/
|
||||
}
|
||||
else {
|
||||
readok = 1;
|
||||
if (b == data) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -544,9 +561,11 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
|
|||
}
|
||||
|
||||
if (writeop == NULL) {
|
||||
#if DEBUG
|
||||
fprintf(stderr,
|
||||
"avr_write_byte(): write not support for memory type \"%s\"\n",
|
||||
"avr_write_byte(): write not supported for memory type \"%s\"\n",
|
||||
mem->desc);
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -571,6 +590,16 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (readok == 0) {
|
||||
/*
|
||||
* read operation not supported for this memory type, just wait
|
||||
* the max programming time and then return
|
||||
*/
|
||||
usleep(mem->max_write_delay); /* maximum write delay */
|
||||
LED_OFF(fd, pgm->pinno[PIN_LED_PGM]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
tries = 0;
|
||||
ready = 0;
|
||||
while (!ready) {
|
||||
|
@ -593,11 +622,11 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
|
|||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (r == data) {
|
||||
ready = 1;
|
||||
}
|
||||
|
||||
|
||||
tries++;
|
||||
if (!ready && tries > 5) {
|
||||
/*
|
||||
|
@ -606,7 +635,7 @@ int avr_write_byte(int fd, AVRPART * p, AVRMEM * mem,
|
|||
*/
|
||||
LED_OFF(fd, pgm->pinno[PIN_LED_PGM]);
|
||||
LED_ON(fd, pgm->pinno[PIN_LED_ERR]);
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -660,7 +689,7 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
|
|||
for (i=0; i<wsize; i++) {
|
||||
data = m->buf[i];
|
||||
if (verbose) {
|
||||
if (i % 16 == 0)
|
||||
if ((i % 16 == 0)||(i == (wsize-1)))
|
||||
fprintf(stderr, " \r%4lu 0x%02x ", i, data);
|
||||
}
|
||||
rc = avr_write_byte(fd, p, m, i, data);
|
||||
|
|
7
term.c
7
term.c
|
@ -278,6 +278,9 @@ int cmd_dump(int fd, struct avrpart * p, int argc, char * argv[])
|
|||
if (rc != 0) {
|
||||
fprintf(stderr, "error reading %s address 0x%05lx of part %s\n",
|
||||
mem->desc, addr+i, p->desc);
|
||||
if (rc == -1)
|
||||
fprintf(stderr, "read operation not supported on memory type \"%s\"\n",
|
||||
mem->desc);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -370,6 +373,10 @@ int cmd_write(int fd, struct avrpart * p, int argc, char * argv[])
|
|||
if (rc) {
|
||||
fprintf(stderr, "%s (write): error writing 0x%02x at 0x%05lx\n",
|
||||
progname, buf[i], addr+i);
|
||||
if (rc == -1)
|
||||
fprintf(stderr,
|
||||
"write operation not supported on memory type \"%s\"\n",
|
||||
mem->desc);
|
||||
werror = 1;
|
||||
}
|
||||
if (werror) {
|
||||
|
|
Loading…
Reference in New Issue