diff --git a/avrdude.1 b/avrdude.1 index a7743dd6..ff1bf79b 100644 --- a/avrdude.1 +++ b/avrdude.1 @@ -250,6 +250,10 @@ Intel Hex Motorola S-record .It Ar r raw binary; little-endian byte order, in the case of the flash ROM data +.It Ar m +immediate; actual byte values specified on the command line, seperated +by commas or spaces. This is good for programming fuse bytes without +having to create a single-byte file or enter terminal mode. .It Ar a auto detect; valid for input only, and only if the input is not provided at diff --git a/fileio.c b/fileio.c index 83727725..d70e427a 100644 --- a/fileio.c +++ b/fileio.c @@ -728,6 +728,49 @@ int fileio_rbin(struct fioparms * fio, } +int fileio_imm(struct fioparms * fio, + char * filename, FILE * f, unsigned char * buf, int size) +{ + int rc; + char * e, * p; + unsigned long b; + int loc; + + switch (fio->op) { + case FIO_READ: + loc = 0; + p = strtok(filename, " ,"); + while (p != NULL && loc < size) { + b = strtoul(p, &e, 0); + if (*e != 0) { + fprintf(stderr, + "%s: invalid byte value (%s) specified for immediate mode\n", + progname, p); + return -1; + } + buf[loc++] = b; + p = strtok(NULL, " ,"); + rc = loc; + } + break; + default: + fprintf(stderr, "%s: fileio: invalid operation=%d\n", + progname, fio->op); + return -1; + } + + if (rc < 0 || (fio->op == FIO_WRITE && rc < size)) { + fprintf(stderr, + "%s: %s error %s %s: %s; %s %d of the expected %d bytes\n", + progname, fio->iodesc, fio->dir, filename, strerror(errno), + fio->rw, rc, size); + return -1; + } + + return rc; +} + + int fileio_ihex(struct fioparms * fio, char * filename, FILE * f, unsigned char * buf, int size) { @@ -907,6 +950,18 @@ int fileio(int op, char * filename, FILEFMT format, if (rc < 0) return -1; + /* point at the requested memory buffer */ + buf = mem->buf; + if (fio.op == FIO_READ) + size = mem->size; + + if (fio.op == FIO_READ) { + /* 0xff fill unspecified memory */ + for (i=0; i<size; i++) { + buf[i] = 0xff; + } + } + if (strcmp(filename, "-")==0) { if (fio.op == FIO_READ) { fname = "<stdin>"; @@ -919,24 +974,7 @@ int fileio(int op, char * filename, FILEFMT format, } else { fname = filename; - f = fopen(fname, fio.mode); - if (f == NULL) { - fprintf(stderr, "%s: can't open %s file %s: %s\n", - progname, fio.iodesc, fname, strerror(errno)); - return -1; - } - } - - /* point at the requested memory buffer */ - buf = mem->buf; - if (fio.op == FIO_READ) - size = mem->size; - - if (fio.op == FIO_READ) { - /* 0xff fill unspecified memory */ - for (i=0; i<size; i++) { - buf[i] = 0xff; - } + f = NULL; } if (format == FMT_AUTO) { @@ -952,6 +990,16 @@ int fileio(int op, char * filename, FILEFMT format, progname, fio.iodesc, fname, fmtstr(format)); } + if (format != FMT_IMM) { + fname = filename; + f = fopen(fname, fio.mode); + if (f == NULL) { + fprintf(stderr, "%s: can't open %s file %s: %s\n", + progname, fio.iodesc, fname, strerror(errno)); + return -1; + } + } + switch (format) { case FMT_IHEX: rc = fileio_ihex(&fio, fname, f, buf, size); @@ -965,6 +1013,10 @@ int fileio(int op, char * filename, FILEFMT format, rc = fileio_rbin(&fio, fname, f, buf, size); break; + case FMT_IMM: + rc = fileio_imm(&fio, fname, f, buf, size); + break; + default: fprintf(stderr, "%s: invalid %s file format: %d\n", progname, fio.iodesc, format); diff --git a/fileio.h b/fileio.h index 9f020b87..bfc99910 100644 --- a/fileio.h +++ b/fileio.h @@ -26,7 +26,8 @@ typedef enum { FMT_AUTO, FMT_SREC, FMT_IHEX, - FMT_RBIN + FMT_RBIN, + FMT_IMM } FILEFMT; struct fioparms { diff --git a/main.c b/main.c index 30926df8..848eb576 100644 --- a/main.c +++ b/main.c @@ -453,6 +453,7 @@ int main(int argc, char * argv []) case 'i' : filefmt = FMT_IHEX; break; case 'r' : filefmt = FMT_RBIN; break; case 's' : filefmt = FMT_SREC; break; + case 'm' : filefmt = FMT_IMM; break; break; default : fprintf(stderr, "%s: invalid file format \"%s\"\n\n",