diff --git a/avrprog.c b/avrprog.c index aad8b43c..604dff12 100644 --- a/avrprog.c +++ b/avrprog.c @@ -1745,6 +1745,66 @@ int go_interactive ( int fd, struct avrpart * p ) +int avr_initmem ( struct avrpart * p ) +{ + p->flash = (unsigned char *) malloc(p->flash_size); + if (p->flash == NULL) { + fprintf(stderr, "%s: can't alloc buffer for flash size of %d bytes\n", + progname, p->flash_size); + exit(1); + } + + p->eeprom = (unsigned char *) malloc(p->eeprom_size); + if (p->eeprom == NULL) { + fprintf(stderr, "%s: can't alloc buffer for eeprom size of %d bytes\n", + progname, p->eeprom_size); + exit(1); + } + + return 0; +} + + +int verify_data(struct avrpart * p, struct avrpart * v, AVRMEM memtype) +{ + int i; + unsigned char * buf1, * buf2; + int size; + + switch (memtype) { + case AVR_FLASH: + buf1 = p->flash; + buf2 = v->flash; + size = p->flash_size; + break; + + case AVR_EEPROM: + buf1 = p->eeprom; + buf2 = v->eeprom; + size = p->eeprom_size; + break; + + default: + fprintf(stderr, "%s: invalid memory type = %d for data verification\n", + progname, memtype); + return -1; + } + + for (i=0; i<size; i++) { + if (buf1[i] != buf2[i]) { + fprintf(stderr, + "%s: verification error, first mismatch at byte %d\n" + "%s0x%02x != 0x%02x\n", + progname, i, + progbuf, buf1[i], buf2[i]); + return -1; + } + } + + return 0; +} + + /* * main routine */ @@ -1761,7 +1821,8 @@ int main ( int argc, char * argv [] ) char * p2; /* used to parse CVS Ed */ unsigned char sig[4]; /* AVR signature bytes */ unsigned char nulldev[4]; /* 0xff signature bytes for comparison */ - struct avrpart * p; /* which avr part we are programming */ + struct avrpart * p, ap1; /* which avr part we are programming */ + struct avrpart * v, ap2; /* used for verify */ int readorwrite; /* true if a chip read/write op was selected */ /* options / operating mode variables */ @@ -1775,6 +1836,7 @@ int main ( int argc, char * argv [] ) int interactive; /* 1=enter interactive command mode, 0=don't */ FILEFMT filefmt; /* FMT_AUTO, FMT_IHEX, FMT_SREC, FMT_RBIN */ int nowrite; /* don't actually write anything to the chip */ + int verify; /* perform a verify operation */ readorwrite = 0; parallel = DEFAULT_PARALLEL; @@ -1788,6 +1850,7 @@ int main ( int argc, char * argv [] ) interactive = 0; filefmt = FMT_AUTO; nowrite = 0; + verify = 1; /* on by default; XXX can't turn it off */ progname = rindex(argv[0],'/'); if (progname) @@ -1835,7 +1898,7 @@ int main ( int argc, char * argv [] ) /* * process command line arguments */ - while ((ch = getopt(argc,argv,"?cef:Fi:m:no:p:P:")) != -1) { + while ((ch = getopt(argc,argv,"?cef:Fi:m:no:p:P:v")) != -1) { switch (ch) { case 'm': /* select memory type to operate on */ @@ -1945,6 +2008,10 @@ int main ( int argc, char * argv [] ) parallel = optarg; break; + case 'v': + verify = 1; + break; + case '?': /* help */ usage(); exit(0); @@ -1969,6 +2036,20 @@ int main ( int argc, char * argv [] ) return 1; } + /* + * set up seperate instances of the avr part, one for use in + * programming, one for use in verifying. These are separate + * because they need separate flash and eeprom buffer space + */ + ap1 = *p; + v = p; + p = &ap1; + ap2 = *v; + v = &ap2; + + avr_initmem(p); + avr_initmem(v); + fprintf(stderr, "%sAVR Part = %s\n" "%sFlash memory size = %d bytes\n" @@ -1986,20 +2067,6 @@ int main ( int argc, char * argv [] ) progbuf, p->e_readback[0], p->e_readback[1]); fprintf(stderr, "\n"); - p->flash = (unsigned char *) malloc(p->flash_size); - if (p->flash == NULL) { - fprintf(stderr, "%s: can't alloc buffer for flash size of %d bytes\n", - progname, p->flash_size); - exit(1); - } - - p->eeprom = (unsigned char *) malloc(p->eeprom_size); - if (p->eeprom == NULL) { - fprintf(stderr, "%s: can't alloc buffer for eeprom size of %d bytes\n", - progname, p->eeprom_size); - exit(1); - } - /* * open the parallel port */ @@ -2091,16 +2158,18 @@ int main ( int argc, char * argv [] ) /* * read out the specified device memory and write it to a file */ - fprintf ( stderr, "%s: reading %s memory:\n", - progname, memtypestr(memtype) ); + fprintf(stderr, "%s: reading %s memory:\n", + progname, memtypestr(memtype)); rc = avr_read ( fd, p, memtype ); if (rc) { - fprintf ( stderr, "%s: failed to read all of %s memory, rc=%d\n", - progname, memtypestr(memtype), rc ); + fprintf(stderr, "%s: failed to read all of %s memory, rc=%d\n", + progname, memtypestr(memtype), rc); exitrc = 1; goto main_exit; } + fprintf(stderr, "%s: writing output file \"%s\"\n", + progname, outputf); rc = fileio(FIO_WRITE, outputf, filefmt, p, memtype); if (rc < 0) { fprintf(stderr, "%s: terminating\n", progname); @@ -2114,6 +2183,8 @@ int main ( int argc, char * argv [] ) * write the selected device memory using data from a file; first * read the data from the specified file */ + fprintf(stderr, "%s: reading input file \"%s\"\n", + progname, inputf); rc = fileio(FIO_READ, inputf, filefmt, p, memtype ); if (rc < 0) { fprintf(stderr, "%s: terminating\n", progname); @@ -2145,8 +2216,40 @@ int main ( int argc, char * argv [] ) exitrc = 1; goto main_exit; } + } + if (!doread && verify) { + /* + * verify that the in memory file (p->flash or p->eeprom) is the + * same as what is on the chip + */ + fprintf(stderr, "%s: verifying %s memory against %s:\n", + progname, memtypestr(memtype), inputf); + fprintf(stderr, "%s: reading on-chip %s data:\n", + progname, memtypestr(memtype)); + rc = avr_read ( fd, v, memtype ); + if (rc) { + fprintf(stderr, "%s: failed to read all of %s memory, rc=%d\n", + progname, memtypestr(memtype), rc); + exitrc = 1; + goto main_exit; + } + + fprintf(stderr, "%s: verifying\n", progname); + rc = verify_data(p, v, memtype); + if (rc) { + fprintf(stderr, "%s: verification error; content mismatch\n", + progname); + exitrc = 1; + goto main_exit; + } + + fprintf(stderr, "%s: data verified\n", progname); + } + + + main_exit: /*