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:
parent
180c000565
commit
fca08c90ab
|
@ -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
89
jtag3.c
|
@ -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);
|
free(resp);
|
||||||
|
|
||||||
serial_recv_timeout = otimeout;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue