Merge pull request #1046 from stefanrueger/stk500
Deprecate original STK500 v1 protocol in favour of optiboot and Arduino as ISP
This commit is contained in:
commit
310b801c59
78
src/stk500.c
78
src/stk500.c
|
@ -91,8 +91,6 @@ int stk500_getsync(PROGRAMMER * pgm)
|
||||||
int attempt;
|
int attempt;
|
||||||
int max_sync_attempts;
|
int max_sync_attempts;
|
||||||
|
|
||||||
/*
|
|
||||||
* get in sync */
|
|
||||||
buf[0] = Cmnd_STK_GET_SYNC;
|
buf[0] = Cmnd_STK_GET_SYNC;
|
||||||
buf[1] = Sync_CRC_EOP;
|
buf[1] = Sync_CRC_EOP;
|
||||||
|
|
||||||
|
@ -119,11 +117,12 @@ int stk500_getsync(PROGRAMMER * pgm)
|
||||||
usleep(50*1000);
|
usleep(50*1000);
|
||||||
stk500_drain(pgm, 0);
|
stk500_drain(pgm, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
stk500_send(pgm, buf, 2);
|
stk500_send(pgm, buf, 2);
|
||||||
stk500_recv(pgm, resp, 1);
|
resp[0] = 0;
|
||||||
if (resp[0] == Resp_STK_INSYNC){
|
if(stk500_recv(pgm, resp, 1) >= 0 && resp[0] == Resp_STK_INSYNC)
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
avrdude_message(MSG_INFO, "%s: stk500_getsync() attempt %d of %d: not in sync: resp=0x%02x\n",
|
avrdude_message(MSG_INFO, "%s: stk500_getsync() attempt %d of %d: not in sync: resp=0x%02x\n",
|
||||||
progname, attempt + 1, max_sync_attempts, resp[0]);
|
progname, attempt + 1, max_sync_attempts, resp[0]);
|
||||||
}
|
}
|
||||||
|
@ -204,15 +203,14 @@ static int stk500_chip_erase(PROGRAMMER * pgm, AVRPART * p)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->op[AVR_OP_CHIP_ERASE] == NULL) {
|
if (p->op[AVR_OP_CHIP_ERASE] == NULL) {
|
||||||
avrdude_message(MSG_INFO, "chip erase instruction not defined for part \"%s\"\n",
|
avrdude_message(MSG_INFO, "%s: chip erase instruction not defined for part \"%s\"\n",
|
||||||
p->desc);
|
progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pgm->pgm_led(pgm, ON);
|
pgm->pgm_led(pgm, ON);
|
||||||
|
|
||||||
memset(cmd, 0, sizeof(cmd));
|
memset(cmd, 0, sizeof(cmd));
|
||||||
|
|
||||||
avr_set_bits(p->op[AVR_OP_CHIP_ERASE], cmd);
|
avr_set_bits(p->op[AVR_OP_CHIP_ERASE], cmd);
|
||||||
pgm->cmd(pgm, cmd, res);
|
pgm->cmd(pgm, cmd, res);
|
||||||
usleep(p->chip_erase_delay);
|
usleep(p->chip_erase_delay);
|
||||||
|
@ -745,8 +743,8 @@ static int stk500_loadaddr(PROGRAMMER * pgm, AVRMEM * mem, unsigned int addr)
|
||||||
if (lext != NULL) {
|
if (lext != NULL) {
|
||||||
ext_byte = (addr >> 16) & 0xff;
|
ext_byte = (addr >> 16) & 0xff;
|
||||||
if (ext_byte != PDATA(pgm)->ext_addr_byte) {
|
if (ext_byte != PDATA(pgm)->ext_addr_byte) {
|
||||||
/* Either this is the first addr load, or a 64K word boundary is
|
/* Either this is the first addr load, or a different 64K word section */
|
||||||
* crossed, so set the ext addr byte */
|
memset(buf, 0, 4);
|
||||||
avr_set_bits(lext, buf);
|
avr_set_bits(lext, buf);
|
||||||
avr_set_addr(lext, buf, addr);
|
avr_set_addr(lext, buf, addr);
|
||||||
stk500_cmd(pgm, buf, buf);
|
stk500_cmd(pgm, buf, buf);
|
||||||
|
@ -782,13 +780,12 @@ static int stk500_loadaddr(PROGRAMMER * pgm, AVRMEM * mem, unsigned int addr)
|
||||||
|
|
||||||
if (stk500_recv(pgm, buf, 1) < 0)
|
if (stk500_recv(pgm, buf, 1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (buf[0] == Resp_STK_OK) {
|
if (buf[0] == Resp_STK_OK)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
avrdude_message(MSG_INFO, "%s: loadaddr(): (b) protocol error, "
|
avrdude_message(MSG_INFO, "%s: stk500_loadaddr(): (b) protocol error, "
|
||||||
"expect=0x%02x, resp=0x%02x\n",
|
"expect=0x%02x, resp=0x%02x\n",
|
||||||
progname, Resp_STK_INSYNC, buf[0]);
|
progname, Resp_STK_OK, buf[0]);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -808,19 +805,20 @@ static int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
|
|
||||||
if (strcmp(m->desc, "flash") == 0) {
|
if (strcmp(m->desc, "flash") == 0) {
|
||||||
memtype = 'F';
|
memtype = 'F';
|
||||||
}
|
a_div = 2;
|
||||||
else if (strcmp(m->desc, "eeprom") == 0) {
|
} else if (strcmp(m->desc, "eeprom") == 0) {
|
||||||
memtype = 'E';
|
memtype = 'E';
|
||||||
}
|
/*
|
||||||
else {
|
* The STK original 500 v1 protocol actually expects a_div = 1, but the
|
||||||
|
* v1.x FW of the STK500 kit has been superseded by v2 FW in the mid
|
||||||
|
* 2000s. Since optiboot, arduino as ISP and others assume a_div = 2,
|
||||||
|
* better use that. See https://github.com/avrdudes/avrdude/issues/967
|
||||||
|
*/
|
||||||
|
a_div = 2;
|
||||||
|
} else {
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO]))
|
|
||||||
a_div = 2;
|
|
||||||
else
|
|
||||||
a_div = 1;
|
|
||||||
|
|
||||||
n = addr + n_bytes;
|
n = addr + n_bytes;
|
||||||
#if 0
|
#if 0
|
||||||
avrdude_message(MSG_INFO, "n_bytes = %d\n"
|
avrdude_message(MSG_INFO, "n_bytes = %d\n"
|
||||||
|
@ -879,9 +877,9 @@ static int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
if (stk500_recv(pgm, buf, 1) < 0)
|
if (stk500_recv(pgm, buf, 1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (buf[0] != Resp_STK_OK) {
|
if (buf[0] != Resp_STK_OK) {
|
||||||
avrdude_message(MSG_INFO, "\n%s: stk500_paged_write(): (a) protocol error, "
|
avrdude_message(MSG_INFO, "\n%s: stk500_paged_write(): (b) protocol error, "
|
||||||
"expect=0x%02x, resp=0x%02x\n",
|
"expect=0x%02x, resp=0x%02x\n",
|
||||||
progname, Resp_STK_INSYNC, buf[0]);
|
progname, Resp_STK_OK, buf[0]);
|
||||||
return -5;
|
return -5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -902,19 +900,20 @@ static int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
|
|
||||||
if (strcmp(m->desc, "flash") == 0) {
|
if (strcmp(m->desc, "flash") == 0) {
|
||||||
memtype = 'F';
|
memtype = 'F';
|
||||||
}
|
a_div = 2;
|
||||||
else if (strcmp(m->desc, "eeprom") == 0) {
|
} else if (strcmp(m->desc, "eeprom") == 0) {
|
||||||
memtype = 'E';
|
memtype = 'E';
|
||||||
}
|
/*
|
||||||
else {
|
* The STK original 500 v1 protocol actually expects a_div = 1, but the
|
||||||
|
* v1.x FW of the STK500 kit has been superseded by v2 FW in the mid
|
||||||
|
* 2000s. Since optiboot, arduino as ISP and others assume a_div = 2,
|
||||||
|
* better use that. See https://github.com/avrdudes/avrdude/issues/967
|
||||||
|
*/
|
||||||
|
a_div = 2;
|
||||||
|
} else {
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO]))
|
|
||||||
a_div = 2;
|
|
||||||
else
|
|
||||||
a_div = 1;
|
|
||||||
|
|
||||||
n = addr + n_bytes;
|
n = addr + n_bytes;
|
||||||
for (; addr < n; addr += block_size) {
|
for (; addr < n; addr += block_size) {
|
||||||
// MIB510 uses fixed blocks size of 256 bytes
|
// MIB510 uses fixed blocks size of 256 bytes
|
||||||
|
@ -973,7 +972,7 @@ static int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (buf[0] != Resp_STK_OK) {
|
if (buf[0] != Resp_STK_OK) {
|
||||||
avrdude_message(MSG_INFO, "\n%s: stk500_paged_load(): (a) protocol error, "
|
avrdude_message(MSG_INFO, "\n%s: stk500_paged_load(): (b) protocol error, "
|
||||||
"expect=0x%02x, resp=0x%02x\n",
|
"expect=0x%02x, resp=0x%02x\n",
|
||||||
progname, Resp_STK_OK, buf[0]);
|
progname, Resp_STK_OK, buf[0]);
|
||||||
return -5;
|
return -5;
|
||||||
|
@ -1037,7 +1036,8 @@ static int stk500_set_fosc(PROGRAMMER * pgm, double v)
|
||||||
static unsigned ps[] = {
|
static unsigned ps[] = {
|
||||||
1, 8, 32, 64, 128, 256, 1024
|
1, 8, 32, 64, 128, 256, 1024
|
||||||
};
|
};
|
||||||
int idx, rc;
|
size_t idx;
|
||||||
|
int rc;
|
||||||
|
|
||||||
prescale = cmatch = 0;
|
prescale = cmatch = 0;
|
||||||
if (v > 0.0) {
|
if (v > 0.0) {
|
||||||
|
@ -1155,7 +1155,7 @@ static int stk500_getparm(PROGRAMMER * pgm, unsigned parm, unsigned * value)
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
else if (buf[0] != Resp_STK_OK) {
|
else if (buf[0] != Resp_STK_OK) {
|
||||||
avrdude_message(MSG_INFO, "\n%s: stk500_getparm(): (a) protocol error, "
|
avrdude_message(MSG_INFO, "\n%s: stk500_getparm(): (b) protocol error, "
|
||||||
"expect=0x%02x, resp=0x%02x\n",
|
"expect=0x%02x, resp=0x%02x\n",
|
||||||
progname, Resp_STK_OK, buf[0]);
|
progname, Resp_STK_OK, buf[0]);
|
||||||
return -3;
|
return -3;
|
||||||
|
@ -1214,9 +1214,9 @@ static int stk500_setparm(PROGRAMMER * pgm, unsigned parm, unsigned value)
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
avrdude_message(MSG_INFO, "\n%s: stk500_setparm(): (a) protocol error, "
|
avrdude_message(MSG_INFO, "\n%s: stk500_setparm(): (b) protocol error, "
|
||||||
"expect=0x%02x, resp=0x%02x\n",
|
"expect=0x%02x, resp=0x%02x\n",
|
||||||
progname, Resp_STK_INSYNC, buf[0]);
|
progname, Resp_STK_OK, buf[0]);
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -392,9 +392,7 @@ static int stk500v2_send_mk2(PROGRAMMER * pgm, unsigned char * data, size_t len)
|
||||||
|
|
||||||
static unsigned short get_jtagisp_return_size(unsigned char cmd)
|
static unsigned short get_jtagisp_return_size(unsigned char cmd)
|
||||||
{
|
{
|
||||||
int i;
|
for (size_t i = 0; i < sizeof jtagispcmds / sizeof jtagispcmds[0]; i++)
|
||||||
|
|
||||||
for (i = 0; i < sizeof jtagispcmds / sizeof jtagispcmds[0]; i++)
|
|
||||||
if (jtagispcmds[i].cmd == cmd)
|
if (jtagispcmds[i].cmd == cmd)
|
||||||
return jtagispcmds[i].size;
|
return jtagispcmds[i].size;
|
||||||
|
|
||||||
|
@ -481,7 +479,6 @@ static int stk500v2_jtag3_send(PROGRAMMER * pgm, unsigned char * data, size_t le
|
||||||
static int stk500v2_send(PROGRAMMER * pgm, unsigned char * data, size_t len)
|
static int stk500v2_send(PROGRAMMER * pgm, unsigned char * data, size_t len)
|
||||||
{
|
{
|
||||||
unsigned char buf[275 + 6]; // max MESSAGE_BODY of 275 bytes, 6 bytes overhead
|
unsigned char buf[275 + 6]; // max MESSAGE_BODY of 275 bytes, 6 bytes overhead
|
||||||
int i;
|
|
||||||
|
|
||||||
if (PDATA(pgm)->pgmtype == PGMTYPE_AVRISP_MKII ||
|
if (PDATA(pgm)->pgmtype == PGMTYPE_AVRISP_MKII ||
|
||||||
PDATA(pgm)->pgmtype == PGMTYPE_STK600)
|
PDATA(pgm)->pgmtype == PGMTYPE_STK600)
|
||||||
|
@ -500,12 +497,13 @@ static int stk500v2_send(PROGRAMMER * pgm, unsigned char * data, size_t len)
|
||||||
|
|
||||||
// calculate the XOR checksum
|
// calculate the XOR checksum
|
||||||
buf[5+len] = 0;
|
buf[5+len] = 0;
|
||||||
for (i=0;i<5+len;i++)
|
for (size_t i=0; i<5+len; i++)
|
||||||
buf[5+len] ^= buf[i];
|
buf[5+len] ^= buf[i];
|
||||||
|
|
||||||
DEBUG("STK500V2: stk500v2_send(");
|
DEBUG("STK500V2: stk500v2_send(");
|
||||||
for (i=0;i<len+6;i++) DEBUG("0x%02x ",buf[i]);
|
for (size_t i=0; i<len+6; i++)
|
||||||
DEBUG(", %d)\n",len+6);
|
DEBUG("0x%02x ", buf[i]);
|
||||||
|
DEBUG(", %d)\n", (int) 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: stk500_send(): failed to send command to serial port\n",progname);
|
||||||
|
@ -551,9 +549,9 @@ static int stk500v2_jtagmkII_recv(PROGRAMMER * pgm, unsigned char *msg,
|
||||||
progname);
|
progname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rv - 1 > maxsize) {
|
if ((size_t) rv - 1 > maxsize) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500v2_jtagmkII_recv(): got %u bytes, have only room for %u bytes\n",
|
avrdude_message(MSG_INFO, "%s: stk500v2_jtagmkII_recv(): got %u bytes, have only room for %u bytes\n",
|
||||||
progname, (unsigned)rv - 1, (unsigned)maxsize);
|
progname, (unsigned) rv - 1, (unsigned) maxsize);
|
||||||
rv = maxsize;
|
rv = maxsize;
|
||||||
}
|
}
|
||||||
switch (jtagmsg[0]) {
|
switch (jtagmsg[0]) {
|
||||||
|
@ -597,9 +595,9 @@ static int stk500v2_jtag3_recv(PROGRAMMER * pgm, unsigned char *msg,
|
||||||
implementation of JTAGICE3, as they always request a full 512
|
implementation of JTAGICE3, as they always request a full 512
|
||||||
octets from the ICE. Thus, only complain at high verbose
|
octets from the ICE. Thus, only complain at high verbose
|
||||||
levels. */
|
levels. */
|
||||||
if (rv - 1 > maxsize) {
|
if ((size_t) rv - 1 > maxsize) {
|
||||||
avrdude_message(MSG_DEBUG, "%s: stk500v2_jtag3_recv(): got %u bytes, have only room for %u bytes\n",
|
avrdude_message(MSG_DEBUG, "%s: stk500v2_jtag3_recv(): got %u bytes, have only room for %u bytes\n",
|
||||||
progname, (unsigned)rv - 1, (unsigned)maxsize);
|
progname, (unsigned) rv - 1, (unsigned) maxsize);
|
||||||
rv = maxsize;
|
rv = maxsize;
|
||||||
}
|
}
|
||||||
if (jtagmsg[0] != SCOPE_AVR_ISP) {
|
if (jtagmsg[0] != SCOPE_AVR_ISP) {
|
||||||
|
@ -814,13 +812,13 @@ retry:
|
||||||
|
|
||||||
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 tries = 0;
|
int tries = 0;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
DEBUG("STK500V2: stk500v2_command(");
|
DEBUG("STK500V2: stk500v2_command(");
|
||||||
for (i=0;i<len;i++) DEBUG("0x%02x ",buf[i]);
|
for (size_t i=0; i<len; i++)
|
||||||
DEBUG(", %d)\n",len);
|
DEBUG("0x%02x ",buf[i]);
|
||||||
|
DEBUG(", %d)\n", (int) len);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
tries++;
|
tries++;
|
||||||
|
@ -991,6 +989,7 @@ static int stk500v2_chip_erase(PROGRAMMER * pgm, AVRPART * p)
|
||||||
buf[0] = CMD_CHIP_ERASE_ISP;
|
buf[0] = CMD_CHIP_ERASE_ISP;
|
||||||
buf[1] = p->chip_erase_delay / 1000;
|
buf[1] = p->chip_erase_delay / 1000;
|
||||||
buf[2] = 0; // use delay (?)
|
buf[2] = 0; // use delay (?)
|
||||||
|
memset(buf+3, 0, 4);
|
||||||
avr_set_bits(p->op[AVR_OP_CHIP_ERASE], buf+3);
|
avr_set_bits(p->op[AVR_OP_CHIP_ERASE], buf+3);
|
||||||
result = stk500v2_command(pgm, buf, 7, sizeof(buf));
|
result = stk500v2_command(pgm, buf, 7, sizeof(buf));
|
||||||
usleep(p->chip_erase_delay);
|
usleep(p->chip_erase_delay);
|
||||||
|
@ -1121,8 +1120,8 @@ retry:
|
||||||
buf[5] = p->bytedelay;
|
buf[5] = p->bytedelay;
|
||||||
buf[6] = p->pollvalue;
|
buf[6] = p->pollvalue;
|
||||||
buf[7] = p->pollindex;
|
buf[7] = p->pollindex;
|
||||||
|
memset(buf+8, 0, 4);
|
||||||
avr_set_bits(p->op[AVR_OP_PGM_ENABLE], buf+8);
|
avr_set_bits(p->op[AVR_OP_PGM_ENABLE], buf+8);
|
||||||
buf[10] = buf[11] = 0;
|
|
||||||
|
|
||||||
rv = stk500v2_command(pgm, buf, 12, sizeof(buf));
|
rv = stk500v2_command(pgm, buf, 12, sizeof(buf));
|
||||||
|
|
||||||
|
@ -1957,12 +1956,12 @@ static int stk500isp_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
|
||||||
buf[0] = CMD_READ_SIGNATURE_ISP;
|
buf[0] = CMD_READ_SIGNATURE_ISP;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(buf + 1, 0, 5);
|
|
||||||
if ((op = mem->op[AVR_OP_READ]) == NULL) {
|
if ((op = mem->op[AVR_OP_READ]) == NULL) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500isp_read_byte(): invalid operation AVR_OP_READ on %s memory\n",
|
avrdude_message(MSG_INFO, "%s: stk500isp_read_byte(): invalid operation AVR_OP_READ on %s memory\n",
|
||||||
progname, mem->desc);
|
progname, mem->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
memset(buf+2, 0, 4);
|
||||||
avr_set_bits(op, buf + 2);
|
avr_set_bits(op, buf + 2);
|
||||||
if ((pollidx = avr_get_output_index(op)) == -1) {
|
if ((pollidx = avr_get_output_index(op)) == -1) {
|
||||||
avrdude_message(MSG_INFO, "%s: stk500isp_read_byte(): cannot determine pollidx to read %s memory\n",
|
avrdude_message(MSG_INFO, "%s: stk500isp_read_byte(): cannot determine pollidx to read %s memory\n",
|
||||||
|
@ -2314,6 +2313,7 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
progname, p->desc);
|
progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
memset(cmds, 0, sizeof cmds);
|
||||||
avr_set_bits(m->op[AVR_OP_LOADPAGE_LO], cmds);
|
avr_set_bits(m->op[AVR_OP_LOADPAGE_LO], cmds);
|
||||||
commandbuf[5] = cmds[0];
|
commandbuf[5] = cmds[0];
|
||||||
|
|
||||||
|
@ -2322,6 +2322,8 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
progname, p->desc);
|
progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(cmds, 0, sizeof cmds);
|
||||||
avr_set_bits(m->op[AVR_OP_WRITEPAGE], cmds);
|
avr_set_bits(m->op[AVR_OP_WRITEPAGE], cmds);
|
||||||
commandbuf[6] = cmds[0];
|
commandbuf[6] = cmds[0];
|
||||||
|
|
||||||
|
@ -2335,6 +2337,7 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
progname, p->desc);
|
progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
memset(cmds, 0, sizeof cmds);
|
||||||
avr_set_bits(wop, cmds);
|
avr_set_bits(wop, cmds);
|
||||||
commandbuf[5] = cmds[0];
|
commandbuf[5] = cmds[0];
|
||||||
commandbuf[6] = 0;
|
commandbuf[6] = 0;
|
||||||
|
@ -2346,6 +2349,7 @@ static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
progname, p->desc);
|
progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
memset(cmds, 0, sizeof cmds);
|
||||||
avr_set_bits(rop, cmds);
|
avr_set_bits(rop, cmds);
|
||||||
commandbuf[7] = cmds[0];
|
commandbuf[7] = cmds[0];
|
||||||
|
|
||||||
|
@ -2549,6 +2553,7 @@ static int stk500v2_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
progname, p->desc);
|
progname, p->desc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
memset(cmds, 0, sizeof cmds);
|
||||||
avr_set_bits(rop, cmds);
|
avr_set_bits(rop, cmds);
|
||||||
commandbuf[3] = cmds[0];
|
commandbuf[3] = cmds[0];
|
||||||
|
|
||||||
|
@ -2753,7 +2758,8 @@ static int stk500v2_set_fosc(PROGRAMMER * pgm, double v)
|
||||||
static unsigned ps[] = {
|
static unsigned ps[] = {
|
||||||
1, 8, 32, 64, 128, 256, 1024
|
1, 8, 32, 64, 128, 256, 1024
|
||||||
};
|
};
|
||||||
int idx, rc;
|
size_t idx;
|
||||||
|
int rc;
|
||||||
|
|
||||||
prescale = cmatch = 0;
|
prescale = cmatch = 0;
|
||||||
if (v > 0.0) {
|
if (v > 0.0) {
|
||||||
|
@ -2774,7 +2780,7 @@ static int stk500v2_set_fosc(PROGRAMMER * pgm, double v)
|
||||||
fosc = (unsigned)v;
|
fosc = (unsigned)v;
|
||||||
|
|
||||||
for (idx = 0; idx < sizeof(ps) / sizeof(ps[0]); idx++) {
|
for (idx = 0; idx < sizeof(ps) / sizeof(ps[0]); idx++) {
|
||||||
if (fosc >= STK500V2_XTAL / (256 * ps[idx] * 2)) {
|
if ((unsigned) fosc >= STK500V2_XTAL / (256 * ps[idx] * 2)) {
|
||||||
/* this prescaler value can handle our frequency */
|
/* this prescaler value can handle our frequency */
|
||||||
prescale = idx + 1;
|
prescale = idx + 1;
|
||||||
cmatch = (unsigned)(STK500V2_XTAL / (2 * fosc * ps[idx])) - 1;
|
cmatch = (unsigned)(STK500V2_XTAL / (2 * fosc * ps[idx])) - 1;
|
||||||
|
@ -2821,7 +2827,7 @@ static double avrispmkIIfreqs[] = {
|
||||||
|
|
||||||
static int stk500v2_set_sck_period_mk2(PROGRAMMER * pgm, double v)
|
static int stk500v2_set_sck_period_mk2(PROGRAMMER * pgm, double v)
|
||||||
{
|
{
|
||||||
int i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < sizeof(avrispmkIIfreqs) / sizeof(avrispmkIIfreqs[0]); i++) {
|
for (i = 0; i < sizeof(avrispmkIIfreqs) / sizeof(avrispmkIIfreqs[0]); i++) {
|
||||||
if (1 / avrispmkIIfreqs[i] >= v)
|
if (1 / avrispmkIIfreqs[i] >= v)
|
||||||
|
|
Loading…
Reference in New Issue