From e9bf58c1cf9a9b9bdf0b20a115a2845e63bfd3fb Mon Sep 17 00:00:00 2001 From: joerg_wunsch Date: Sat, 30 Dec 2017 00:05:54 +0000 Subject: [PATCH] Submitted by Jan Egil Ruud patch #9507: Fix UPDI chip erase * jtag3.c (jtag3_chip_erase_updi): New function * jtag3_private.h: More constants git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@1403 81a1dc3b-b13d-400b-aceb-764788c761c2 --- ChangeLog | 7 +++++++ NEWS | 2 ++ jtag3.c | 40 +++++++++++++++++++++++++++++++++++++--- jtag3_private.h | 19 ++++++++++++++++++- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 94557ad0..28f7d23f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-12-30 Joerg Wunsch + + Submitted by Jan Egil Ruud + patch #9507: Fix UPDI chip erase + * jtag3.c (jtag3_chip_erase_updi): New function + * jtag3_private.h: More constants + 2017-12-30 Joerg Wunsch Submitted by Jan Egil Ruud diff --git a/NEWS b/NEWS index a36cad36..d39268e9 100644 --- a/NEWS +++ b/NEWS @@ -33,6 +33,8 @@ Current: * Patches: patch #9482: Add support for UPDI and AVR8X + patch #9508: Add PowerDebugger and XPlained Mini in UPDI mode + patch #9507: Fix UPDI chip erase * Internals: diff --git a/jtag3.c b/jtag3.c index 4cda747c..57d87b4f 100644 --- a/jtag3.c +++ b/jtag3.c @@ -840,8 +840,14 @@ int jtag3_recv(PROGRAMMER * pgm, unsigned char **msg) { c = (*resp)[1]; if ((c & RSP3_STATUS_MASK) != RSP3_OK) { - avrdude_message(MSG_INFO, "%s: bad response to %s command: 0x%02x\n", - progname, descr, c); + if ((c == RSP3_FAILED) && ((*resp)[3] == RSP3_FAIL_OCD_LOCKED)) { + avrdude_message(MSG_INFO, + "%s: Device is locked! Chip erase required to unlock.\n", + progname); + } else { + avrdude_message(MSG_INFO, "%s: bad response to %s command: 0x%02x\n", + progname, descr, c); + } free(*resp); resp = 0; return -1; @@ -895,6 +901,34 @@ static int jtag3_chip_erase(PROGRAMMER * pgm, AVRPART * p) return 0; } +/* + * UPDI 'chip erase' -> 'enter progmode' with chip erase key + */ +static int jtag3_chip_erase_updi(PROGRAMMER * pgm, AVRPART * p) +{ + unsigned char buf[8], *resp; + + buf[0] = 1; /* Enable */ + if (jtag3_setparm(pgm, SCOPE_AVR, SET_GET_CTXT_OPTIONS, PARM3_OPT_CHIP_ERASE_TO_ENTER, buf, 1) < 0) + return -1; + + buf[0] = SCOPE_AVR; + buf[1] = CMD3_ENTER_PROGMODE; + buf[2] = 0; + + if (jtag3_command(pgm, buf, 3, &resp, "enter progmode") < 0) + return -1; + PDATA(pgm)->prog_enabled = 1; + + buf[0] = 0; /* Disable */ + if (jtag3_setparm(pgm, SCOPE_AVR, SET_GET_CTXT_OPTIONS, PARM3_OPT_CHIP_ERASE_TO_ENTER, buf, 1) < 0) + return -1; + + free(resp); + return 0; +} + + /* * There is no chip erase functionality in debugWire mode. */ @@ -2378,7 +2412,7 @@ void jtag3_updi_initpgm(PROGRAMMER * pgm) pgm->enable = jtag3_enable; pgm->disable = jtag3_disable; pgm->program_enable = jtag3_program_enable_dummy; - pgm->chip_erase = jtag3_chip_erase; + pgm->chip_erase = jtag3_chip_erase_updi; pgm->open = jtag3_open_updi; pgm->close = jtag3_close; pgm->read_byte = jtag3_read_byte; diff --git a/jtag3_private.h b/jtag3_private.h index 80ffb2ab..7a2374f0 100644 --- a/jtag3_private.h +++ b/jtag3_private.h @@ -144,6 +144,7 @@ # define RSP3_FAIL_WRONG_MODE 0x32 /* progmode vs. non-prog */ # define RSP3_FAIL_UNSUPP_MEMORY 0x34 /* unsupported memory type */ # define RSP3_FAIL_WRONG_LENGTH 0x35 /* wrong lenth for mem access */ +# define RSP3_FAIL_OCD_LOCKED 0x44 /* device is locked */ # define RSP3_FAIL_NOT_UNDERSTOOD 0x91 /* ICE events */ @@ -168,6 +169,15 @@ #define MTYPE_PRODSIG 0xc6 /* xmega production signature - undocumented in AVR067 */ #define MTYPE_SIB 0xD3 /* AVR8X System Information Block */ +/* + * SET and GET context definitions + */ +#define SET_GET_CTXT_CONFIG 0x00 /* Configuration */ +#define SET_GET_CTXT_PHYSICAL 0x01 /* Physical interface related */ +#define SET_GET_CTXT_DEVICE 0x02 /* Device specific settings */ +#define SET_GET_CTXT_OPTIONS 0x03 /* Option-related settings */ +#define SET_GET_CTXT_SESSION 0x04 /* Session-related settings */ + /* * Parameters are divided into sections, where the section number * precedes each parameter address. There are distinct parameter @@ -209,12 +219,19 @@ * before/after, bits before/after), 4 * bytes */ +/* + * Physical context parameters + */ #define PARM3_CLK_MEGA_PROG 0x20 /* section 1, AVR scope, 2 bytes (kHz) */ #define PARM3_CLK_MEGA_DEBUG 0x21 /* section 1, AVR scope, 2 bytes (kHz) */ #define PARM3_CLK_XMEGA_JTAG 0x30 /* section 1, AVR scope, 2 bytes (kHz) */ #define PARM3_CLK_XMEGA_PDI 0x31 /* section 1, AVR scope, 2 bytes (kHz) */ - +/* + * Options context parameters + */ +#define PARM3_OPT_12V_UPDI_ENABLE 0x06 +#define PARM3_OPT_CHIP_ERASE_TO_ENTER 0x07 /* Xmega erase memory types, for CMND_XMEGA_ERASE */ #define XMEGA_ERASE_CHIP 0x00