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

Reply via email to