avrdude: Fixes in error handling
This commit is contained in:
parent
97b3c38148
commit
404fdbcfdf
3 changed files with 46 additions and 12 deletions
|
@ -1034,6 +1034,7 @@ int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size,
|
||||||
* error, otherwise it gets cleared in avr_write_byte()
|
* error, otherwise it gets cleared in avr_write_byte()
|
||||||
*/
|
*/
|
||||||
pgm->err_led(pgm, ON);
|
pgm->err_led(pgm, ON);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include "libavrdude.h"
|
#include "libavrdude.h"
|
||||||
|
|
||||||
long serial_recv_timeout = 5000; /* ms */
|
long serial_recv_timeout = 5000; /* ms */
|
||||||
|
#define MAX_ZERO_READS 512
|
||||||
|
|
||||||
struct baud_mapping {
|
struct baud_mapping {
|
||||||
long baud;
|
long baud;
|
||||||
|
@ -363,6 +364,7 @@ static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen
|
||||||
int rc;
|
int rc;
|
||||||
unsigned char * p = buf;
|
unsigned char * p = buf;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
unsigned zero_reads = 0;
|
||||||
|
|
||||||
timeout.tv_sec = serial_recv_timeout / 1000L;
|
timeout.tv_sec = serial_recv_timeout / 1000L;
|
||||||
timeout.tv_usec = (serial_recv_timeout % 1000L) * 1000;
|
timeout.tv_usec = (serial_recv_timeout % 1000L) * 1000;
|
||||||
|
@ -397,9 +399,18 @@ static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen
|
||||||
avrdude_message(MSG_INFO, "%s: ser_recv(): read error: %s\n",
|
avrdude_message(MSG_INFO, "%s: ser_recv(): read error: %s\n",
|
||||||
progname, strerror(errno));
|
progname, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
|
} else if (rc == 0) {
|
||||||
|
zero_reads++;
|
||||||
|
if (zero_reads > MAX_ZERO_READS) {
|
||||||
|
avrdude_message(MSG_NOTICE2, "%s: ser_recv(): programmer is not responding (too many zero reads)\n",
|
||||||
|
progname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
zero_reads = 0;
|
||||||
|
p += rc;
|
||||||
|
len += rc;
|
||||||
}
|
}
|
||||||
p += rc;
|
|
||||||
len += rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p = buf;
|
p = buf;
|
||||||
|
@ -435,6 +446,7 @@ static int ser_drain(union filedescriptor *fd, int display)
|
||||||
int nfds;
|
int nfds;
|
||||||
int rc;
|
int rc;
|
||||||
unsigned char buf;
|
unsigned char buf;
|
||||||
|
unsigned zero_reads = 0;
|
||||||
|
|
||||||
timeout.tv_sec = 0;
|
timeout.tv_sec = 0;
|
||||||
timeout.tv_usec = 250000;
|
timeout.tv_usec = 250000;
|
||||||
|
@ -472,6 +484,15 @@ static int ser_drain(union filedescriptor *fd, int display)
|
||||||
avrdude_message(MSG_INFO, "%s: ser_drain(): read error: %s\n",
|
avrdude_message(MSG_INFO, "%s: ser_drain(): read error: %s\n",
|
||||||
progname, strerror(errno));
|
progname, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
|
} else if (rc == 0) {
|
||||||
|
zero_reads++;
|
||||||
|
if (zero_reads > MAX_ZERO_READS) {
|
||||||
|
avrdude_message(MSG_NOTICE2, "%s: ser_drain(): programmer is not responding (too many zero reads)\n",
|
||||||
|
progname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
zero_reads = 0;
|
||||||
}
|
}
|
||||||
if (display) {
|
if (display) {
|
||||||
avrdude_message(MSG_INFO, "%02x ", buf);
|
avrdude_message(MSG_INFO, "%02x ", buf);
|
||||||
|
|
|
@ -518,7 +518,7 @@ static int stk500v2_send(PROGRAMMER * pgm, unsigned char * data, size_t len)
|
||||||
DEBUG(", %d)\n",len+6);
|
DEBUG(", %d)\n",len+6);
|
||||||
|
|
||||||
if (serial_send(&pgm->fd, buf, len+6) != 0) {
|
if (serial_send(&pgm->fd, buf, len+6) != 0) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500_send(): failed to send command to serial port\n",progname);
|
avrdude_message(MSG_INFO, "%s: stk500v2_send(): failed to send command to serial port\n",progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -731,7 +731,7 @@ static int stk500v2_recv(PROGRAMMER * pgm, unsigned char *msg, size_t maxsize) {
|
||||||
tnow = tv.tv_sec;
|
tnow = tv.tv_sec;
|
||||||
if (tnow-tstart > timeoutval) { // wuff - signed/unsigned/overflow
|
if (tnow-tstart > timeoutval) { // wuff - signed/unsigned/overflow
|
||||||
timedout:
|
timedout:
|
||||||
avrdude_message(MSG_INFO, "%s: stk500v2_ReceiveMessage(): timeout\n",
|
avrdude_message(MSG_INFO, "%s: stk500v2_recv(): timeout\n",
|
||||||
progname);
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -744,7 +744,7 @@ static int stk500v2_recv(PROGRAMMER * pgm, unsigned char *msg, size_t maxsize) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int stk500v2_getsync(PROGRAMMER * pgm) {
|
static int stk500v2_getsync_internal(PROGRAMMER * pgm, int retries) {
|
||||||
int tries = 0;
|
int tries = 0;
|
||||||
unsigned char buf[1], resp[32];
|
unsigned char buf[1], resp[32];
|
||||||
int status;
|
int status;
|
||||||
|
@ -760,7 +760,10 @@ retry:
|
||||||
|
|
||||||
// send the sync command and see if we can get there
|
// send the sync command and see if we can get there
|
||||||
buf[0] = CMD_SIGN_ON;
|
buf[0] = CMD_SIGN_ON;
|
||||||
stk500v2_send(pgm, buf, 1);
|
if (stk500v2_send(pgm, buf, 1) != 0) {
|
||||||
|
avrdude_message(MSG_INFO, "%s: stk500v2_getsync(): can't communicate with device\n", progname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// try to get the response back and see where we got
|
// try to get the response back and see where we got
|
||||||
status = stk500v2_recv(pgm, resp, sizeof(resp));
|
status = stk500v2_recv(pgm, resp, sizeof(resp));
|
||||||
|
@ -794,7 +797,7 @@ retry:
|
||||||
progname, pgmname[PDATA(pgm)->pgmtype]);
|
progname, pgmname[PDATA(pgm)->pgmtype]);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
if (tries > RETRIES) {
|
if (tries > retries) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500v2_getsync(): can't communicate with device: resp=0x%02x\n",
|
avrdude_message(MSG_INFO, "%s: stk500v2_getsync(): can't communicate with device: resp=0x%02x\n",
|
||||||
progname, resp[0]);
|
progname, resp[0]);
|
||||||
return -6;
|
return -6;
|
||||||
|
@ -804,7 +807,7 @@ retry:
|
||||||
|
|
||||||
// or if we got a timeout
|
// or if we got a timeout
|
||||||
} else if (status == -1) {
|
} else if (status == -1) {
|
||||||
if (tries > RETRIES) {
|
if (tries > retries) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500v2_getsync(): timeout communicating with programmer\n",
|
avrdude_message(MSG_INFO, "%s: stk500v2_getsync(): timeout communicating with programmer\n",
|
||||||
progname);
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -813,7 +816,7 @@ retry:
|
||||||
|
|
||||||
// or any other error
|
// or any other error
|
||||||
} else {
|
} else {
|
||||||
if (tries > RETRIES) {
|
if (tries > retries) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500v2_getsync(): error communicating with programmer: (%d)\n",
|
avrdude_message(MSG_INFO, "%s: stk500v2_getsync(): error communicating with programmer: (%d)\n",
|
||||||
progname,status);
|
progname,status);
|
||||||
} else
|
} else
|
||||||
|
@ -823,6 +826,11 @@ retry:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stk500v2_getsync(PROGRAMMER * pgm) {
|
||||||
|
// This is to avoid applying RETRIES exponentially
|
||||||
|
return stk500v2_getsync_internal(pgm, RETRIES);
|
||||||
|
}
|
||||||
|
|
||||||
static int stk500v2_command(PROGRAMMER * pgm, unsigned char * buf,
|
static int stk500v2_command(PROGRAMMER * pgm, unsigned char * buf,
|
||||||
size_t len, size_t maxlen) {
|
size_t len, size_t maxlen) {
|
||||||
int i;
|
int i;
|
||||||
|
@ -837,7 +845,11 @@ retry:
|
||||||
tries++;
|
tries++;
|
||||||
|
|
||||||
// send the command to the programmer
|
// send the command to the programmer
|
||||||
stk500v2_send(pgm,buf,len);
|
if (stk500v2_send(pgm, buf, len) != 0) {
|
||||||
|
avrdude_message(MSG_INFO, "%s: stk500v2_command(): can't communicate with device\n", progname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// attempt to read the status back
|
// attempt to read the status back
|
||||||
status = stk500v2_recv(pgm,buf,maxlen);
|
status = stk500v2_recv(pgm,buf,maxlen);
|
||||||
|
|
||||||
|
@ -922,7 +934,7 @@ retry:
|
||||||
}
|
}
|
||||||
|
|
||||||
// otherwise try to sync up again
|
// otherwise try to sync up again
|
||||||
status = stk500v2_getsync(pgm);
|
status = stk500v2_getsync_internal(pgm, 1);
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
if (tries > RETRIES) {
|
if (tries > RETRIES) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500v2_command(): failed miserably to execute command 0x%02x\n",
|
avrdude_message(MSG_INFO, "%s: stk500v2_command(): failed miserably to execute command 0x%02x\n",
|
||||||
|
@ -1123,7 +1135,7 @@ static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
stk500v2_setparm_real(pgm, PARAM_RESET_POLARITY, 0x01);
|
stk500v2_setparm_real(pgm, PARAM_RESET_POLARITY, 0x01);
|
||||||
|
|
||||||
tries = 0;
|
tries = 0;
|
||||||
retry:
|
// retry:
|
||||||
buf[0] = CMD_ENTER_PROGMODE_ISP;
|
buf[0] = CMD_ENTER_PROGMODE_ISP;
|
||||||
buf[1] = p->timeout;
|
buf[1] = p->timeout;
|
||||||
buf[2] = p->stabdelay;
|
buf[2] = p->stabdelay;
|
||||||
|
|
Loading…
Reference in a new issue