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>
|
2011-08-16 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
bug #29650: Programming timeouts in ATmega128RFA1 are too slow
|
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_CONN_FAIL_SCK, "SCK fail" },
|
||||||
{ STATUS_TGT_NOT_DETECTED, "Target not detected" },
|
{ STATUS_TGT_NOT_DETECTED, "Target not detected" },
|
||||||
{ STATUS_TGT_REVERSE_INSERTED, "Target reverse inserted" },
|
{ 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
|
* issue the 'program enable' command to the AVR device
|
||||||
*/
|
*/
|
||||||
static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
{
|
{
|
||||||
unsigned char buf[16];
|
unsigned char buf[16];
|
||||||
size_t i;
|
char msg[100]; /* see remarks above about size needed */
|
||||||
const char *msg;
|
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
PDATA(pgm)->lastpart = p;
|
PDATA(pgm)->lastpart = p;
|
||||||
|
@ -1006,31 +1028,6 @@ static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
|
||||||
/* Activate AVR-style (low active) RESET */
|
/* Activate AVR-style (low active) RESET */
|
||||||
stk500v2_setparm_real(pgm, PARAM_RESET_POLARITY, 0x01);
|
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[0] = CMD_ENTER_PROGMODE_ISP;
|
||||||
buf[1] = p->timeout;
|
buf[1] = p->timeout;
|
||||||
buf[2] = p->stabdelay;
|
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));
|
rv = stk500v2_command(pgm, buf, 12, sizeof(buf));
|
||||||
|
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
buf[0] = CMD_CHECK_TARGET_CONNECTION;
|
switch (PDATA(pgm)->pgmtype)
|
||||||
if (stk500v2_command(pgm, buf, 1, sizeof(buf)) < 0) {
|
{
|
||||||
fprintf(stderr, "%s: stk500v2_program_enable(): cannot get connection status\n",
|
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);
|
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";
|
default:
|
||||||
|
/* cannot report anything for other pgmtypes */
|
||||||
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "%s: stk500v2_program_enable():"
|
|
||||||
" bad STK600 connection status: %s (0x%02x)\n",
|
|
||||||
progname, msg, buf[2]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
|
|
@ -137,11 +137,11 @@
|
||||||
#define STATUS_CMD_ILLEGAL_PARAMETER 0xCA
|
#define STATUS_CMD_ILLEGAL_PARAMETER 0xCA
|
||||||
|
|
||||||
// Status
|
// Status
|
||||||
|
#define STATUS_ISP_READY 0x00
|
||||||
#define STATUS_CONN_FAIL_MOSI 0x01
|
#define STATUS_CONN_FAIL_MOSI 0x01
|
||||||
#define STATUS_CONN_FAIL_RST 0x02
|
#define STATUS_CONN_FAIL_RST 0x02
|
||||||
#define STATUS_CONN_FAIL_SCK 0x04
|
#define STATUS_CONN_FAIL_SCK 0x04
|
||||||
#define STATUS_TGT_NOT_DETECTED 0x00
|
#define STATUS_TGT_NOT_DETECTED 0x10
|
||||||
#define STATUS_ISP_READY 0x10
|
|
||||||
#define STATUS_TGT_REVERSE_INSERTED 0x20
|
#define STATUS_TGT_REVERSE_INSERTED 0x20
|
||||||
|
|
||||||
// hw_status
|
// hw_status
|
||||||
|
|
Loading…
Reference in New Issue