When failing to start in ISP mode, try debugWire instead. This

requires the user to eventually restart AVRDUE from scratch then.

jtagmkII_reset() had to get a second parameter in order to record
the reset mode.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@647 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
Joerg Wunsch 2006-09-06 22:37:30 +00:00
parent ffc20c8df7
commit 8d207dbaf1
2 changed files with 47 additions and 7 deletions

View File

@ -1,3 +1,9 @@
2006-09-07 Joerg Wunsch <j@uriah.heep.sax.de>
* jtagmkII.c: When failing to start in ISP mode, try
debugWire instead. This requires the user to eventually
restart AVRDUE from scratch then.
2006-09-06 Joerg Wunsch <j@uriah.heep.sax.de> 2006-09-06 Joerg Wunsch <j@uriah.heep.sax.de>
Add support for the JTAG ICE mkII in ISP mode. Add support for the JTAG ICE mkII in ISP mode.

View File

@ -41,6 +41,7 @@
#include "avr.h" #include "avr.h"
#include "crc16.h" #include "crc16.h"
#include "pgm.h" #include "pgm.h"
#include "jtagmkII.h"
#include "jtagmkII_private.h" #include "jtagmkII_private.h"
#include "serial.h" #include "serial.h"
#include "usbdevs.h" #include "usbdevs.h"
@ -88,6 +89,7 @@ static int jtagmkII_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
unsigned long addr, unsigned char * value); unsigned long addr, unsigned char * value);
static int jtagmkII_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, static int jtagmkII_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
unsigned long addr, unsigned char data); unsigned long addr, unsigned char data);
static int jtagmkII_reset(PROGRAMMER * pgm, unsigned char flags);
static int jtagmkII_set_sck_period(PROGRAMMER * pgm, double v); static int jtagmkII_set_sck_period(PROGRAMMER * pgm, double v);
static int jtagmkII_setparm(PROGRAMMER * pgm, unsigned char parm, static int jtagmkII_setparm(PROGRAMMER * pgm, unsigned char parm,
unsigned char * value); unsigned char * value);
@ -641,8 +643,39 @@ int jtagmkII_getsync(PROGRAMMER * pgm, int mode) {
/* Turn the ICE into JTAG or ISP mode as requested. */ /* Turn the ICE into JTAG or ISP mode as requested. */
buf[0] = mode; buf[0] = mode;
if (jtagmkII_setparm(pgm, PAR_EMULATOR_MODE, buf) < 0) {
if (mode == EMULATOR_MODE_SPI) {
fprintf(stderr,
"%s: jtagmkII_getsync(): "
"ISP activation failed, trying debugWire\n",
progname);
buf[0] = EMULATOR_MODE_DEBUGWIRE;
if (jtagmkII_setparm(pgm, PAR_EMULATOR_MODE, buf) < 0) if (jtagmkII_setparm(pgm, PAR_EMULATOR_MODE, buf) < 0)
return -1; return -1;
else {
/*
* We are supposed to send a CMND_RESET with the
* MONCOM_DISABLE flag set right now, and then
* restart from scratch.
*
* As this will make the ICE sign off from USB, so
* we risk losing our USB connection, it's easier
* to instruct the user to restart AVRDUDE rather
* than trying to cope with all this inside the
* program.
*/
(void)jtagmkII_reset(pgm, 0x04);
jtagmkII_close(pgm);
fprintf(stderr,
"%s: Target prepared for ISP, signed off.\n"
"%s: Please restart %s without power-cycling the target.\n",
progname, progname, progname);
exit(0);
}
} else {
return -1;
}
}
/* GET SYNC forces the target into STOPPED mode */ /* GET SYNC forces the target into STOPPED mode */
buf[0] = CMND_GET_SYNC; buf[0] = CMND_GET_SYNC;
@ -801,16 +834,17 @@ static void jtagmkII_set_devdescr(PROGRAMMER * pgm, AVRPART * p)
/* /*
* Reset the target. * Reset the target.
*/ */
static int jtagmkII_reset(PROGRAMMER * pgm) static int jtagmkII_reset(PROGRAMMER * pgm, unsigned char flags)
{ {
int status; int status;
unsigned char buf[1], *resp, c; unsigned char buf[2], *resp, c;
buf[0] = CMND_RESET; buf[0] = CMND_RESET;
buf[1] = flags;
if (verbose >= 2) if (verbose >= 2)
fprintf(stderr, "%s: jtagmkII_reset(): Sending reset command: ", fprintf(stderr, "%s: jtagmkII_reset(): Sending reset command: ",
progname); progname);
jtagmkII_send(pgm, buf, 1); jtagmkII_send(pgm, buf, 2);
status = jtagmkII_recv(pgm, &resp); status = jtagmkII_recv(pgm, &resp);
if (status <= 0) { if (status <= 0) {
@ -933,7 +967,7 @@ static int jtagmkII_program_disable(PROGRAMMER * pgm)
} }
prog_enabled = 0; prog_enabled = 0;
(void)jtagmkII_reset(pgm); (void)jtagmkII_reset(pgm, 0x01);
return 0; return 0;
} }
@ -1018,7 +1052,7 @@ static int jtagmkII_initialize(PROGRAMMER * pgm, AVRPART * p)
} }
flash_pageaddr = eeprom_pageaddr = (unsigned long)-1L; flash_pageaddr = eeprom_pageaddr = (unsigned long)-1L;
if (jtagmkII_reset(pgm) < 0) if (jtagmkII_reset(pgm, 0x01) < 0)
return -1; return -1;
strcpy(hfuse.desc, "hfuse"); strcpy(hfuse.desc, "hfuse");