Implement page erase functionality.

git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@1114 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
Joerg Wunsch 2012-11-29 16:20:48 +00:00
parent 457a35eb73
commit 3d50edc3a7
3 changed files with 20 additions and 71 deletions

View File

@ -2,6 +2,7 @@
* avrdude.conf.in: Remove "has_jtag" from Xmega A4 and D4 * avrdude.conf.in: Remove "has_jtag" from Xmega A4 and D4
devices, as they only have PDI. devices, as they only have PDI.
* jtag3.c (jtag3_page_erase): Actually implement this.
2012-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de> 2012-11-29 Joerg Wunsch <j.gnu@uriah.heep.sax.de>

89
jtag3.c
View File

@ -278,6 +278,10 @@ static void jtag3_prmsg(PROGRAMMER * pgm, unsigned char * data, size_t len)
case RSP3_FAIL_WRONG_MODE: case RSP3_FAIL_WRONG_MODE:
strcpy(reason, "wrong (programming) mode"); strcpy(reason, "wrong (programming) mode");
break; break;
case RSP3_FAIL_PDI:
strcpy(reason, "PDI failure");
break;
} }
fprintf(stderr, ", reason: %s\n", reason); fprintf(stderr, ", reason: %s\n", reason);
} }
@ -1164,11 +1168,7 @@ void jtag3_close(PROGRAMMER * pgm)
static int jtag3_page_erase(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, static int jtag3_page_erase(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
unsigned int addr) unsigned int addr)
{ {
#if 0 unsigned char cmd[8], *resp;
unsigned char cmd[6];
unsigned char *resp;
int status, tries;
long otimeout = serial_recv_timeout;
if (verbose >= 2) if (verbose >= 2)
fprintf(stderr, "%s: jtag3_page_erase(.., %s, 0x%x)\n", fprintf(stderr, "%s: jtag3_page_erase(.., %s, 0x%x)\n",
@ -1179,88 +1179,35 @@ static int jtag3_page_erase(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
progname); progname);
return -1; return -1;
} }
if ((pgm->flag & PGM_FL_IS_DW)) {
fprintf(stderr, "%s: jtag3_page_erase: not applicable to debugWIRE\n",
progname);
return -1;
}
if (jtag3_program_enable(pgm) < 0) if (jtag3_program_enable(pgm) < 0)
return -1; return -1;
cmd[0] = CMND_XMEGA_ERASE; cmd[0] = SCOPE_AVR;
cmd[1] = CMD3_ERASE_MEMORY;
cmd[2] = 0;
if (strcmp(m->desc, "flash") == 0) { if (strcmp(m->desc, "flash") == 0) {
if (jtag3_memtype(pgm, p, addr) == MTYPE_FLASH) if (jtag3_memtype(pgm, p, addr) == MTYPE_FLASH)
cmd[1] = XMEGA_ERASE_APP_PAGE; cmd[3] = XMEGA_ERASE_APP_PAGE;
else else
cmd[1] = XMEGA_ERASE_BOOT_PAGE; cmd[3] = XMEGA_ERASE_BOOT_PAGE;
} else if (strcmp(m->desc, "eeprom") == 0) { } else if (strcmp(m->desc, "eeprom") == 0) {
cmd[1] = XMEGA_ERASE_EEPROM_PAGE; cmd[3] = XMEGA_ERASE_EEPROM_PAGE;
} else if ( ( strcmp(m->desc, "usersig") == 0 ) ) { } else if ( ( strcmp(m->desc, "usersig") == 0 ) ) {
cmd[1] = XMEGA_ERASE_USERSIG; cmd[3] = XMEGA_ERASE_USERSIG;
} else if ( ( strcmp(m->desc, "boot") == 0 ) ) { } else if ( ( strcmp(m->desc, "boot") == 0 ) ) {
cmd[1] = XMEGA_ERASE_BOOT_PAGE; cmd[3] = XMEGA_ERASE_BOOT_PAGE;
} else { } else {
cmd[1] = XMEGA_ERASE_APP_PAGE; cmd[3] = XMEGA_ERASE_APP_PAGE;
} }
serial_recv_timeout = 100;
/* u32_to_b4(cmd + 4, addr + m->offset);
* Don't use jtag3_memaddr() here. While with all other
* commands, firmware 7+ doesn't require the NVM offsets being
* applied, the erase page commands make an exception, and do
* require the NVM offsets as part of the (page) address.
*/
u32_to_b4(cmd + 2, addr + m->offset);
tries = 0; if (jtag3_command(pgm, cmd, 8, &resp, "page erase") < 0)
retry:
if (verbose >= 2)
fprintf(stderr, "%s: jtag3_page_erase(): "
"Sending xmega erase command: ",
progname);
jtag3_send(pgm, cmd, sizeof cmd);
status = jtag3_recv(pgm, &resp);
if (status <= 0) {
if (verbose >= 2)
putc('\n', stderr);
if (verbose >= 1)
fprintf(stderr,
"%s: jtag3_page_erase(): "
"timeout/error communicating with programmer (status %d)\n",
progname, status);
if (tries++ < 4) {
serial_recv_timeout *= 2;
goto retry;
}
fprintf(stderr,
"%s: jtag3_page_erase(): fatal timeout/"
"error communicating with programmer (status %d)\n",
progname, status);
serial_recv_timeout = otimeout;
return -1; return -1;
}
if (verbose >= 3) {
putc('\n', stderr);
jtag3_prmsg(pgm, resp, status);
} else if (verbose == 2)
fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[1], status);
if (resp[1] != RSP_OK) {
fprintf(stderr,
"%s: jtag3_page_erase(): "
"bad response to xmega erase command: %s\n",
progname, jtag3_get_rc(resp[1]));
free(resp);
serial_recv_timeout = otimeout;
return -1;
}
free(resp);
serial_recv_timeout = otimeout; free(resp);
#endif
return 0; return 0;
} }

View File

@ -134,6 +134,7 @@
#define RSP3_STATUS_MASK 0xE0 #define RSP3_STATUS_MASK 0xE0
/* possible failure codes that could be appended to RSP3_FAILED: */ /* possible failure codes that could be appended to RSP3_FAILED: */
# define RSP3_FAIL_PDI 0x1B
# define RSP3_FAIL_NO_ANSWER 0x20 # define RSP3_FAIL_NO_ANSWER 0x20
# define RSP3_FAIL_NO_TARGET_POWER 0x22 # define RSP3_FAIL_NO_TARGET_POWER 0x22
# define RSP3_FAIL_WRONG_MODE 0x32 /* progmode vs. non-prog */ # define RSP3_FAIL_WRONG_MODE 0x32 /* progmode vs. non-prog */