bug #29636: AVRDude issues invalid CMD_CHECK_TARGET_CONNECTION
on the AVRISP-MKII * stk500v2.c (stk500v2_program_enable): Rewrite the logic to explain ISP activation failures. * stk500v2_private.h: Fix the various STATUS_* constants; AVR069 and AVR079 disagreed in their values, even though they are apparently implementing the same logic behind. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@972 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
df9215a79e
commit
8bb408b0ab
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||
|
||||
bug #29636: AVRDude issues invalid CMD_CHECK_TARGET_CONNECTION
|
||||
on the AVRISP-MKII
|
||||
* stk500v2.c (stk500v2_program_enable): Rewrite the logic to
|
||||
explain ISP activation failures.
|
||||
* stk500v2_private.h: Fix the various STATUS_* constants;
|
||||
AVR069 and AVR079 disagreed in their values, even though they
|
||||
are apparently implementing the same logic behind.
|
||||
|
||||
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||
|
||||
bug #29650: Programming timeouts in ATmega128RFA1 are too slow
|
||||
|
|
97
stk500v2.c
97
stk500v2.c
|
@ -973,24 +973,46 @@ static struct
|
|||
{ STATUS_CONN_FAIL_SCK, "SCK fail" },
|
||||
{ STATUS_TGT_NOT_DETECTED, "Target not detected" },
|
||||
{ STATUS_TGT_REVERSE_INSERTED, "Target reverse inserted" },
|
||||
{ STATUS_CONN_FAIL_MOSI | STATUS_CONN_FAIL_RST,
|
||||
"MOSI and RST fail" },
|
||||
{ STATUS_CONN_FAIL_MOSI | STATUS_CONN_FAIL_RST | STATUS_CONN_FAIL_SCK,
|
||||
"MOSI, RST, and SCK fail" },
|
||||
{ STATUS_CONN_FAIL_RST | STATUS_CONN_FAIL_SCK,
|
||||
"RST and SCK fail" },
|
||||
{ STATUS_CONN_FAIL_MOSI | STATUS_CONN_FAIL_SCK,
|
||||
"MOSI and SCK fail" },
|
||||
};
|
||||
|
||||
/*
|
||||
* Max length of returned message is the sum of all the description
|
||||
* strings in the table above, plus 2 characters for separation.
|
||||
* Currently, this is 76 chars.
|
||||
*/
|
||||
static void
|
||||
stk500v2_translate_conn_status(unsigned char status, char *msg)
|
||||
{
|
||||
size_t i;
|
||||
int need_comma;
|
||||
|
||||
*msg = 0;
|
||||
need_comma = 0;
|
||||
|
||||
for (i = 0;
|
||||
i < sizeof connection_status / sizeof connection_status[0];
|
||||
i++)
|
||||
{
|
||||
if ((status & connection_status[i].state) != 0)
|
||||
{
|
||||
if (need_comma)
|
||||
strcat(msg, ", ");
|
||||
strcat(msg, connection_status[i].description);
|
||||
need_comma = 1;
|
||||
}
|
||||
}
|
||||
if (*msg == 0)
|
||||
sprintf(msg, "Unknown status 0x%02x", status);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* issue the 'program enable' command to the AVR device
|
||||
*/
|
||||
static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||
{
|
||||
unsigned char buf[16];
|
||||
size_t i;
|
||||
const char *msg;
|
||||
char msg[100]; /* see remarks above about size needed */
|
||||
int rv;
|
||||
|
||||
PDATA(pgm)->lastpart = p;
|
||||
|
@ -1006,31 +1028,6 @@ static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
|||
/* Activate AVR-style (low active) RESET */
|
||||
stk500v2_setparm_real(pgm, PARAM_RESET_POLARITY, 0x01);
|
||||
|
||||
if (PDATA(pgm)->pgmtype == PGMTYPE_STK600) {
|
||||
buf[0] = CMD_CHECK_TARGET_CONNECTION;
|
||||
if (stk500v2_command(pgm, buf, 1, sizeof(buf)) < 0) {
|
||||
fprintf(stderr, "%s: stk500v2_program_enable(): cannot get connection status\n",
|
||||
progname);
|
||||
return -1;
|
||||
}
|
||||
if (buf[2] != STATUS_ISP_READY) {
|
||||
msg = "Unknown";
|
||||
|
||||
for (i = 0;
|
||||
i < sizeof connection_status / sizeof connection_status[0];
|
||||
i++)
|
||||
if (connection_status[i].state == (unsigned)buf[2]) {
|
||||
msg = connection_status[i].description;
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s: stk500v2_program_enable():"
|
||||
" bad STK600 connection status: %s (0x%02x)\n",
|
||||
progname, msg, buf[2]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
buf[0] = CMD_ENTER_PROGMODE_ISP;
|
||||
buf[1] = p->timeout;
|
||||
buf[2] = p->stabdelay;
|
||||
|
@ -1045,26 +1042,26 @@ static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
|||
rv = stk500v2_command(pgm, buf, 12, sizeof(buf));
|
||||
|
||||
if (rv < 0) {
|
||||
buf[0] = CMD_CHECK_TARGET_CONNECTION;
|
||||
if (stk500v2_command(pgm, buf, 1, sizeof(buf)) < 0) {
|
||||
fprintf(stderr, "%s: stk500v2_program_enable(): cannot get connection status\n",
|
||||
switch (PDATA(pgm)->pgmtype)
|
||||
{
|
||||
case PGMTYPE_STK600:
|
||||
case PGMTYPE_AVRISP_MKII:
|
||||
if (stk500v2_getparm(pgm, PARAM_STATUS_TGT_CONN, &buf[0]) != 0) {
|
||||
fprintf(stderr,
|
||||
"%s: stk500v2_program_enable(): cannot get connection status\n",
|
||||
progname);
|
||||
return -1;
|
||||
} else {
|
||||
stk500v2_translate_conn_status(buf[0], msg);
|
||||
fprintf(stderr, "%s: stk500v2_program_enable():"
|
||||
" bad AVRISPmkII connection status: %s\n",
|
||||
progname, msg);
|
||||
}
|
||||
break;
|
||||
|
||||
msg = "Unknown";
|
||||
|
||||
for (i = 0;
|
||||
i < sizeof connection_status / sizeof connection_status[0];
|
||||
i++)
|
||||
if (connection_status[i].state == (unsigned)buf[2]) {
|
||||
msg = connection_status[i].description;
|
||||
default:
|
||||
/* cannot report anything for other pgmtypes */
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s: stk500v2_program_enable():"
|
||||
" bad STK600 connection status: %s (0x%02x)\n",
|
||||
progname, msg, buf[2]);
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
|
|
@ -137,11 +137,11 @@
|
|||
#define STATUS_CMD_ILLEGAL_PARAMETER 0xCA
|
||||
|
||||
// Status
|
||||
#define STATUS_ISP_READY 0x00
|
||||
#define STATUS_CONN_FAIL_MOSI 0x01
|
||||
#define STATUS_CONN_FAIL_RST 0x02
|
||||
#define STATUS_CONN_FAIL_SCK 0x04
|
||||
#define STATUS_TGT_NOT_DETECTED 0x00
|
||||
#define STATUS_ISP_READY 0x10
|
||||
#define STATUS_TGT_NOT_DETECTED 0x10
|
||||
#define STATUS_TGT_REVERSE_INSERTED 0x20
|
||||
|
||||
// hw_status
|
||||
|
|
Loading…
Reference in New Issue