As Grant Edwards wrote:
> My JTAG chain consists of two devices: an MSP430 followed by an
> ATmega1281V.
The attached patch adds a -j option that allows adjusting JTAG
daisy-chain parameters. The argument to the option is a
comma-separated list of four numbers:
-j ub,ua,bb,ba
ub -- units before
ua -- units after
bb -- bits before
ba -- bits after
I cannot test it except by passing -j 0,0,0,0, and cross-checking that
specifying any other parameters results in the ICE being unable to
communicate with the target.
Documentation update is still missing.
--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL
http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
Index: jtagmkII.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/jtagmkII.c,v
retrieving revision 1.26
diff -u -u -r1.26 jtagmkII.c
--- jtagmkII.c 30 Jan 2007 13:41:53 -0000 1.26
+++ jtagmkII.c 5 Nov 2007 23:08:55 -0000
@@ -1109,6 +1109,24 @@
}
/*
+ * If daisy-chain information has been passed on, adjust the ICE
+ * parameters accordingly.
+ */
+ if (pgm->units_before > 0 || pgm->units_after > 0 ||
+ pgm->bits_before > 0 || pgm->bits_after > 0) {
+ unsigned char b[4];
+ b[0] = pgm->units_before;
+ b[1] = pgm->units_after;
+ b[2] = pgm->bits_before;
+ b[3] = pgm->bits_after;
+ if (jtagmkII_setparm(pgm, PAR_DAISY_CHAIN_INFO, b) < 0) {
+ fprintf(stderr, "%s: jtagmkII_initialize(): Failed to setup JTAG
chain\n",
+ progname);
+ return -1;
+ }
+ }
+
+ /*
* Must set the device descriptor before entering programming mode.
*/
jtagmkII_set_devdescr(pgm, p);
@@ -2026,6 +2044,7 @@
case PAR_OCD_VTARGET: size = 2; break;
case PAR_OCD_JTAG_CLK: size = 1; break;
case PAR_TIMERS_RUNNING: size = 1; break;
+ case PAR_DAISY_CHAIN_INFO: size = 4; break;
default:
fprintf(stderr, "%s: jtagmkII_setparm(): unknown parameter 0x%02x\n",
progname, parm);
Index: main.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/main.c,v
retrieving revision 1.128
diff -u -u -r1.128 main.c
--- main.c 29 Oct 2007 22:46:45 -0000 1.128
+++ main.c 5 Nov 2007 23:00:47 -0000
@@ -96,6 +96,7 @@
" -c <programmer> Specify programmer type.\n"
" -D Disable auto erase for flash memory\n"
" -i <delay> ISP Clock Delay [in microseconds]\n"
+ " -j <ub,ua,bb,ba> JTAG chain information\n"
" -P <port> Specify connection port.\n"
" -F Override invalid signature check.\n"
" -e Perform a chip erase.\n"
@@ -219,6 +220,35 @@
walk_avrparts(avrparts, list_avrparts_callback, &c);
}
+static int jtag_daisychain(PROGRAMMER * pgm, char *jtaginfo)
+{
+ char *cp;
+ unsigned long l;
+
+ l = strtoul(jtaginfo, &cp, 0);
+ if (*cp != ',' || cp[1] == '\0')
+ return -1;
+ pgm->units_before = l;
+ jtaginfo = cp + 1;
+ l = strtoul(jtaginfo, &cp, 0);
+ if (*cp != ',' || cp[1] == '\0')
+ return -1;
+ pgm->units_after = l;
+ jtaginfo = cp + 1;
+ l = strtoul(jtaginfo, &cp, 0);
+ if (*cp != ',' || cp[1] == '\0')
+ return -1;
+ pgm->bits_before = l;
+ jtaginfo = cp + 1;
+ l = strtoul(jtaginfo, &cp, 0);
+ if (*cp != '\0')
+ return -1;
+ pgm->bits_after = l;
+
+ return 0;
+}
+
+
/*
* main routine
*/
@@ -260,6 +290,7 @@
int ispdelay; /* Specify the delay for ISP clock */
int safemode; /* Enable safemode, 1=safemode on, 0=normal */
int silentsafe; /* Don't ask about fuses, 1=silent, 0=normal */
+ char * jtaginfo; /* JTAG daisy-chain information */
unsigned char safemode_lfuse = 0xff;
unsigned char safemode_hfuse = 0xff;
unsigned char safemode_efuse = 0xff;
@@ -324,7 +355,8 @@
ispdelay = 0;
safemode = 1; /* Safemode on by default */
silentsafe = 0; /* Ask by default */
-
+ jtaginfo = NULL;
+
if (isatty(STDIN_FILENO) == 0)
safemode = 0; /* Turn off safemode if this isn't a terminal */
@@ -372,7 +404,7 @@
/*
* 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:j:np:OP:qstU:uvVyY:")) != -1)
{
switch (ch) {
case 'b': /* override default programmer baud rate */
@@ -427,6 +459,10 @@
ovsigck = 1;
break;
+ case 'j': /* JTAG chain information */
+ jtaginfo = optarg; /* parsed later */
+ break;
+
case 'n':
nowrite = 1;
break;
@@ -623,6 +659,14 @@
exit(1);
}
+ if (jtaginfo && jtag_daisychain(pgm, jtaginfo) < 0) {
+ fprintf(stderr, "\n");
+ fprintf(stderr,
+ "%s: Invalid JTAG daisy-chain infor \"%s\"\n",
+ progname, jtaginfo);
+ exit(1);
+ }
+
if ((strcmp(pgm->type, "STK500") == 0) ||
(strcmp(pgm->type, "avr910") == 0) ||
(strcmp(pgm->type, "STK500V2") == 0) ||
Index: pgm.h
===================================================================
RCS file: /home/cvs/avrdude/avrdude/pgm.h,v
retrieving revision 1.34
diff -u -u -r1.34 pgm.h
--- pgm.h 30 Jan 2007 13:41:53 -0000 1.34
+++ pgm.h 5 Nov 2007 22:54:20 -0000
@@ -61,6 +61,7 @@
int baudrate;
double bitclock; /* JTAG ICE clock period in microseconds */
int ispdelay; /* ISP clock delay */
+ unsigned char units_before, units_after, bits_before, bits_after; /* JTAG
chain */
union filedescriptor fd;
int page_size; /* page size if the programmer supports paged write/load */
int (*rdy_led) (struct programmer_t * pgm, int value);
_______________________________________________
avrdude-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/avrdude-dev