Index: main.c =================================================================== RCS file: /cvsroot/avrdude/avrdude/main.c,v retrieving revision 1.89 diff -u -w -r1.89 main.c --- main.c 30 Nov 2003 16:49:00 -0000 1.89 +++ main.c 1 Dec 2003 12:01:09 -0000 @@ -1282,26 +1282,6 @@ } } - if (set_cycles != -1) { - rc = avr_get_cycle_count(pgm, p, &cycles); - if (rc == 0) { - /* - * only attempt to update the cycle counter if we can actually - * read the old value - */ - cycles = set_cycles; - fprintf(stderr, "%s: setting erase-rewrite cycle count to %d\n", - progname, cycles); - rc = avr_put_cycle_count(pgm, p, cycles); - if (rc < 0) { - fprintf(stderr, - "%s: WARNING: failed to update the erase-rewrite cycle " - "counter\n", - progname); - } - } - } - if ((erase == 0) && (auto_erase == 1)) { AVRMEM * m; @@ -1321,32 +1301,53 @@ } } - - - if (erase) { /* - * erase the chip's flash and eeprom memories, this is required - * before the chip can accept new programming + * Display cycle count, if and only if it is not set later on. + * + * The cycle count will be displayed anytime it will be changed later. */ - fprintf(stderr, "%s: erasing chip\n", progname); - pgm->chip_erase(pgm, p); - } - else if (set_cycles == -1) { + if ((set_cycles == -1) && ((erase == 0) || (do_cycles == 0))) { /* - * The erase routine displays this same information, so don't - * repeat it if an erase was done. Also, don't display this if we - * set the cycle count (due to -Y). - * * see if the cycle count in the last four bytes of eeprom seems * reasonable */ rc = avr_get_cycle_count(pgm, p, &cycles); - if ((rc >= 0) && (cycles != 0xffffffff)) { + if ((rc >= 0) && (cycles != 0)) { fprintf(stderr, "%s: current erase-rewrite cycle count is %d%s\n", progname, cycles, do_cycles ? "" : " (if being tracked)"); } + } + + if (set_cycles != -1) { + rc = avr_get_cycle_count(pgm, p, &cycles); + if (rc == 0) { + /* + * only attempt to update the cycle counter if we can actually + * read the old value + */ + cycles = set_cycles; + fprintf(stderr, "%s: setting erase-rewrite cycle count to %d\n", + progname, cycles); + rc = avr_put_cycle_count(pgm, p, cycles); + if (rc < 0) { + fprintf(stderr, + "%s: WARNING: failed to update the erase-rewrite cycle " + "counter\n", + progname); + } + } + } + + + if (erase) { + /* + * erase the chip's flash and eeprom memories, this is required + * before the chip can accept new programming + */ + fprintf(stderr, "%s: erasing chip\n", progname); + avr_chip_erase(pgm, p); } Index: avr.c =================================================================== RCS file: /cvsroot/avrdude/avrdude/avr.c,v retrieving revision 1.60 diff -u -w -r1.60 avr.c --- avr.c 30 Nov 2003 16:42:10 -0000 1.60 +++ avr.c 1 Dec 2003 12:01:09 -0000 @@ -682,54 +682,34 @@ int avr_get_cycle_count(PROGRAMMER * pgm, AVRPART * p, int * cycles) { AVRMEM * a; - int cycle_count; - unsigned char v1, v2, v3, v4; + unsigned int cycle_count = 0; + unsigned char v1; int rc; + int i; a = avr_locate_mem(p, "eeprom"); if (a == NULL) { return -1; } - rc = avr_read_byte(pgm, p, a, a->size-4, &v1); + for (i=4; i>0; i--) { + rc = avr_read_byte(pgm, p, a, a->size-i, &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(pgm, p, a, a->size-3, &v2); - if (rc < 0) { - fprintf(stderr, "%s: WARNING: can't read memory for cycle count, rc=%d\n", - progname, rc); - return -1; + cycle_count = (cycle_count << 8) | v1; } - rc = avr_read_byte(pgm, p, a, a->size-2, &v3); - if (rc < 0) { - fprintf(stderr, "%s: WARNING: can't read memory for cycle count, rc=%d\n", - progname, rc); - return -1; + /* + * If cycle count is not valid, asume 0 + */ + if (cycle_count == 0xffffffff) { + cycle_count = 0; } - rc = avr_read_byte(pgm, p, a, a->size-1, &v4); - if (rc < 0) { - fprintf(stderr, "%s: WARNING: can't read memory for cycle count, rc=%d\n", - progname, rc); - return -1; - } - - if ((v1 == 0xff) && (v2 == 0xff) && (v3 != 0xff) && (v4 != 0xff)) { - v1 = 0; - v2 = 0; - } - - cycle_count = (((unsigned int)v1) << 24) | - (((unsigned int)v2) << 16) | - (((unsigned int)v3) << 8) | - v4; - - *cycles = cycle_count; + *cycles = (int) cycle_count; return 0; } @@ -738,43 +718,56 @@ int avr_put_cycle_count(PROGRAMMER * pgm, AVRPART * p, int cycles) { AVRMEM * a; - unsigned char v1, v2, v3, v4; + unsigned char v1; int rc; + int i; a = avr_locate_mem(p, "eeprom"); if (a == NULL) { return -1; } - v4 = cycles & 0x0ff; - v3 = (cycles & 0x0ff00) >> 8; - v2 = (cycles & 0x0ff0000) >> 16; - v1 = (cycles & 0x0ff000000) >> 24; + for (i=1; i<=4; i++) { + v1 = cycles & 0xff; + cycles = cycles >> 8; - rc = avr_write_byte(pgm, p, a, a->size-4, v1); + rc = avr_write_byte(pgm, p, a, a->size-i, 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(pgm, p, a, a->size-3, v2); - 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(pgm, p, a, a->size-2, v3); - if (rc < 0) { - fprintf(stderr, "%s: WARNING: can't write memory for cycle count, rc=%d\n", - progname, rc); - return -1; + + return 0; } - rc = avr_write_byte(pgm, p, a, a->size-1, v4); - if (rc < 0) { - fprintf(stderr, "%s: WARNING: can't write memory for cycle count, rc=%d\n", - progname, rc); - return -1; + +int avr_chip_erase(PROGRAMMER * pgm, AVRPART * p) +{ + int cycles; + int rc; + + rc = avr_get_cycle_count(pgm, p, &cycles); + + /* + * Don't update the cycle counter, if read failed + */ + if(rc != 0) { + do_cycles = 0; } - return 0; + rc = pgm->chip_erase(pgm, p); + + /* + * Don't update the cycle counter, if erase failed + */ + if (do_cycles && (rc == 0)) { + cycles++; + fprintf(stderr, "%s: erase-rewrite cycle count is now %d\n", + progname, cycles); + avr_put_cycle_count(pgm, p, cycles); + + } + + return rc; } Index: avr.h =================================================================== RCS file: /cvsroot/avrdude/avrdude/avr.h,v retrieving revision 1.28 diff -u -w -r1.28 avr.h --- avr.h 30 Nov 2003 16:42:10 -0000 1.28 +++ avr.h 1 Dec 2003 12:01:09 -0000 @@ -69,6 +69,8 @@ int avr_mem_hiaddr(AVRMEM * mem); +int avr_chip_erase(PROGRAMMER * pgm, AVRPART * p); + extern void report_progress (int completed, int total, char *hdr); #endif Index: par.c =================================================================== RCS file: /cvsroot/avrdude/avrdude/par.c,v retrieving revision 1.5 diff -u -w -r1.5 par.c --- par.c 22 Feb 2003 16:45:13 -0000 1.5 +++ par.c 1 Dec 2003 12:01:09 -0000 @@ -319,8 +319,6 @@ { unsigned char cmd[4]; unsigned char res[4]; - int cycles; - int rc; if (p->op[AVR_OP_CHIP_ERASE] == NULL) { fprintf(stderr, "chip erase instruction not defined for part \"%s\"\n", @@ -328,19 +326,6 @@ return -1; } - rc = avr_get_cycle_count(pgm, p, &cycles); - - /* - * only print out the current cycle count if we aren't going to - * display it below - */ - if (!do_cycles && ((rc >= 0) && (cycles != 0xffffffff))) { - fprintf(stderr, - "%s: current erase-rewrite cycle count is %d%s\n", - progname, cycles, - do_cycles ? "" : " (if being tracked)"); - } - pgm->pgm_led(pgm, ON); memset(cmd, 0, sizeof(cmd)); @@ -351,16 +336,6 @@ pgm->initialize(pgm, p); pgm->pgm_led(pgm, OFF); - - if (do_cycles && (cycles != -1)) { - if (cycles == 0x00ffff) { - cycles = 0; - } - cycles++; - fprintf(stderr, "%s: erase-rewrite cycle count is now %d\n", - progname, cycles); - avr_put_cycle_count(pgm, p, cycles); - } return 0; } Index: stk500.c =================================================================== RCS file: /cvsroot/avrdude/avrdude/stk500.c,v retrieving revision 1.39 diff -u -w -r1.39 stk500.c --- stk500.c 13 Oct 2003 21:32:53 -0000 1.39 +++ stk500.c 1 Dec 2003 12:01:09 -0000 @@ -171,8 +171,6 @@ { unsigned char cmd[4]; unsigned char res[4]; - int cycles; - int rc; if (p->op[AVR_OP_CHIP_ERASE] == NULL) { fprintf(stderr, "chip erase instruction not defined for part \"%s\"\n", @@ -180,19 +178,6 @@ return -1; } - rc = avr_get_cycle_count(pgm, p, &cycles); - - /* - * only print out the current cycle count if we aren't going to - * display it below - */ - if (!do_cycles && ((rc >= 0) && (cycles != 0xffffffff))) { - fprintf(stderr, - "%s: current erase-rewrite cycle count is %d%s\n", - progname, cycles, - do_cycles ? "" : " (if being tracked)"); - } - pgm->pgm_led(pgm, ON); memset(cmd, 0, sizeof(cmd)); @@ -203,16 +188,6 @@ pgm->initialize(pgm, p); pgm->pgm_led(pgm, OFF); - - if (do_cycles && (cycles != -1)) { - if (cycles == 0x00ffff) { - cycles = 0; - } - cycles++; - fprintf(stderr, "%s: erase-rewrite cycle count is now %d\n", - progname, cycles); - avr_put_cycle_count(pgm, p, cycles); - } return 0; }