Contributed by Janos Sallai <janos.sallai@vanderbilt.edu>:

patch #6074: added support for crossbow's MIB510 programmer
* avrdude.conf.in: Add entry for mib510.
* stk500.c: Add special hooks to handle the MIB510 programmer.
It mostly talks STK500v1 protocol but has a special hello and
goodbye sequence, and uses a fixed block size of 256 bytes.
* doc/avrdude.texi: Document support for mib510.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@773 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
Joerg Wunsch 2008-06-13 21:19:46 +00:00
parent cc8b75040f
commit 854f42a09f
5 changed files with 121 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2008-06-13 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
Contributed by Janos Sallai <janos.sallai@vanderbilt.edu>:
patch #6074: added support for crossbow's MIB510 programmer
* avrdude.conf.in: Add entry for mib510.
* stk500.c: Add special hooks to handle the MIB510 programmer.
It mostly talks STK500v1 protocol but has a special hello and
goodbye sequence, and uses a fixed block size of 256 bytes.
* doc/avrdude.texi: Document support for mib510.
2008-06-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de> 2008-06-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
Contributed by Klaus Leidinger <klaus@mikrocontroller-projekte.de>: Contributed by Klaus Leidinger <klaus@mikrocontroller-projekte.de>:

2
NEWS
View File

@ -20,6 +20,8 @@ Current:
programmer, to allow overriding the device code sent to the programmer, to allow overriding the device code sent to the
programmer. programmer.
* Add support for the Crossbow MIB510 programmer (patch #6074).
Version 5.5: Version 5.5:
* Add support for the USBtinyISP programmer (patch #6233) * Add support for the USBtinyISP programmer (patch #6233)

View File

@ -350,6 +350,12 @@ programmer
type = stk500; type = stk500;
; ;
programmer
id = "mib510";
desc = "Crossbow MIB510 programming board";
type = stk500;
;
programmer programmer
id = "stk500v2"; id = "stk500v2";
desc = "Atmel STK500 Version 2.x firmware"; desc = "Atmel STK500 Version 2.x firmware";

View File

@ -441,6 +441,8 @@ Atmel JTAG ICE mkII in debugWire mode.
Atmel JTAG ICE mkI, running at 115200 Bd Atmel JTAG ICE mkI, running at 115200 Bd
@item @code{jtagmkII} @tab @item @code{jtagmkII} @tab
Atmel JTAG ICE mkII (default speed 19200 Bd) Atmel JTAG ICE mkII (default speed 19200 Bd)
@item @code{mib510} @tab
Crossbow MIB510 programming board
@item @code{pavr} @tab @item @code{pavr} @tab
Jason Kyle's pAVR Serial Programmer Jason Kyle's pAVR Serial Programmer
@item @code{picoweb} @tab @item @code{picoweb} @tab

106
stk500.c
View File

@ -1,6 +1,7 @@
/* /*
* avrdude - A Downloader/Uploader for AVR device programmers * avrdude - A Downloader/Uploader for AVR device programmers
* Copyright (C) 2002-2004 Brian S. Dean <bsd@bsdhome.com> * Copyright (C) 2002-2004 Brian S. Dean <bsd@bsdhome.com>
* Copyright (C) 2008 Joerg Wunsch
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -330,6 +331,77 @@ static int stk500_set_extended_parms(PROGRAMMER * pgm, int n,
return -1; return -1;
} }
/*
* Crossbow MIB510 initialization and shutdown. Use cmd = 1 to
* initialize, cmd = 0 to close.
*/
static int mib510_isp(PROGRAMMER * pgm, unsigned char cmd)
{
unsigned char buf[9];
int tries = 0;
buf[0] = 0xaa;
buf[1] = 0x55;
buf[2] = 0x55;
buf[3] = 0xaa;
buf[4] = 0x17;
buf[5] = 0x51;
buf[6] = 0x31;
buf[7] = 0x13;
buf[8] = cmd;
retry:
tries++;
stk500_send(pgm, buf, 9);
if (stk500_recv(pgm, buf, 1) < 0)
exit(1);
if (buf[0] == Resp_STK_NOSYNC) {
if (tries > 33) {
fprintf(stderr, "%s: mib510_isp(): can't get into sync\n",
progname);
return -1;
}
if (stk500_getsync(pgm) < 0)
return -1;
goto retry;
}
else if (buf[0] != Resp_STK_INSYNC) {
fprintf(stderr,
"%s: mib510_isp(): protocol error, "
"expect=0x%02x, resp=0x%02x\n",
progname, Resp_STK_INSYNC, buf[0]);
return -1;
}
if (stk500_recv(pgm, buf, 1) < 0)
exit(1);
if (buf[0] == Resp_STK_OK) {
return 0;
}
else if (buf[0] == Resp_STK_NODEVICE) {
fprintf(stderr, "%s: mib510_isp(): no device\n",
progname);
return -1;
}
if (buf[0] == Resp_STK_FAILED)
{
fprintf(stderr,
"%s: mib510_isp(): command %d failed\n",
progname, cmd);
return -1;
}
fprintf(stderr, "%s: mib510_isp(): unknown response=0x%02x\n",
progname, buf[0]);
return -1;
}
/* /*
* initialize the AVR device and prepare it to accept commands * initialize the AVR device and prepare it to accept commands
@ -341,13 +413,18 @@ static int stk500_initialize(PROGRAMMER * pgm, AVRPART * p)
int tries; int tries;
unsigned maj, min; unsigned maj, min;
int rc; int rc;
int n_extparms = 3; int n_extparms;
stk500_getparm(pgm, Parm_STK_SW_MAJOR, &maj); stk500_getparm(pgm, Parm_STK_SW_MAJOR, &maj);
stk500_getparm(pgm, Parm_STK_SW_MINOR, &min); stk500_getparm(pgm, Parm_STK_SW_MINOR, &min);
if ((maj > 1) || ((maj == 1) && (min > 10))) // MIB510 does not need extparams
if (strcmp(ldata(lfirst(pgm->id)), "mib510") == 0)
n_extparms = 0;
else if ((maj > 1) || ((maj == 1) && (min > 10)))
n_extparms = 4; n_extparms = 4;
else
n_extparms = 3;
tries = 0; tries = 0;
@ -588,6 +665,11 @@ static int stk500_open(PROGRAMMER * pgm, char * port)
*/ */
stk500_drain(pgm, 0); stk500_drain(pgm, 0);
// MIB510 init
if (strcmp(ldata(lfirst(pgm->id)), "mib510") == 0 &&
mib510_isp(pgm, 1) != 0)
return -1;
if (stk500_getsync(pgm) < 0) if (stk500_getsync(pgm) < 0)
return -1; return -1;
@ -597,6 +679,10 @@ static int stk500_open(PROGRAMMER * pgm, char * port)
static void stk500_close(PROGRAMMER * pgm) static void stk500_close(PROGRAMMER * pgm)
{ {
// MIB510 close
if (strcmp(ldata(lfirst(pgm->id)), "mib510") == 0)
(void)mib510_isp(pgm, 0);
serial_close(&pgm->fd); serial_close(&pgm->fd);
pgm->fd.ifd = -1; pgm->fd.ifd = -1;
} }
@ -666,7 +752,13 @@ static int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int flash; int flash;
if (page_size == 0) { if (page_size == 0) {
page_size = 128; // MIB510 uses page size of 256 bytes
if (strcmp(ldata(lfirst(pgm->id)), "mib510") == 0) {
page_size = 256;
}
else {
page_size = 128;
}
} }
if (strcmp(m->desc, "flash") == 0) { if (strcmp(m->desc, "flash") == 0) {
@ -711,7 +803,9 @@ static int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
for (addr = 0; addr < n; addr += page_size) { for (addr = 0; addr < n; addr += page_size) {
report_progress (addr, n_bytes, NULL); report_progress (addr, n_bytes, NULL);
if (addr + page_size > n_bytes) { // MIB510 uses fixed blocks size of 256 bytes
if ((strcmp(ldata(lfirst(pgm->id)), "mib510") != 0) &&
(addr + page_size > n_bytes)) {
block_size = n_bytes % page_size; block_size = n_bytes % page_size;
} }
else { else {
@ -832,7 +926,9 @@ static int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
for (addr = 0; addr < n; addr += page_size) { for (addr = 0; addr < n; addr += page_size) {
report_progress (addr, n_bytes, NULL); report_progress (addr, n_bytes, NULL);
if (addr + page_size > n_bytes) { // MIB510 uses fixed blocks size of 256 bytes
if ((strcmp(ldata(lfirst(pgm->id)), "mib510") != 0) &&
(addr + page_size > n_bytes)) {
block_size = n_bytes % page_size; block_size = n_bytes % page_size;
} }
else { else {