Package: avrdude Version: 5.5-4 Tags: patch Hello.
This patch adds new commands to avrdude's terminal mode to support direct SPI transfers. Two commands are added: spi This command sets RESET# to inactive state allowing AVR to run. pgm This command returns AVR into programming mode After `spi' command is given, `send' command sends up to 4 bytes to SPI. LED pin, if present, acts as SS# (slave select) signal. It is set to 0 (active) before bytes are transmitted, and returns to 1 (inactive) after all bytes sent. In this mode, `send' command is allowed to use with less than 4 arguments. -- WBR, Andrew
diff -r -u avrdude-5.5.orig/bitbang.c avrdude-5.5/bitbang.c
--- avrdude-5.5.orig/bitbang.c 2007-01-24 23:07:54.000000000 +0200
+++ avrdude-5.5/bitbang.c 2008-11-29 16:58:09.000000000 +0200
@@ -225,6 +225,39 @@
return 0;
}
+/*
+ * transmit bytes via SPI and return the results; 'cmd' and
+ * 'res' must point to data buffers
+ */
+int bitbang_spi(PROGRAMMER * pgm, unsigned char cmd[],
+ unsigned char res[], int count)
+{
+ int i;
+
+ pgm->setpin(pgm, pgm->pinno[PIN_LED_PGM], 0);
+
+ for (i=0; i<count; i++) {
+ res[i] = bitbang_txrx(pgm, cmd[i]);
+ }
+
+ pgm->setpin(pgm, pgm->pinno[PIN_LED_PGM], 1);
+
+ if(verbose >= 2)
+ {
+ fprintf(stderr, "bitbang_cmd(): [ ");
+ for(i = 0; i < count; i++)
+ fprintf(stderr, "%02X ", cmd[i]);
+ fprintf(stderr, "] [ ");
+ for(i = 0; i < count; i++)
+ {
+ fprintf(stderr, "%02X ", res[i]);
+ }
+ fprintf(stderr, "]\n");
+ }
+
+ return 0;
+}
+
/*
* issue the 'chip erase' command to the AVR device
diff -r -u avrdude-5.5.orig/bitbang.h avrdude-5.5/bitbang.h
--- avrdude-5.5.orig/bitbang.h 2007-01-25 00:43:46.000000000 +0200
+++ avrdude-5.5/bitbang.h 2008-11-29 16:49:19.000000000 +0200
@@ -39,6 +39,8 @@
int bitbang_vfy_led (PROGRAMMER * pgm, int value);
int bitbang_cmd (PROGRAMMER * pgm, unsigned char cmd[4],
unsigned char res[4]);
+int bitbang_spi (PROGRAMMER * pgm, unsigned char cmd[],
+ unsigned char res[], int count);
int bitbang_chip_erase (PROGRAMMER * pgm, AVRPART * p);
int bitbang_program_enable (PROGRAMMER * pgm, AVRPART * p);
void bitbang_powerup (PROGRAMMER * pgm);
diff -r -u avrdude-5.5.orig/par.c avrdude-5.5/par.c
--- avrdude-5.5.orig/par.c 2007-01-30 15:41:53.000000000 +0200
+++ avrdude-5.5/par.c 2008-11-29 17:04:28.000000000 +0200
@@ -416,6 +416,7 @@
pgm->program_enable = bitbang_program_enable;
pgm->chip_erase = bitbang_chip_erase;
pgm->cmd = bitbang_cmd;
+ pgm->spi = bitbang_spi;
pgm->open = par_open;
pgm->close = par_close;
pgm->setpin = par_setpin;
diff -r -u avrdude-5.5.orig/pgm.c avrdude-5.5/pgm.c
--- avrdude-5.5.orig/pgm.c 2007-01-30 15:41:53.000000000 +0200
+++ avrdude-5.5/pgm.c 2008-11-29 16:59:38.000000000 +0200
@@ -117,6 +117,7 @@
* assigned before they are called
*/
pgm->cmd = NULL;
+ pgm->spi = NULL;
pgm->paged_write = NULL;
pgm->paged_load = NULL;
pgm->write_setup = NULL;
diff -r -u avrdude-5.5.orig/pgm.h avrdude-5.5/pgm.h
--- avrdude-5.5.orig/pgm.h 2007-01-30 15:41:53.000000000 +0200
+++ avrdude-5.5/pgm.h 2008-11-29 16:59:06.000000000 +0200
@@ -77,6 +77,8 @@
int (*chip_erase) (struct programmer_t * pgm, AVRPART * p);
int (*cmd) (struct programmer_t * pgm, unsigned char cmd[4],
unsigned char res[4]);
+ int (*spi) (struct programmer_t * pgm, unsigned char cmd[],
+ unsigned char res[], int count);
int (*open) (struct programmer_t * pgm, char * port);
void (*close) (struct programmer_t * pgm);
int (*paged_write) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
diff -r -u avrdude-5.5.orig/term.c avrdude-5.5/term.c
--- avrdude-5.5.orig/term.c 2007-01-25 00:43:46.000000000 +0200
+++ avrdude-5.5/term.c 2008-11-29 18:21:30.000000000 +0200
@@ -88,6 +88,11 @@
static int cmd_sck (PROGRAMMER * pgm, struct avrpart * p,
int argc, char *argv[]);
+static int cmd_spi (PROGRAMMER * pgm, struct avrpart * p,
+ int argc, char *argv[]);
+
+static int cmd_pgm (PROGRAMMER * pgm, struct avrpart * p,
+ int argc, char *argv[]);
struct command cmd[] = {
{ "dump", cmd_dump, "dump memory : %s <memtype> <addr> <N-Bytes>" },
@@ -102,6 +107,8 @@
{ "varef", cmd_varef, "set <V[aref]> (STK500 only)" },
{ "fosc", cmd_fosc, "set <oscillator frequency> (STK500 only)" },
{ "sck", cmd_sck, "set <SCK period> (STK500 only)" },
+ { "spi", cmd_spi, "enter direct SPI mode" },
+ { "pgm", cmd_pgm, "return to programming mode" },
{ "help", cmd_help, "help" },
{ "?", cmd_help, "help" },
{ "quit", cmd_quit, "quit" }
@@ -111,7 +118,7 @@
-
+static int spi_mode = 0;
static int nexttok(char * buf, char ** tok, char ** next)
{
@@ -445,8 +452,18 @@
return -1;
}
- if (argc != 5) {
- fprintf(stderr, "Usage: send <byte1> <byte2> <byte3> <byte4>\n");
+ if (spi_mode && (pgm->spi == NULL)) {
+ fprintf(stderr,
+ "The %s programmer does not support direct SPI transfers.\n",
+ pgm->type);
+ return -1;
+ }
+
+
+ if ((argc > 5) || ((argc < 5) && (!spi_mode))) {
+ fprintf(stderr, spi_mode?
+ "Usage: send <byte1> [<byte2> [<byte3> [<byte4>]]]\n":
+ "Usage: send <byte1> <byte2> <byte3> <byte4>\n");
return -1;
}
@@ -465,7 +482,10 @@
pgm->err_led(pgm, OFF);
- pgm->cmd(pgm, cmd, res);
+ if (spi_mode)
+ pgm->spi(pgm, cmd, res, argc-1);
+ else
+ pgm->cmd(pgm, cmd, res);
/*
* display results
@@ -707,6 +727,22 @@
return 0;
}
+static int cmd_spi(PROGRAMMER * pgm, struct avrpart * p,
+ int argc, char * argv[])
+{
+ pgm->setpin(pgm, pgm->pinno[PIN_AVR_RESET], 1);
+ spi_mode = 1;
+ return 0;
+}
+
+static int cmd_pgm(PROGRAMMER * pgm, struct avrpart * p,
+ int argc, char * argv[])
+{
+ pgm->setpin(pgm, pgm->pinno[PIN_AVR_RESET], 0);
+ spi_mode = 0;
+ pgm->initialize(pgm, p);
+ return 0;
+}
static int tokenize(char * s, char *** argv)
{
diff -r -u avrdude-5.5.orig/term.c avrdude-5.5/term.c
--- avrdude-5.5.orig/avrdude.1 2007-10-29 20:03:02.000000000 +0200
+++ avrdude-5.5/avrdude.1 2008-11-29 18:40:07.000000000 +0200
@@ -642,13 +642,19 @@
.Nm ,
this command allows you to use it, even though
.Nm
-does not implement the command.
+does not implement the command. When using direct SPI mode, up to 3 bytes
+can be omitted.
.It Ar sig
Display the device signature bytes.
+.It Ar spi
+Enter direct SPI mode.
+.Em Only supported on parallel bitbang programmers.
.It Ar part
Display the current part settings and parameters. Includes chip
specific information including all memory types supported by the
device, read/write timing, etc.
+.It Ar pgm
+Return to programming mode
.It Ar vtarg voltage
Set the target's supply voltage to
.Ar voltage
signature.asc
Description: This is a digitally signed message part.

