--- avrdude-5.5/stk500.c 2007-03-26 07:14:35.000000000 +0200 +++ avrdude-5.5/stk500.c 2007-07-19 01:54:20.000000000 +0200 @@ -1220,6 +1220,48 @@ stk500_print_parms1(pgm, ""); } +/* Signature byte reads are always 3 bytes. */ +static int stk500_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m) +{ + unsigned char buf[32]; + unsigned char tmp; + + if (m->size < 3) { + fprintf(stderr, "%s: memsize too small for sig byte read", progname); + return -1; + } + + buf[0] = Cmnd_STK_READ_SIGN; + buf[1] = Sync_CRC_EOP; + + stk500_send(pgm, buf, 2); + + if (stk500_recv(pgm, buf, 5) < 0) + return -1; + if (buf[0] == Resp_STK_NOSYNC) { + fprintf(stderr, "%s: stk500_cmd(): programmer is out of sync\n", progname); + return -1; + } else if (buf[0] != Resp_STK_INSYNC) { + fprintf(stderr, + "\n%s: stk500_read_sig_bytes(): (a) protocol error, " + "expect=0x%02x, resp=0x%02x\n", + progname, Resp_STK_INSYNC, buf[0]); + return -2; + } + if (buf[4] != Resp_STK_OK) { + fprintf(stderr, + "\n%s: stk500_read_sig_bytes(): (a) protocol error, " + "expect=0x%02x, resp=0x%02x\n", + progname, Resp_STK_OK, buf[4]); + return -3; + } + + m->buf[0] = buf[1]; + m->buf[1] = buf[2]; + m->buf[2] = buf[3]; + + return 3; +} void stk500_initpgm(PROGRAMMER * pgm) { @@ -1250,5 +1292,6 @@ pgm->set_varef = stk500_set_varef; pgm->set_fosc = stk500_set_fosc; pgm->set_sck_period = stk500_set_sck_period; + pgm->read_sig_bytes = stk500_read_sig_bytes; pgm->page_size = 256; }