diff --git a/src/avrdude.1 b/src/avrdude.1 index c4fc850f..be22e0c1 100644 --- a/src/avrdude.1 +++ b/src/avrdude.1 @@ -709,6 +709,8 @@ can be one of: .Bl -tag -width sss .It Ar i Intel Hex +.It Ar I +Intel Hex with comments on download and tolerance of checksum errors on upload .It Ar s Motorola S-record .It Ar r diff --git a/src/doc/avrdude.texi b/src/doc/avrdude.texi index d99b0a85..42cdc88a 100644 --- a/src/doc/avrdude.texi +++ b/src/doc/avrdude.texi @@ -768,6 +768,9 @@ the file to read or write. Possible values are: @item i Intel Hex +@item I +Intel Hex with comments on download and tolerance of checksum errors on upload + @item s Motorola S-record diff --git a/src/fileio.c b/src/fileio.c index 1c81682d..f1df1158 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -59,10 +59,11 @@ struct ihexrec { static int b2ihex(unsigned char * inbuf, int bufsize, int recsize, int startaddr, - char * outfile, FILE * outf); + char * outfile, FILE * outf, FILEFMT ffmt); static int ihex2b(char * infile, FILE * inf, - AVRMEM * mem, int bufsize, unsigned int fileoffset); + AVRMEM * mem, int bufsize, unsigned int fileoffset, + FILEFMT ffmt); static int b2srec(unsigned char * inbuf, int bufsize, int recsize, int startaddr, @@ -79,7 +80,8 @@ static int fileio_rbin(struct fioparms * fio, char * filename, FILE * f, AVRMEM * mem, int size); static int fileio_ihex(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size); + char * filename, FILE * f, AVRMEM * mem, int size, + FILEFMT ffmt); static int fileio_srec(struct fioparms * fio, char * filename, FILE * f, AVRMEM * mem, int size); @@ -108,6 +110,7 @@ char * fmtstr(FILEFMT format) case FMT_AUTO : return "auto-detect"; break; case FMT_SREC : return "Motorola S-Record"; break; case FMT_IHEX : return "Intel Hex"; break; + case FMT_IHXC : return "Intel Hex with comments"; break; case FMT_RBIN : return "raw binary"; break; case FMT_ELF : return "ELF"; break; default : return "invalid format"; break; @@ -115,10 +118,9 @@ char * fmtstr(FILEFMT format) } - static int b2ihex(unsigned char * inbuf, int bufsize, int recsize, int startaddr, - char * outfile, FILE * outf) + char * outfile, FILE * outf, FILEFMT ffmt) { unsigned char * buf; unsigned int nextaddr; @@ -154,8 +156,20 @@ static int b2ihex(unsigned char * inbuf, int bufsize, cksum += buf[i]; } cksum = -cksum; - fprintf(outf, "%02X\n", cksum); - + fprintf(outf, "%02X", cksum); + + if(ffmt == FMT_IHXC) { /* Print comment with address and ASCII dump */ + for(i=n; i ", n_64k*0x10000 + nextaddr); + for (i=0; iop) { case FIO_WRITE: - rc = b2ihex(mem->buf, size, 32, fio->fileoffset, filename, f); + rc = b2ihex(mem->buf, size, 32, fio->fileoffset, filename, f, ffmt); if (rc < 0) { return -1; } break; case FIO_READ: - rc = ihex2b(filename, f, mem, size, fio->fileoffset); + rc = ihex2b(filename, f, mem, size, fio->fileoffset, ffmt); if (rc < 0) return -1; break; @@ -1547,7 +1570,8 @@ int fileio(int oprwv, char * filename, FILEFMT format, switch (format) { case FMT_IHEX: - rc = fileio_ihex(&fio, fname, f, mem, size); + case FMT_IHXC: + rc = fileio_ihex(&fio, fname, f, mem, size, format); break; case FMT_SREC: diff --git a/src/libavrdude.h b/src/libavrdude.h index 7088b108..6ef8da14 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -822,7 +822,8 @@ typedef enum { FMT_DEC, FMT_OCT, FMT_BIN, - FMT_ELF + FMT_ELF, + FMT_IHXC, } FILEFMT; struct fioparms { diff --git a/src/update.c b/src/update.c index d3c208fc..1840f81f 100644 --- a/src/update.c +++ b/src/update.c @@ -130,6 +130,7 @@ UPDATE * parse_op(char * s) case 'a': upd->format = FMT_AUTO; break; case 's': upd->format = FMT_SREC; break; case 'i': upd->format = FMT_IHEX; break; + case 'I': upd->format = FMT_IHXC; break; case 'r': upd->format = FMT_RBIN; break; case 'e': upd->format = FMT_ELF; break; case 'm': upd->format = FMT_IMM; break;