Implement a way of tracking how many erase-rewrite cycles a part has

undergone.  This utilizes the last two bytes of EEPROM to maintain a
counter that is incremented each time the part is erased.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@138 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
Brian S. Dean
2002-08-01 01:00:03 +00:00
parent 5b12f02975
commit 4d2df35736
5 changed files with 152 additions and 11 deletions

81
avr.c
View File

@@ -417,6 +417,7 @@ int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose)
unsigned char * buf;
AVRMEM * mem;
int rc;
int printed;
mem = avr_locate_mem(p, memtype);
if (mem == NULL) {
@@ -430,6 +431,8 @@ int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose)
size = mem->size;
}
printed = 0;
for (i=0; i<size; i++) {
rc = avr_read_byte(fd, p, mem, i, &rbyte);
if (rc != 0) {
@@ -443,12 +446,15 @@ int avr_read(int fd, AVRPART * p, char * memtype, int size, int verbose)
buf[i] = rbyte;
if (verbose) {
if ((i % 16 == 0)||(i == (size-1))) {
printed = 1;
fprintf(stderr, "\r \r%6lu", i);
}
}
}
fprintf(stderr, "\n");
if (printed) {
fprintf(stderr, "\n");
}
return i;
}
@@ -704,6 +710,7 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
unsigned char data;
int werror;
AVRMEM * m;
int printed;
m = avr_locate_mem(p, memtype);
if (m == NULL) {
@@ -714,7 +721,8 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
LED_OFF(fd, pgm->pinno[PIN_LED_ERR]);
werror = 0;
printed = 0;
werror = 0;
wsize = m->size;
if (size < wsize) {
@@ -733,6 +741,7 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
if (verbose) {
if ((i % 16 == 0)||(i == (wsize-1))) {
fprintf(stderr, "\r \r%6lu", i);
printed = 1;
}
}
rc = avr_write_byte(fd, p, m, i, data);
@@ -773,8 +782,8 @@ int avr_write(int fd, AVRPART * p, char * memtype, int size, int verbose)
}
}
fprintf(stderr, "\n");
if (printed)
fprintf(stderr, "\n");
return i;
}
@@ -1008,6 +1017,70 @@ int avr_verify(AVRPART * p, AVRPART * v, char * memtype, int size)
}
int avr_get_cycle_count(int fd, AVRPART * p)
{
int size;
AVRMEM * a;
int cycle_count;
unsigned char v1, v2;
int rc;
a = avr_locate_mem(p, "eeprom");
if (a == NULL) {
return -1;
}
rc = avr_read_byte(fd, p, a, a->size-2, &v1);
if (rc < 0) {
fprintf(stderr, "%s: WARNING: can't read memory for cycle count, rc=%d\n",
progname, rc);
return -1;
}
rc = avr_read_byte(fd, p, a, a->size-1, &v2);
if (rc < 0) {
fprintf(stderr, "%s: WARNING: can't read memory for cycle count, rc=%d\n",
progname, rc);
return -1;
}
cycle_count = ((unsigned int)v1) << 8 | v2;
return cycle_count;
}
int avr_put_cycle_count(int fd, AVRPART * p, int cycles)
{
int size;
AVRMEM * a;
unsigned char v1, v2;
int rc;
a = avr_locate_mem(p, "eeprom");
if (a == NULL) {
return -1;
}
v2 = cycles & 0x0ff;
v1 = (cycles & 0x0ff00) >> 8;
rc = avr_write_byte(fd, p, a, a->size-2, v1);
if (rc < 0) {
fprintf(stderr, "%s: WARNING: can't write memory for cycle count, rc=%d\n",
progname, rc);
return -1;
}
rc = avr_write_byte(fd, p, a, a->size-1, v2);
if (rc < 0) {
fprintf(stderr, "%s: WARNING: can't write memory for cycle count, rc=%d\n",
progname, rc);
return -1;
}
return 0;
}
char * avr_op_str(int op)
{