From 1188a0313b696376b710a3327df6e2d85cefea03 Mon Sep 17 00:00:00 2001 From: "Brian S. Dean" Date: Fri, 29 Aug 2003 23:17:32 +0000 Subject: [PATCH] Perform an auto erase before programming if the flash memory is anywhere specified to be written by any of the -U requests. To remain backward compatible with previous versions, disable this feature if any of the old-style memory specification operations are specified (-i, -o). Implement the -D option to explicitly disable the auto erase default. Deprecate the old-style memory specification options (-f, -i, -I, -m, and -o) in favor of the new -U option which allows one to operate on multiple memories on a single command line. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk@356 81a1dc3b-b13d-400b-aceb-764788c761c2 --- avrdude/avrdude.1 | 46 +++++++++--- avrdude/main.c | 182 +++++++++++++++++++++++++++++----------------- 2 files changed, 150 insertions(+), 78 deletions(-) diff --git a/avrdude/avrdude.1 b/avrdude/avrdude.1 index ac4820bf..0b5ffa12 100644 --- a/avrdude/avrdude.1 +++ b/avrdude/avrdude.1 @@ -30,6 +30,7 @@ .Fl p Ar partno .Op Fl c Ar programmer-id .Op Fl C Ar config-file +.Op Fl D .Op Fl e .Oo Fl E Ar exitspec Ns .Op \&, Ns Ar exitspec @@ -43,7 +44,7 @@ .Op Fl P Ar port .Op Fl q .Op Fl t -.Op Fl U Ar memop +.Op Fl U Ar memtype:op:filename:filefmt .Op Fl v .Op Fl V .Op Fl y @@ -180,6 +181,19 @@ submit a patch back to the author so that it can be incorporated for the next version). See the config file, located at .Pa ${PREFIX}/etc/avrdude.conf , which contains a description of the format. +.It Fl D +Disable auto erase for flash. When the +.Fl U +option with flash memory is specified, +.Nm +will perform a chip erase before starting any of the programming +operations, since it generally is a mistake to program the flash +without performing an erase first. This option disables that. +However, to remain backward compatible, the +.Fl i , +and +.Fl m +options automatically disable the auto erase feature. .It Fl e Causes a chip erase to be executed. This will reset the contents of the flash ROM and EEPROM to the value @@ -244,8 +258,10 @@ Multiple .Ar exitspec arguments can be separated with commas. .It Fl f Ar format -This option specifies the file format for the input or output files -to be processed. +(Deprecated, use +.Fl U +instead.) This option specifies the file format for the input or +output files to be processed. .Ar Format can be one of: .Bl -tag -width sss @@ -276,14 +292,18 @@ that a device has a broken (erased or overwritten) device signature but is otherwise operating normally, this options is provided to override the check. .It Fl i Ar filename -Specifies the input file to be programmed into the MCU. Can be specified -as +(Deprecated, use +.Fl U +instead.) Specifies the input file to be programmed into the MCU. +Can be specified as .Ql \&- to use .Em stdin as the input. .It Fl I Ar data -Same as specifying +(Deprecated, use +.Fl U +instead.) Same as specifying .Fl i and .Fl f Ar m @@ -292,8 +312,11 @@ where the filename field is used as the data itself. Useful for programming single byte memories such as fuse bytes without having to use single byte files or enter interactive terminal mode. .It Fl m Ar memtype -Specifies which program area of the MCU to read or write; allowable -values depend on the MCU being programmed, but most support at least +(Deprecated, use +.Fl U +instead.) Specifies which program area of the MCU to read or write; +allowable values depend on the MCU being programmed, but most support +at least .Em eeprom for the EEPROM, and .Em flash @@ -309,8 +332,11 @@ No-write - disables actually writing data to the MCU (useful for debugging .Nm avrdude ). .It Fl o Ar filename -Specifies the name of the output file to write, and causes the respective -memory area to be read from the MCU. Can be specified as +(Deprecated, use +.Fl U +instead.) Specifies the name of the output file to write, and causes +the respective memory area to be read from the MCU. Can be specified +as .Ql \&- to write to .Em stdout . diff --git a/avrdude/main.c b/avrdude/main.c index dd2b688d..e2c1e27b 100644 --- a/avrdude/main.c +++ b/avrdude/main.c @@ -100,13 +100,14 @@ void usage(void) " -p Required. Specify AVR device.\n" " -C Specify location of configuration file.\n" " -c Specify programmer type.\n" + " -D Disable auto erase for flash memory\n" " -P Specify connection port.\n" " -F Override invalid signature check.\n" " -e Perform a chip erase.\n" - " -m Memory type to operate on.\n" - " -i Write device. Specify an input file.\n" - " -o Read device. Specify an output file.\n" - " -f Specify the file format.\n" + " -m (deprecated) Memory type to operate on.\n" + " -i (deprecated) Write device. Specify an input file.\n" + " -o (deprecated) Read device. Specify an output file.\n" + " -f (deprecated) Specify the file format.\n" " -U :r|w|v:[:format]\n" " Alternate memory operation specification.\n" " Multiple -U options are allowed, each request\n" @@ -722,12 +723,15 @@ int main(int argc, char * argv []) struct stat sb; UPDATE * upd; LNODEID * ln; + int deprecated = 0; /* options / operating mode variables */ char * memtype; /* "flash", "eeprom", etc */ int doread; /* 1=reading AVR */ int dowrite; /* 1=writing AVR */ int erase; /* 1=erase chip, 0=don't */ + int auto_erase; /* 0=never erase unless explicity told to do + so, 1=erase if we are going to program flash */ char * outputf; /* output file name */ char * inputf; /* input file name */ int ovsigck; /* 1=override sig check, 0=don't */ @@ -777,6 +781,7 @@ int main(int argc, char * argv []) dowrite = 0; memtype = "flash"; erase = 0; + auto_erase = 1; p = NULL; ovsigck = 0; terminal = 0; @@ -836,7 +841,7 @@ int main(int argc, char * argv []) /* * process command line arguments */ - while ((ch = getopt(argc,argv,"?c:C:eE:f:Fi:I:m:no:p:P:qtvU:VyY:")) != -1) { + while ((ch = getopt(argc,argv,"?c:C:DeE:f:Fi:I:m:no:p:P:qtU:vVyY:")) != -1) { switch (ch) { case 'c': /* programmer id */ @@ -848,75 +853,21 @@ int main(int argc, char * argv []) sys_config[PATH_MAX-1] = 0; break; - case 'm': /* select memory type to operate on */ - if ((strcasecmp(optarg,"e")==0)||(strcasecmp(optarg,"eeprom")==0)) { - memtype = "eeprom"; - } - else if ((strcasecmp(optarg,"f")==0)|| - (strcasecmp(optarg,"flash")==0)) { - memtype = "flash"; - } - else { - memtype = optarg; - } - readorwrite = 1; - break; - - case 'F': /* override invalid signature check */ - ovsigck = 1; - break; - - case 'n': - nowrite = 1; - break; - - case 'o': /* specify output file */ - if (inputf || terminal) { - fprintf(stderr,"%s: -i, -o, and -t are incompatible\n\n", progname); - return 1; - } - doread = 1; - outputf = optarg; - if (filefmt == FMT_AUTO) - filefmt = FMT_RBIN; - break; - - case 'p' : /* specify AVR part */ - partdesc = optarg; - break; - - case 'q' : /* Quell progress output */ - quell_progress = 1; + case 'D': /* disable auto erase */ + auto_erase = 0; break; case 'e': /* perform a chip erase */ erase = 1; + auto_erase = 0; break; case 'E': exitspecs = optarg; break; - case 'i': /* specify input file */ - if (outputf || terminal) { - fprintf(stderr,"%s: -o, -i, and -t are incompatible\n\n", progname); - return 1; - } - dowrite = 1; - inputf = optarg; - break; - - case 'I': /* specify input file and assume 'immediate mode' */ - if (outputf || terminal) { - fprintf(stderr,"%s: -o, -I, and -t are incompatible\n\n", progname); - return 1; - } - dowrite = 1; - inputf = optarg; - filefmt = FMT_IMM; - break; - case 'f': /* specify file format */ + deprecated = 1; if (strlen(optarg) != 1) { fprintf(stderr, "%s: invalid file format \"%s\"\n", progname, optarg); @@ -938,6 +889,77 @@ int main(int argc, char * argv []) } break; + case 'F': /* override invalid signature check */ + ovsigck = 1; + break; + + case 'i': /* specify input file */ + deprecated = 1; + auto_erase = 0; + if (outputf || terminal) { + fprintf(stderr,"%s: -o, -i, and -t are incompatible\n\n", progname); + return 1; + } + dowrite = 1; + inputf = optarg; + break; + + case 'I': /* specify input file and assume 'immediate mode' */ + deprecated = 1; + auto_erase = 0; + if (outputf || terminal) { + fprintf(stderr,"%s: -o, -I, and -t are incompatible\n\n", progname); + return 1; + } + dowrite = 1; + inputf = optarg; + filefmt = FMT_IMM; + break; + + case 'm': /* select memory type to operate on */ + deprecated = 1; + if ((strcasecmp(optarg,"e")==0)||(strcasecmp(optarg,"eeprom")==0)) { + memtype = "eeprom"; + } + else if ((strcasecmp(optarg,"f")==0)|| + (strcasecmp(optarg,"flash")==0)) { + memtype = "flash"; + } + else { + memtype = optarg; + } + readorwrite = 1; + break; + + case 'n': + nowrite = 1; + break; + + case 'o': /* specify output file */ + deprecated = 1; + auto_erase = 0; + if (inputf || terminal) { + fprintf(stderr,"%s: -i, -o, and -t are incompatible\n\n", progname); + return 1; + } + doread = 1; + outputf = optarg; + if (filefmt == FMT_AUTO) + filefmt = FMT_RBIN; + break; + + case 'p' : /* specify AVR part */ + partdesc = optarg; + break; + + case 'P': + port = optarg; + break; + + case 'q' : /* Quell progress output */ + quell_progress = 1; + break; + case 't': /* enter terminal mode */ if (!((inputf == NULL)||(outputf == NULL))) { fprintf(stderr, @@ -949,10 +971,6 @@ int main(int argc, char * argv []) terminal = 1; break; - case 'P': - port = optarg; - break; - case 'U': upd = parse_op(optarg); if (upd == NULL) { @@ -1005,6 +1023,14 @@ int main(int argc, char * argv []) } + if (deprecated) { + fprintf(stderr, + "\n%s: WARNING: the -f, -i, -I, -o, and -m options are deprecated.\n" + "%sPlease use the -U option instead.\n", + progname, progbuf); + } + + if (quell_progress == 0) { if (isatty (STDERR_FILENO)) update_progress = update_progress_tty; @@ -1309,6 +1335,27 @@ int main(int argc, char * argv []) } } + if ((erase == 0) && (auto_erase == 1)) { + AVRMEM * m; + + for (ln=lfirst(updates); ln; ln=lnext(ln)) { + upd = ldata(ln); + m = avr_locate_mem(p, upd->memtype); + if (m == NULL) + continue; + if ((strcasecmp(m->desc, "flash") == 0) && (upd->op == DEVICE_WRITE)) { + erase = 1; + fprintf(stderr, + "%s: NOTE: FLASH memory has been specified, an erase cycle will be performed\n" + "%sTo disable this feature, specify the -D option.\n", + progname, progbuf); + break; + } + } + } + + + if (erase) { /* * erase the chip's flash and eeprom memories, this is required @@ -1316,7 +1363,6 @@ int main(int argc, char * argv []) */ fprintf(stderr, "%s: erasing chip\n", progname); pgm->chip_erase(pgm, p); - fprintf(stderr, "%s: done.\n", progname); } else if (set_cycles == -1) { /*