Implement enough state in cmd_dump so that if it is called with no
arguments, it successively dumps the next chunk of data of the same previously specified length. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@39 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
4265bfa150
commit
7dc244ac12
82
term.c
82
term.c
|
@ -197,42 +197,54 @@ int cmd_dump ( int fd, struct avrpart * p, int argc, char * argv[] )
|
||||||
{
|
{
|
||||||
char * e;
|
char * e;
|
||||||
int i, j;
|
int i, j;
|
||||||
int len, maxsize;
|
unsigned short daddr;
|
||||||
AVRMEM memtype;
|
|
||||||
unsigned short addr, daddr;
|
|
||||||
char * buf;
|
char * buf;
|
||||||
|
int maxsize;
|
||||||
|
static AVRMEM memtype=AVR_FLASH;
|
||||||
|
static unsigned short addr=0;
|
||||||
|
static int len=64;
|
||||||
|
|
||||||
if (argc != 4) {
|
if (argc == 1) {
|
||||||
fprintf(stderr, "Usage: dump flash|eeprom <addr> <len>\n");
|
addr += len;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(argv[1],"flash")==0) {
|
|
||||||
memtype = AVR_FLASH;
|
|
||||||
maxsize = p->flash_size;
|
|
||||||
}
|
|
||||||
else if (strcmp(argv[1],"eeprom")==0) {
|
|
||||||
memtype = AVR_EEPROM;
|
|
||||||
maxsize = p->eeprom_size;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "%s (dump): invalid memory type \"%s\"\n",
|
if (argc != 4) {
|
||||||
progname, argv[1]);
|
fprintf(stderr, "Usage: dump flash|eeprom <addr> <len>\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(argv[1],"flash")==0) {
|
||||||
|
memtype = AVR_FLASH;
|
||||||
|
}
|
||||||
|
else if (strcmp(argv[1],"eeprom")==0) {
|
||||||
|
memtype = AVR_EEPROM;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "%s (dump): invalid memory type \"%s\"\n",
|
||||||
|
progname, argv[1]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = strtoul(argv[2], &e, 0);
|
||||||
|
if (*e || (e == argv[2])) {
|
||||||
|
fprintf(stderr, "%s (dump): can't parse address \"%s\"\n",
|
||||||
|
progname, argv[2]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = strtol(argv[3], &e, 0);
|
||||||
|
if (*e || (e == argv[3])) {
|
||||||
|
fprintf(stderr, "%s (dump): can't parse length \"%s\"\n",
|
||||||
|
progname, argv[3]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = strtoul(argv[2], &e, 0);
|
switch (memtype) {
|
||||||
if (*e || (e == argv[2])) {
|
case AVR_FLASH : maxsize = p->flash_size; break;
|
||||||
fprintf(stderr, "%s (dump): can't parse address \"%s\"\n",
|
case AVR_EEPROM : maxsize = p->eeprom_size; break;
|
||||||
progname, argv[2]);
|
default : return -1; /* this can't happen, but is silences gcc
|
||||||
return -1;
|
warnings */
|
||||||
}
|
|
||||||
|
|
||||||
len = strtol(argv[3], &e, 0);
|
|
||||||
if (*e || (e == argv[3])) {
|
|
||||||
fprintf(stderr, "%s (dump): can't parse length \"%s\"\n",
|
|
||||||
progname, argv[3]);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr > maxsize) {
|
if (addr > maxsize) {
|
||||||
|
@ -242,13 +254,9 @@ int cmd_dump ( int fd, struct avrpart * p, int argc, char * argv[] )
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((addr + len) > maxsize) {
|
/* trim len if nessary to not read past the end of memory */
|
||||||
fprintf(stderr,
|
if ((addr + len) > maxsize)
|
||||||
"%s (dump): selected address and length exceed "
|
len = maxsize - addr;
|
||||||
"range for %s memory\n",
|
|
||||||
progname, avr_memtstr(memtype));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = malloc(len);
|
buf = malloc(len);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
|
|
Loading…
Reference in New Issue