diff --git a/avrdude/patches/low-addr.patch b/avrdude/patches/low-addr.patch new file mode 100644 index 0000000..d942204 --- /dev/null +++ b/avrdude/patches/low-addr.patch @@ -0,0 +1,142 @@ +Index: avrdude/avrdude-5.10/avrpart.h +=================================================================== +--- avrdude.orig/avrdude-5.10/avrpart.h 2011-03-08 23:40:10.000000000 -0300 ++++ avrdude/avrdude-5.10/avrpart.h 2011-03-08 23:40:13.000000000 -0300 +@@ -185,6 +185,8 @@ + + unsigned char * buf; /* pointer to memory buffer */ + OPCODE * op[AVR_OP_MAX]; /* opcodes */ ++ ++ int low_addr; /* lowest address used, in bytes */ + } AVRMEM; + + #ifdef __cplusplus +Index: avrdude/avrdude-5.10/config_gram.y +=================================================================== +--- avrdude.orig/avrdude-5.10/config_gram.y 2011-03-08 23:40:10.000000000 -0300 ++++ avrdude/avrdude-5.10/config_gram.y 2011-03-08 23:40:13.000000000 -0300 +@@ -1209,6 +1209,7 @@ + } + mem_specs + { ++ current_mem->low_addr = current_mem->size; + ladd(current_part->mem, current_mem); + current_mem = NULL; + } | +Index: avrdude/avrdude-5.10/fileio.c +=================================================================== +--- avrdude.orig/avrdude-5.10/fileio.c 2011-03-08 23:40:10.000000000 -0300 ++++ avrdude/avrdude-5.10/fileio.c 2011-03-08 23:40:13.000000000 -0300 +@@ -52,7 +52,7 @@ + char * outfile, FILE * outf); + + static int ihex2b(char * infile, FILE * inf, +- unsigned char * outbuf, int bufsize); ++ unsigned char * outbuf, int bufsize, int *low_addr); + + static int b2srec(unsigned char * inbuf, int bufsize, + int recsize, int startaddr, +@@ -69,7 +69,8 @@ + char * filename, FILE * f, unsigned char * buf, int size); + + static int fileio_ihex(struct fioparms * fio, +- char * filename, FILE * f, unsigned char * buf, int size); ++ char * filename, FILE * f, unsigned char * buf, int size, ++ int *low_addr); + + static int fileio_srec(struct fioparms * fio, + char * filename, FILE * f, unsigned char * buf, int size); +@@ -262,7 +263,7 @@ + * + * */ + static int ihex2b(char * infile, FILE * inf, +- unsigned char * outbuf, int bufsize) ++ unsigned char * outbuf, int bufsize, int *low_addr) + { + char buffer [ MAX_LINE_LEN ]; + unsigned char * buf; +@@ -271,7 +272,7 @@ + int lineno; + int len; + struct ihexrec ihex; +- int rc; ++ int rc, lowest; + + lineno = 0; + buf = outbuf; +@@ -279,6 +280,7 @@ + maxaddr = 0; + offsetaddr = 0; + nextaddr = 0; ++ lowest = bufsize; + + while (fgets((char *)buffer,MAX_LINE_LEN,inf)!=NULL) { + lineno++; +@@ -313,11 +315,14 @@ + for (i=0; i maxaddr) + maxaddr = nextaddr+ihex.reclen; + break; + + case 1: /* end of file record */ ++ *low_addr = lowest; + return maxaddr-offsetaddr; + break; + +@@ -354,6 +359,7 @@ + "file \"%s\"\n", + progname, infile); + ++ *low_addr = lowest; + return maxaddr-offsetaddr; + } + +@@ -777,7 +783,8 @@ + + + static int fileio_ihex(struct fioparms * fio, +- char * filename, FILE * f, unsigned char * buf, int size) ++ char * filename, FILE * f, unsigned char * buf, int size, ++ int *low_addr) + { + int rc; + +@@ -790,7 +797,7 @@ + break; + + case FIO_READ: +- rc = ihex2b(filename, f, buf, size); ++ rc = ihex2b(filename, f, buf, size, low_addr); + if (rc < 0) + return -1; + break; +@@ -1021,6 +1028,7 @@ + struct fioparms fio; + AVRMEM * mem; + int using_stdio; ++ int low_addr = 0; + + mem = avr_locate_mem(p, memtype); + if (mem == NULL) { +@@ -1113,7 +1121,7 @@ + + switch (format) { + case FMT_IHEX: +- rc = fileio_ihex(&fio, fname, f, buf, size); ++ rc = fileio_ihex(&fio, fname, f, buf, size, &low_addr); + break; + + case FMT_SREC: +@@ -1149,6 +1157,8 @@ + */ + rc = avr_mem_hiaddr(mem); + } ++ if (op == FIO_READ && low_addr < mem->low_addr) ++ mem->low_addr = low_addr; + } + if (format != FMT_IMM && !using_stdio) { + fclose(f); diff --git a/avrdude/patches/series b/avrdude/patches/series index 9352747..5e07046 100644 --- a/avrdude/patches/series +++ b/avrdude/patches/series @@ -1,3 +1,5 @@ +low-addr.patch +skip-low-addr.patch nanonote.patch nanonote-nxuart.patch nanonote-atusb.patch diff --git a/avrdude/patches/skip-low-addr.patch b/avrdude/patches/skip-low-addr.patch new file mode 100644 index 0000000..ee33609 --- /dev/null +++ b/avrdude/patches/skip-low-addr.patch @@ -0,0 +1,36 @@ +Index: avrdude/avrdude-5.10/avr.c +=================================================================== +--- avrdude.orig/avrdude-5.10/avr.c 2011-03-08 23:46:53.000000000 -0300 ++++ avrdude/avrdude-5.10/avr.c 2011-03-08 23:50:06.000000000 -0300 +@@ -192,7 +192,8 @@ + } + } + +- for (i=0; ipaged ? mem->low_addr : 0; ++ for (; iread_byte(pgm, p, mem, i, &rbyte); + if (rc != 0) { + fprintf(stderr, "avr_read(): error reading address 0x%04lx\n", i); +@@ -580,7 +581,8 @@ + pgm->write_setup(pgm, p, m); + } + +- for (i=0; ipaged ? m->low_addr-(m->low_addr % m->page_size) : 0; ++ for (; ibuf[i]; + report_progress(i, wsize, NULL); + +Index: avrdude/avrdude-5.10/update.c +=================================================================== +--- avrdude.orig/avrdude-5.10/update.c 2011-03-08 23:46:53.000000000 -0300 ++++ avrdude/avrdude-5.10/update.c 2011-03-08 23:47:45.000000000 -0300 +@@ -224,6 +224,7 @@ + progname, mem->desc); + } + report_progress(0,1,"Reading"); ++ mem->low_addr = 0; /* @@@ hackish */ + rc = avr_read(pgm, p, upd->memtype, 0, 1); + if (rc < 0) { + fprintf(stderr, "%s: failed to read all of %s memory, rc=%d\n",