This puts the bit count into the tms_seq table and adds the function:
int tap_get_tms_path_len( tap_state_t from, tap_state_t to )
It may break the ft2232 driver, but I have a fix coming for that in
about 6 hours. I have it written but have to run out for awhile to hit
some tennis balls.
I have the ft2232 driver using the bit count.
Dick
Index: src/jtag/jtag.h
===================================================================
--- src/jtag/jtag.h (revision 1548)
+++ src/jtag/jtag.h (working copy)
@@ -181,7 +181,26 @@
*/
int tap_get_tms_path(tap_state_t from, tap_state_t to);
+
/**
+ * Function int tap_get_tms_path_len
+ * returns the total number of bits that represents a TMS path
+ * transition as given by the function tap_get_tms_path().
+ *
+ * For at least one interface (JLink) it's not OK to simply "pad" TMS sequences
+ * to fit a whole byte. (I suspect this is a general TAP problem within OOCD.)
+ * Padding TMS causes all manner of instability that's not easily
+ * discovered. Using this routine we can apply EXACTLY the state transitions
+ * required to make something work - no more - no less.
+ *
+ * @param from is the starting state
+ * @param to is the resultant or final state
+ * @return int - the total number of bits in a transition.
+ */
+int tap_get_tms_path_len(tap_state_t from, tap_state_t to);
+
+
+/**
* Function tap_move_ndx
* when given a stable state, returns an index from 0-5. The index corresponds to a
* sequence of stable states which are given in this order: <p>
Index: src/jtag/jtag.c
===================================================================
--- src/jtag/jtag.c (revision 1548)
+++ src/jtag/jtag.c (working copy)
@@ -1245,7 +1245,7 @@
bit_count = 0;
#ifdef _DEBUG_JTAG_IO_
- LOG_DEBUG("num_fields: %i",cmd->num_fields);
+ LOG_DEBUG("%s num_fields: %i", cmd->ir_scan ? "IRSCAN" : "DRSCAN", cmd->num_fields);
#endif
for (i = 0; i < cmd->num_fields; i++)
@@ -1261,10 +1261,20 @@
free(char_buf);
#endif
}
+ else
+ {
+#ifdef _DEBUG_JTAG_IO_
+ LOG_DEBUG("fields[%i].out_value[%i]: NULL", i, cmd->fields[i].num_bits);
+#endif
+ }
bit_count += cmd->fields[i].num_bits;
}
+#ifdef _DEBUG_JTAG_IO_
+ //LOG_DEBUG("bit_count totalling: %i", bit_count );
+#endif
+
return bit_count;
}
@@ -3079,31 +3089,104 @@
return ndx;
}
+
+/* tap_move[i][j]: tap movement command to go from state i to state j
+ * 0: Test-Logic-Reset
+ * 1: Run-Test/Idle
+ * 2: Shift-DR
+ * 3: Pause-DR
+ * 4: Shift-IR
+ * 5: Pause-IR
+ *
+ * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
+ */
+static struct
+{
+ u8 bits;
+ u8 bit_count;
+
+} tms_seqs[6][6] = /* [from_state_ndx][to_state_ndx] */
+{
+ /* value clocked to TMS to move from one of six stable states to another.
+ * N.B. OOCD clocks TMS from LSB first, so read these right-to-left.
+ * N.B. These values are tightly bound to the table in tap_get_tms_path_len().
+ * N.B. Reset only needs to be 0b11111, but in JLink an even byte of 1's is more stable.
+ * These extra ones cause no TAP state problem, because we go into reset and stay in reset.
+ */
+
+#if 0 /* keeping old stuff for awhile, for reference */
+ /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */
+ { 0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16 }, /* RESET */
+ { 0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b }, /* IDLE */
+ { 0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f }, /* DRSHIFT */
+ { 0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f }, /* DRPAUSE */
+ { 0x7f, 0x31, 0x07, 0x17, 0x00, 0x01 }, /* IRSHIFT */
+ { 0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f } /* IRPAUSE */
+#endif
+
+
+/*
+ * These macros allow us to specify TMS state transitions by bits rather than hex bytes.
+ * Read the bits from LSBit first to MSBit last (right-to-left).
+ */
+#define HEX__(n) 0x##n##LU
+
+#define B8__(x) \
+ (((x) & 0x0000000FLU)?(1<<0):0) \
+ +(((x) & 0x000000F0LU)?(1<<1):0) \
+ +(((x) & 0x00000F00LU)?(1<<2):0) \
+ +(((x) & 0x0000F000LU)?(1<<3):0) \
+ +(((x) & 0x000F0000LU)?(1<<4):0) \
+ +(((x) & 0x00F00000LU)?(1<<5):0) \
+ +(((x) & 0x0F000000LU)?(1<<6):0) \
+ +(((x) & 0xF0000000LU)?(1<<7):0)
+
+#define B8(bits,count) { ((u8)B8__(HEX__(bits))), (count) }
+
+ /* this is the table submitted by Jeff Williams on 3/30/2009 with this comment:
+
+ OK, I added Peter's version of the state table, and it works OK for
+ me on MC1322x. I've recreated the jlink portion of patch with this
+ new state table. His changes to my state table are pretty minor in
+ terms of total transitions, but Peter feels that his version fixes
+ some long-standing problems.
+ Jeff
+
+ I added the bit count into the table
+ Dick
+ */
+
+ /* to state: */
+ /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
+ { B8(11111111,8), B8(0,1), B8(0010,4), B8(01010,5), B8(00110,5), B8(010110,6) }, /* RESET */
+ { B8(11111111,8), B8(0,1), B8(001,4), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */
+ { B8(11111111,8), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */
+ { B8(11111111,8), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */
+ { B8(11111111,8), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */
+ { B8(11111111,8), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */
+};
+
+
int tap_get_tms_path( tap_state_t from, tap_state_t to )
{
- /* tap_move[i][j]: tap movement command to go from state i to state j
- * 0: Test-Logic-Reset
- * 1: Run-Test/Idle
- * 2: Shift-DR
- * 3: Pause-DR
- * 4: Shift-IR
- * 5: Pause-IR
- *
- * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
- */
- static const u8 tms_seqs[6][6] =
+ if( !tap_is_state_stable(from) )
{
- /* value clocked to TMS to move from one of six stable states to another */
+ LOG_ERROR( "fatal: tap_state \"from\" (=%s) is not stable", tap_state_name(from) );
+ exit(1);
+ }
- /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */
- { 0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16 }, /* RESET */
- { 0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b }, /* IDLE */
- { 0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f }, /* DRSHIFT */
- { 0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f }, /* DRPAUSE */
- { 0x7f, 0x31, 0x07, 0x17, 0x00, 0x01 }, /* IRSHIFT */
- { 0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f } /* IRPAUSE */
- };
+ if( !tap_is_state_stable(to) )
+ {
+ LOG_ERROR( "fatal: tap_state \"to\" (=%s) is not stable", tap_state_name(to) );
+ exit(1);
+ }
+ return tms_seqs[tap_move_ndx(from)][tap_move_ndx(to)].bits;
+}
+
+
+int tap_get_tms_path_len( tap_state_t from, tap_state_t to )
+{
if( !tap_is_state_stable(from) )
{
LOG_ERROR( "fatal: tap_state \"from\" (=%s) is not stable", tap_state_name(from) );
@@ -3116,8 +3199,7 @@
exit(1);
}
- /* @todo: support other than 7 clocks ? */
- return tms_seqs[tap_move_ndx(from)][tap_move_ndx(to)];
+ return tms_seqs[tap_move_ndx(from)][tap_move_ndx(to)].bit_count;
}
@@ -3250,7 +3332,7 @@
switch( state )
{
case TAP_RESET: ret = "RESET"; break;
- case TAP_IDLE: ret = "RUN/IDLE"; break;
+ case TAP_IDLE: ret = "RUN/IDLE"; break;
case TAP_DRSELECT: ret = "DRSELECT"; break;
case TAP_DRCAPTURE: ret = "DRCAPTURE"; break;
case TAP_DRSHIFT: ret = "DRSHIFT"; break;
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development