Improve the communication startup with the ICE in particular after a

powerup.  Ideas taken from AVaRICE.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@555 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
Joerg Wunsch 2005-11-28 20:46:21 +00:00
parent dfc2fdc0f3
commit a02dc0b11a
2 changed files with 47 additions and 6 deletions

View File

@ -1,3 +1,7 @@
2005-11-28 Joerg Wunsch <j@uriah.heep.sax.de>
* jtagmkI.c: Improve the communication startup with the ICE.
2005-11-28 Joerg Wunsch <j@uriah.heep.sax.de> 2005-11-28 Joerg Wunsch <j@uriah.heep.sax.de>
* configure.ac: enable parport access on x86_64 Linux and * configure.ac: enable parport access on x86_64 Linux and

View File

@ -104,7 +104,7 @@ static int jtagmkI_setparm(PROGRAMMER * pgm, unsigned char parm,
unsigned char value); unsigned char value);
static void jtagmkI_print_parms1(PROGRAMMER * pgm, char * p); static void jtagmkI_print_parms1(PROGRAMMER * pgm, char * p);
static int jtagmkI_resync(PROGRAMMER *pgm, int maxtries); static int jtagmkI_resync(PROGRAMMER *pgm, int maxtries, int signon);
static void static void
u32_to_b3(unsigned char *b, unsigned long l) u32_to_b3(unsigned char *b, unsigned long l)
@ -227,10 +227,10 @@ static int jtagmkI_drain(PROGRAMMER * pgm, int display)
} }
static int jtagmkI_resync(PROGRAMMER * pgm, int maxtries) static int jtagmkI_resync(PROGRAMMER * pgm, int maxtries, int signon)
{ {
int tries; int tries;
unsigned char buf[1], resp[1]; unsigned char buf[4], resp[9];
long otimeout = serial_recv_timeout; long otimeout = serial_recv_timeout;
serial_recv_timeout = 200; serial_recv_timeout = 200;
@ -260,6 +260,39 @@ static int jtagmkI_resync(PROGRAMMER * pgm, int maxtries)
fprintf(stderr, "got RESP_OK\n"); fprintf(stderr, "got RESP_OK\n");
break; break;
} }
if (signon) {
/*
* The following is black magic, the idea has been taken from
* AVaRICE.
*
* Apparently, the ICE behaves differently right after a
* power-up vs. when reconnecting to an ICE that has already
* been worked with. The undocumented 'E' command (or
* subcommand) occasionally helps in getting the connection into
* sync.
*/
buf[0] = CMD_GET_SIGNON;
buf[1] = 'E';
buf[2] = ' ';
buf[3] = ' ';
if (verbose >= 2)
fprintf(stderr, "%s: jtagmkI_resync(): Sending sign-on command: ",
progname);
if (serial_send(pgm->fd, buf, 4) != 0) {
fprintf(stderr,
"\n%s: jtagmkI_resync(): failed to send command to serial port\n",
progname);
serial_recv_timeout = otimeout;
return -1;
}
if (serial_recv(pgm->fd, resp, 9) == 0 && resp[0] == RESP_OK) {
if (verbose >= 2)
fprintf(stderr, "got RESP_OK\n");
break;
}
}
} }
if (tries >= maxtries) { if (tries >= maxtries) {
if (verbose >= 2) if (verbose >= 2)
@ -279,8 +312,12 @@ static int jtagmkI_getsync(PROGRAMMER * pgm)
{ {
unsigned char buf[1], resp[9]; unsigned char buf[1], resp[9];
if (jtagmkI_resync(pgm, 5) < 0) if (jtagmkI_resync(pgm, 5, 1) < 0) {
jtagmkI_drain(pgm, 0);
return -1; return -1;
}
jtagmkI_drain(pgm, 0);
if (verbose >= 2) if (verbose >= 2)
fprintf(stderr, "%s: jtagmkI_getsync(): Sending sign-on command: ", fprintf(stderr, "%s: jtagmkI_getsync(): Sending sign-on command: ",
@ -739,7 +776,7 @@ static int jtagmkI_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
tries = 0; tries = 0;
again: again:
if (tries != 0 && jtagmkI_resync(pgm, 2000) < 0) { if (tries != 0 && jtagmkI_resync(pgm, 2000, 0) < 0) {
fprintf(stderr, fprintf(stderr,
"%s: jtagmkI_paged_write(): sync loss, retries exhausted\n", "%s: jtagmkI_paged_write(): sync loss, retries exhausted\n",
progname); progname);
@ -863,7 +900,7 @@ static int jtagmkI_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
tries = 0; tries = 0;
again: again:
if (tries != 0 && jtagmkI_resync(pgm, 2000) < 0) { if (tries != 0 && jtagmkI_resync(pgm, 2000, 0) < 0) {
fprintf(stderr, fprintf(stderr,
"%s: jtagmkI_paged_load(): sync loss, retries exhausted\n", "%s: jtagmkI_paged_load(): sync loss, retries exhausted\n",
progname); progname);