main.c, pgm.c, pgm.h: Add the -x option to pass extended parameters to

the programmer backend.

jtagmkII.c: Implement the extended parameter jtagchain=
to support JTAG daisy-chains.

avrdude.1, doc/avrdude.texi: Document all of the above.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@761 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
joerg_wunsch 2007-11-06 19:42:16 +00:00
parent 6a54d14f43
commit 0c8bd41a10
8 changed files with 169 additions and 5 deletions

View File

@ -1,3 +1,14 @@
2007-11-06 Joerg Wunsch <j@uriah.heep.sax.de>
* main.c: Add the -x option to pass extended parameters to
the programmer backend.
* pgm.c: (Ditto.)
* pgm.h: (Ditto.)
* jtagmkII.c: Implement the extended parameter jtagchain=
to support JTAG daisy-chains.
* avrdude.1: Document all of the above.
* doc/avrdude.texi: (Ditto.)
2007-10-30 Joerg Wunsch <j@uriah.heep.sax.de> 2007-10-30 Joerg Wunsch <j@uriah.heep.sax.de>
* configure.ac (AC_INIT): Bump version for post-release. * configure.ac (AC_INIT): Bump version for post-release.

5
NEWS
View File

@ -7,6 +7,11 @@ Approximate change log for AVRDUDE by version.
---------------------------------------------------------------------- ----------------------------------------------------------------------
Current: Current:
* Add support for the -x option to pass extended parameters to the
programmer backend.
* Add support for JTAG daisy-chains, using the -x daisychain=
option.
Version 5.5: Version 5.5:

View File

@ -19,7 +19,7 @@
.\" .\"
.\" $Id$ .\" $Id$
.\" .\"
.Dd DATE October 29, 2007 .Dd DATE November 6, 2007
.Os .Os
.Dt AVRDUDE 1 .Dt AVRDUDE 1
.Sh NAME .Sh NAME
@ -48,6 +48,7 @@
.Op Fl u .Op Fl u
.Op Fl U Ar memtype:op:filename:filefmt .Op Fl U Ar memtype:op:filename:filefmt
.Op Fl v .Op Fl v
.Op Fl x Ar extended_param
.Op Fl V .Op Fl V
.Op Fl y .Op Fl y
.Op Fl Y .Op Fl Y
@ -578,6 +579,13 @@ does not have a colon in it.
Enable verbose output. Enable verbose output.
.It Fl V .It Fl V
Disable automatic verify check when uploading data. Disable automatic verify check when uploading data.
.It Fl x Ar extended_param
Pass
.Ar extended_param
to the chosen programmer implementation as an extended parameter.
The interpretation of the extended parameter depends on the
programmer itself.
See below for a list of programmers accepting extended parameters.
.It Fl y .It Fl y
Tells Tells
.Nm .Nm
@ -744,6 +752,27 @@ be accessed using normal ISP programming.
This sequence is automatically initiated by using the JTAG ICE mkII This sequence is automatically initiated by using the JTAG ICE mkII
or AVR Dragon in ISP mode, when they detect that ISP mode cannot be or AVR Dragon in ISP mode, when they detect that ISP mode cannot be
entered. entered.
.Ss Programmers accepting extended parameters
.Bl -tag -offset indent -width indent
.It Ar JTAG ICE mkII
.It Ar AVR Dragon
When using the JTAG ICE mkII or AVR Dragon in JTAG mode, the
following extended parameter is accepted:
.Bl -tag -offset indent -width indent
.It Ar jtagchain=UB,UA,BB,BA
Setup the JTAG scan chain for
.Ar UB
units before,
.Ar UA
units after,
.Ar BB
bits before, and
.Ar BA
bits after the target AVR, respectively.
Each AVR unit within the chain shifts by 4 bits.
Other JTAG units might require a different bit shift count.
.El
.El
.Sh FILES .Sh FILES
.Bl -tag -offset indent -width /dev/ppi0XXX .Bl -tag -offset indent -width /dev/ppi0XXX
.It Pa /dev/ppi0 .It Pa /dev/ppi0

View File

@ -244,13 +244,14 @@ Roth.
@menu @menu
* Option Descriptions:: * Option Descriptions::
* Programmers accepting extended parameters::
* Example Command Line Invocations:: * Example Command Line Invocations::
@end menu @end menu
@c @c
@c Node @c Node
@c @c
@node Option Descriptions, Example Command Line Invocations, Command Line Options, Command Line Options @node Option Descriptions, Programmers accepting extended parameters, Command Line Options, Command Line Options
@section Option Descriptions @section Option Descriptions
@noindent @noindent
@ -747,6 +748,12 @@ Enable verbose output.
@item -V @item -V
Disable automatic verify check when uploading data. Disable automatic verify check when uploading data.
@item -x @var{extended_param}
Pass @var{extended_param} to the chosen programmer implementation as
an extended parameter. The interpretation of the extended parameter
depends on the programmer itself. See below for a list of programmers
accepting extended parameters.
@item -y @item -y
Tells AVRDUDE to use the last four bytes of the connected parts' EEPROM Tells AVRDUDE to use the last four bytes of the connected parts' EEPROM
memory to track the number of times the device has been erased. When memory to track the number of times the device has been erased. When
@ -774,7 +781,32 @@ should not be used.
@c @c
@c Node @c Node
@c @c
@node Example Command Line Invocations, , Option Descriptions, Command Line Options @node Programmers accepting extended parameters, Example Command Line Invocations, Option Descriptions, Command Line Options
@section Programmers accepting extended parameters
@table @code
@item JTAG ICE mkII
@itemx AVR Dragon
When using the JTAG ICE mkII or AVR Dragon in JTAG mode, the
following extended parameter is accepted:
@table @code
@item @var{jtagchain=UB,UA,BB,BA}
Setup the JTAG scan chain for @var{UB} units before, @var{UA} units
after, @var{BB} bits before, and @var{BA} bits after the target AVR,
respectively.
Each AVR unit within the chain shifts by 4 bits.
Other JTAG units might require a different bit shift count.
@end table
@end table
@page
@c
@c Node
@c
@node Example Command Line Invocations, , Programmers accepting extended parameters, Command Line Options
@section Example Command Line Invocations @section Example Command Line Invocations
@noindent @noindent

View File

@ -71,6 +71,10 @@ static unsigned int eeprom_pagesize;
static int prog_enabled; /* Cached value of PROGRAMMING status. */ static int prog_enabled; /* Cached value of PROGRAMMING status. */
static unsigned char serno[6]; /* JTAG ICE serial number. */ static unsigned char serno[6]; /* JTAG ICE serial number. */
/* JTAG chain stuff */
static unsigned char jtagchain[4];
/* /*
* The OCDEN fuse is bit 7 of the high fuse (hfuse). In order to * The OCDEN fuse is bit 7 of the high fuse (hfuse). In order to
* perform memory operations on MTYPE_SPM and MTYPE_EEPROM, OCDEN * perform memory operations on MTYPE_SPM and MTYPE_EEPROM, OCDEN
@ -1108,6 +1112,12 @@ static int jtagmkII_initialize(PROGRAMMER * pgm, AVRPART * p)
return -1; return -1;
} }
if (jtagmkII_setparm(pgm, PAR_DAISY_CHAIN_INFO, jtagchain) < 0) {
fprintf(stderr, "%s: jtagmkII_initialize(): Failed to setup JTAG chain\n",
progname);
return -1;
}
/* /*
* Must set the device descriptor before entering programming mode. * Must set the device descriptor before entering programming mode.
*/ */
@ -1163,6 +1173,49 @@ static void jtagmkII_enable(PROGRAMMER * pgm)
return; return;
} }
static int jtagmkII_parseextparms(PROGRAMMER * pgm, LISTID extparms)
{
LNODEID ln;
const char *extended_param;
int rv = 0;
for (ln = lfirst(extparms); ln; ln = lnext(ln)) {
extended_param = ldata(ln);
if (strncmp(extended_param, "jtagchain=", strlen("jtagchain=")) == 0) {
unsigned int ub, ua, bb, ba;
if (sscanf(extended_param, "jtagchain=%u,%u,%u,%u", &ub, &ua, &bb, &ba)
!= 4) {
fprintf(stderr,
"%s: jtagmkII_parseextparms(): invalid JTAG chain '%s'\n",
progname, extended_param);
rv = -1;
continue;
}
if (verbose >= 2) {
fprintf(stderr,
"%s: jtagmkII_parseextparms(): JTAG chain parsed as:\n"
"%s %u units before, %u units after, %u bits before, %u bits after\n",
progname,
progbuf, ub, ua, bb, ba);
}
jtagchain[0] = ub;
jtagchain[1] = ua;
jtagchain[2] = bb;
jtagchain[3] = ba;
continue;
}
fprintf(stderr,
"%s: jtagmkII_parseextparms(): invalid extended parameter '%s'\n",
progname, extended_param);
rv = -1;
}
return rv;
}
static int jtagmkII_open(PROGRAMMER * pgm, char * port) static int jtagmkII_open(PROGRAMMER * pgm, char * port)
{ {
@ -2026,6 +2079,7 @@ static int jtagmkII_setparm(PROGRAMMER * pgm, unsigned char parm,
case PAR_OCD_VTARGET: size = 2; break; case PAR_OCD_VTARGET: size = 2; break;
case PAR_OCD_JTAG_CLK: size = 1; break; case PAR_OCD_JTAG_CLK: size = 1; break;
case PAR_TIMERS_RUNNING: size = 1; break; case PAR_TIMERS_RUNNING: size = 1; break;
case PAR_DAISY_CHAIN_INFO: size = 4; break;
default: default:
fprintf(stderr, "%s: jtagmkII_setparm(): unknown parameter 0x%02x\n", fprintf(stderr, "%s: jtagmkII_setparm(): unknown parameter 0x%02x\n",
progname, parm); progname, parm);
@ -2160,6 +2214,7 @@ void jtagmkII_initpgm(PROGRAMMER * pgm)
pgm->paged_load = jtagmkII_paged_load; pgm->paged_load = jtagmkII_paged_load;
pgm->print_parms = jtagmkII_print_parms; pgm->print_parms = jtagmkII_print_parms;
pgm->set_sck_period = jtagmkII_set_sck_period; pgm->set_sck_period = jtagmkII_set_sck_period;
pgm->parseextparams = jtagmkII_parseextparms;
pgm->page_size = 256; pgm->page_size = 256;
} }
@ -2218,6 +2273,7 @@ void jtagmkII_dragon_initpgm(PROGRAMMER * pgm)
pgm->paged_load = jtagmkII_paged_load; pgm->paged_load = jtagmkII_paged_load;
pgm->print_parms = jtagmkII_print_parms; pgm->print_parms = jtagmkII_print_parms;
pgm->set_sck_period = jtagmkII_set_sck_period; pgm->set_sck_period = jtagmkII_set_sck_period;
pgm->parseextparams = jtagmkII_parseextparms;
pgm->page_size = 256; pgm->page_size = 256;
} }

33
main.c
View File

@ -72,6 +72,8 @@ struct list_walk_cookie
static LISTID updates; static LISTID updates;
static LISTID extended_params;
/* /*
* global options * global options
*/ */
@ -111,6 +113,7 @@ static void usage(void)
" fuses should be changed back.\n" " fuses should be changed back.\n"
" -t Enter terminal mode.\n" " -t Enter terminal mode.\n"
" -E <exitspec>[,<exitspec>] List programmer exit specifications.\n" " -E <exitspec>[,<exitspec>] List programmer exit specifications.\n"
" -x <extended_param> Pass <extended_param> to programmer.\n"
" -y Count # erase cycles in EEPROM.\n" " -y Count # erase cycles in EEPROM.\n"
" -Y <number> Initialize erase cycle # in EEPROM.\n" " -Y <number> Initialize erase cycle # in EEPROM.\n"
" -v Verbose output. -v -v for more.\n" " -v Verbose output. -v -v for more.\n"
@ -302,6 +305,12 @@ int main(int argc, char * argv [])
exit(1); exit(1);
} }
extended_params = lcreat(NULL, 0);
if (extended_params == NULL) {
fprintf(stderr, "%s: cannot initialize extended parameter list\n", progname);
exit(1);
}
partdesc = NULL; partdesc = NULL;
port = default_parallel; port = default_parallel;
erase = 0; erase = 0;
@ -324,7 +333,7 @@ int main(int argc, char * argv [])
ispdelay = 0; ispdelay = 0;
safemode = 1; /* Safemode on by default */ safemode = 1; /* Safemode on by default */
silentsafe = 0; /* Ask by default */ silentsafe = 0; /* Ask by default */
if (isatty(STDIN_FILENO) == 0) if (isatty(STDIN_FILENO) == 0)
safemode = 0; /* Turn off safemode if this isn't a terminal */ safemode = 0; /* Turn off safemode if this isn't a terminal */
@ -372,7 +381,7 @@ int main(int argc, char * argv [])
/* /*
* process command line arguments * process command line arguments
*/ */
while ((ch = getopt(argc,argv,"?b:B:c:C:DeE:Fi:np:OP:qstU:uvVyY:")) != -1) { while ((ch = getopt(argc,argv,"?b:B:c:C:DeE:Fi:np:OP:qstU:uvVx:yY:")) != -1) {
switch (ch) { switch (ch) {
case 'b': /* override default programmer baud rate */ case 'b': /* override default programmer baud rate */
@ -484,6 +493,10 @@ int main(int argc, char * argv [])
verify = 0; verify = 0;
break; break;
case 'x':
ladd(extended_params, optarg);
break;
case 'y': case 'y':
do_cycles = 1; do_cycles = 1;
break; break;
@ -623,6 +636,22 @@ int main(int argc, char * argv [])
exit(1); exit(1);
} }
if (lsize(extended_params) > 0) {
if (pgm->parseextparams == NULL) {
fprintf(stderr,
"%s: WARNING: Programmer doesn't support extended parameters,"
" -x option(s) ignored\n",
progname);
} else {
if (pgm->parseextparams(pgm, extended_params) < 0) {
fprintf(stderr,
"%s: Error parsing extended parameter list\n",
progname);
exit(1);
}
}
}
if ((strcmp(pgm->type, "STK500") == 0) || if ((strcmp(pgm->type, "STK500") == 0) ||
(strcmp(pgm->type, "avr910") == 0) || (strcmp(pgm->type, "avr910") == 0) ||
(strcmp(pgm->type, "STK500V2") == 0) || (strcmp(pgm->type, "STK500V2") == 0) ||

1
pgm.c
View File

@ -125,6 +125,7 @@ PROGRAMMER * pgm_new(void)
pgm->set_varef = NULL; pgm->set_varef = NULL;
pgm->set_fosc = NULL; pgm->set_fosc = NULL;
pgm->perform_osccal = NULL; pgm->perform_osccal = NULL;
pgm->parseextparams = NULL;
return pgm; return pgm;
} }

1
pgm.h
View File

@ -99,6 +99,7 @@ typedef struct programmer_t {
int (*highpulsepin) (struct programmer_t * pgm, int pin); int (*highpulsepin) (struct programmer_t * pgm, int pin);
int (*parseexitspecs) (struct programmer_t * pgm, char *s); int (*parseexitspecs) (struct programmer_t * pgm, char *s);
int (*perform_osccal) (struct programmer_t * pgm); int (*perform_osccal) (struct programmer_t * pgm);
int (*parseextparams) (struct programmer_t * pgm, LISTID xparams);
char config_file[PATH_MAX]; /* config file where defined */ char config_file[PATH_MAX]; /* config file where defined */
int lineno; /* config file line number */ int lineno; /* config file line number */
char flag; /* for private use of the programmer */ char flag; /* for private use of the programmer */