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/avrdude@356 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
bdean 2003-08-29 23:17:32 +00:00
parent cc1bb36860
commit 776104ea0c
2 changed files with 150 additions and 78 deletions

View File

@ -30,6 +30,7 @@
.Fl p Ar partno .Fl p Ar partno
.Op Fl c Ar programmer-id .Op Fl c Ar programmer-id
.Op Fl C Ar config-file .Op Fl C Ar config-file
.Op Fl D
.Op Fl e .Op Fl e
.Oo Fl E Ar exitspec Ns .Oo Fl E Ar exitspec Ns
.Op \&, Ns Ar exitspec .Op \&, Ns Ar exitspec
@ -43,7 +44,7 @@
.Op Fl P Ar port .Op Fl P Ar port
.Op Fl q .Op Fl q
.Op Fl t .Op Fl t
.Op Fl U Ar memop .Op Fl U Ar memtype:op:filename:filefmt
.Op Fl v .Op Fl v
.Op Fl V .Op Fl V
.Op Fl y .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 the next version). See the config file, located at
.Pa ${PREFIX}/etc/avrdude.conf , .Pa ${PREFIX}/etc/avrdude.conf ,
which contains a description of the format. 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 .It Fl e
Causes a chip erase to be executed. This will reset the contents of the Causes a chip erase to be executed. This will reset the contents of the
flash ROM and EEPROM to the value flash ROM and EEPROM to the value
@ -244,8 +258,10 @@ Multiple
.Ar exitspec .Ar exitspec
arguments can be separated with commas. arguments can be separated with commas.
.It Fl f Ar format .It Fl f Ar format
This option specifies the file format for the input or output files (Deprecated, use
to be processed. .Fl U
instead.) This option specifies the file format for the input or
output files to be processed.
.Ar Format .Ar Format
can be one of: can be one of:
.Bl -tag -width sss .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 but is otherwise operating normally, this options is provided to
override the check. override the check.
.It Fl i Ar filename .It Fl i Ar filename
Specifies the input file to be programmed into the MCU. Can be specified (Deprecated, use
as .Fl U
instead.) Specifies the input file to be programmed into the MCU.
Can be specified as
.Ql \&- .Ql \&-
to use to use
.Em stdin .Em stdin
as the input. as the input.
.It Fl I Ar data .It Fl I Ar data
Same as specifying (Deprecated, use
.Fl U
instead.) Same as specifying
.Fl i .Fl i
and and
.Fl f Ar m .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 programming single byte memories such as fuse bytes without having to
use single byte files or enter interactive terminal mode. use single byte files or enter interactive terminal mode.
.It Fl m Ar memtype .It Fl m Ar memtype
Specifies which program area of the MCU to read or write; allowable (Deprecated, use
values depend on the MCU being programmed, but most support at least .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 .Em eeprom
for the EEPROM, and for the EEPROM, and
.Em flash .Em flash
@ -309,8 +332,11 @@ No-write - disables actually writing data to the MCU (useful for debugging
.Nm avrdude .Nm avrdude
). ).
.It Fl o Ar filename .It Fl o Ar filename
Specifies the name of the output file to write, and causes the respective (Deprecated, use
memory area to be read from the MCU. Can be specified as .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 \&- .Ql \&-
to write to to write to
.Em stdout . .Em stdout .

182
main.c
View File

@ -100,13 +100,14 @@ void usage(void)
" -p <partno> Required. Specify AVR device.\n" " -p <partno> Required. Specify AVR device.\n"
" -C <config-file> Specify location of configuration file.\n" " -C <config-file> Specify location of configuration file.\n"
" -c <programmer> Specify programmer type.\n" " -c <programmer> Specify programmer type.\n"
" -D Disable auto erase for flash memory\n"
" -P <port> Specify connection port.\n" " -P <port> Specify connection port.\n"
" -F Override invalid signature check.\n" " -F Override invalid signature check.\n"
" -e Perform a chip erase.\n" " -e Perform a chip erase.\n"
" -m <memtype> Memory type to operate on.\n" " -m <memtype> (deprecated) Memory type to operate on.\n"
" -i <filename> Write device. Specify an input file.\n" " -i <filename> (deprecated) Write device. Specify an input file.\n"
" -o <filename> Read device. Specify an output file.\n" " -o <filename> (deprecated) Read device. Specify an output file.\n"
" -f <format> Specify the file format.\n" " -f <format> (deprecated) Specify the file format.\n"
" -U <memtype>:r|w|v:<filename>[:format]\n" " -U <memtype>:r|w|v:<filename>[:format]\n"
" Alternate memory operation specification.\n" " Alternate memory operation specification.\n"
" Multiple -U options are allowed, each request\n" " Multiple -U options are allowed, each request\n"
@ -722,12 +723,15 @@ int main(int argc, char * argv [])
struct stat sb; struct stat sb;
UPDATE * upd; UPDATE * upd;
LNODEID * ln; LNODEID * ln;
int deprecated = 0;
/* options / operating mode variables */ /* options / operating mode variables */
char * memtype; /* "flash", "eeprom", etc */ char * memtype; /* "flash", "eeprom", etc */
int doread; /* 1=reading AVR */ int doread; /* 1=reading AVR */
int dowrite; /* 1=writing AVR */ int dowrite; /* 1=writing AVR */
int erase; /* 1=erase chip, 0=don't */ 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 * outputf; /* output file name */
char * inputf; /* input file name */ char * inputf; /* input file name */
int ovsigck; /* 1=override sig check, 0=don't */ int ovsigck; /* 1=override sig check, 0=don't */
@ -777,6 +781,7 @@ int main(int argc, char * argv [])
dowrite = 0; dowrite = 0;
memtype = "flash"; memtype = "flash";
erase = 0; erase = 0;
auto_erase = 1;
p = NULL; p = NULL;
ovsigck = 0; ovsigck = 0;
terminal = 0; terminal = 0;
@ -836,7 +841,7 @@ int main(int argc, char * argv [])
/* /*
* process command line arguments * 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) { switch (ch) {
case 'c': /* programmer id */ case 'c': /* programmer id */
@ -848,75 +853,21 @@ int main(int argc, char * argv [])
sys_config[PATH_MAX-1] = 0; sys_config[PATH_MAX-1] = 0;
break; break;
case 'm': /* select memory type to operate on */ case 'D': /* disable auto erase */
if ((strcasecmp(optarg,"e")==0)||(strcasecmp(optarg,"eeprom")==0)) { auto_erase = 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;
break; break;
case 'e': /* perform a chip erase */ case 'e': /* perform a chip erase */
erase = 1; erase = 1;
auto_erase = 0;
break; break;
case 'E': case 'E':
exitspecs = optarg; exitspecs = optarg;
break; 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 */ case 'f': /* specify file format */
deprecated = 1;
if (strlen(optarg) != 1) { if (strlen(optarg) != 1) {
fprintf(stderr, "%s: invalid file format \"%s\"\n", fprintf(stderr, "%s: invalid file format \"%s\"\n",
progname, optarg); progname, optarg);
@ -938,6 +889,77 @@ int main(int argc, char * argv [])
} }
break; 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 */ case 't': /* enter terminal mode */
if (!((inputf == NULL)||(outputf == NULL))) { if (!((inputf == NULL)||(outputf == NULL))) {
fprintf(stderr, fprintf(stderr,
@ -949,10 +971,6 @@ int main(int argc, char * argv [])
terminal = 1; terminal = 1;
break; break;
case 'P':
port = optarg;
break;
case 'U': case 'U':
upd = parse_op(optarg); upd = parse_op(optarg);
if (upd == NULL) { 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 (quell_progress == 0) {
if (isatty (STDERR_FILENO)) if (isatty (STDERR_FILENO))
update_progress = update_progress_tty; 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) { if (erase) {
/* /*
* erase the chip's flash and eeprom memories, this is required * 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); fprintf(stderr, "%s: erasing chip\n", progname);
pgm->chip_erase(pgm, p); pgm->chip_erase(pgm, p);
fprintf(stderr, "%s: done.\n", progname);
} }
else if (set_cycles == -1) { else if (set_cycles == -1) {
/* /*