On 02/06/2010 08:12 AM, Arnim Läuger wrote:
I could change URJ_TAP_CABLE_CLOCK to use the new semantics of
arg.clock.tms if we had only ft2232 cables. But I'm not sure we can also
change that for usbblaster and generic cables or there is any benefits
for those cables. I see URJ_TAP_CABLE_CLOCK_COMPACT as a ft2232 specific
action. It is only generated in ft2232 cable drivers and gets handled
there. So it will not affect the upper layers.
Ok, guess it's clear to me now. I also see a performance improvement of
up to 20% for certain tasks. So from my side it would be fine to
introduce this patch in trunk.
Thanks. I have committed the attached revision of the patch. Compared to
the last revision, it sets cable->params->signals in
ft2232_compact_schedule.
Jie
* include/urjtag/cable.h (enum action): Add URJ_TAP_CABLE_CLOCK_COMPACT.
* src/tap/cable/generic.c (do_one_queued_action): Handle
URJ_TAP_CABLE_CLOCK_COMPACT to turn off GCC warning.
* src/tap/cable/ft2232.c (ft2232_clock_compact_schedule): New.
(ft2232_flush): Compact consecutive clocks.
Index: include/urjtag/cable.h
===================================================================
--- include/urjtag/cable.h (revision 1759)
+++ include/urjtag/cable.h (working copy)
@@ -102,6 +102,7 @@ struct URJ_CABLE_QUEUE
enum
{
URJ_TAP_CABLE_CLOCK,
+ URJ_TAP_CABLE_CLOCK_COMPACT,
URJ_TAP_CABLE_GET_TDO,
URJ_TAP_CABLE_TRANSFER,
URJ_TAP_CABLE_SET_SIGNAL,
Index: src/tap/cable/generic.c
===================================================================
--- src/tap/cable/generic.c (revision 1759)
+++ src/tap/cable/generic.c (working copy)
@@ -177,6 +177,8 @@ do_one_queued_action (urj_cable_t *cable
cable->driver->get_signal (cable,
cable->todo.data[i].arg.value.sig);
break;
+ case URJ_TAP_CABLE_CLOCK_COMPACT: /* Turn off GCC warning */
+ break;
}
urj_log (URJ_LOG_LEVEL_DETAIL, "do_one_queued done\n");
Index: src/tap/cable/ft2232.c
===================================================================
--- src/tap/cable/ft2232.c (revision 1759)
+++ src/tap/cable/ft2232.c (working copy)
@@ -1255,6 +1255,29 @@ ft2232_clock_schedule (urj_cable_t *cabl
static void
+ft2232_clock_compact_schedule (urj_cable_t *cable, int length, uint8_t byte)
+{
+ params_t *params = (params_t *)cable->params;
+ urj_tap_cable_cx_cmd_root_t *cmd_root = &(params->cmd_root);
+
+ urj_tap_cable_cx_cmd_queue (cmd_root, 0);
+ /* Clock Data to TMS/CS Pin (no Read) */
+ urj_tap_cable_cx_cmd_push (cmd_root, MPSSE_WRITE_TMS |
+ MPSSE_LSB | MPSSE_BITMODE |
+ MPSSE_WRITE_NEG );
+ urj_tap_cable_cx_cmd_push (cmd_root, length);
+ urj_tap_cable_cx_cmd_push (cmd_root, byte);
+
+ params->signals &= ~(URJ_POD_CS_TMS | URJ_POD_CS_TDI | URJ_POD_CS_TCK);
+ if (byte >> length)
+ params->signals |= URJ_POD_CS_TMS;
+ if (byte >> 7)
+ params->signals |= URJ_POD_CS_TDI;
+ // if (tck) params->signals |= URJ_POD_CS_TCK;
+}
+
+
+static void
ft2232_clock (urj_cable_t *cable, int tms, int tdi, int n)
{
params_t *params = (params_t *) cable->params;
@@ -1627,6 +1650,12 @@ ft2232_flush (urj_cable_t *cable, urj_ca
int last_tdo_valid_schedule = params->last_tdo_valid;
int last_tdo_valid_finish = params->last_tdo_valid;
+ if (cable->todo.num_items == 1
+ && cable->todo.data[cable->todo.next_item].action
+ == URJ_TAP_CABLE_CLOCK_COMPACT
+ && how_much != URJ_TAP_CABLE_COMPLETELY)
+ break;
+
for (j = i = cable->todo.next_item, n = 0; n < cable->todo.num_items;
n++)
{
@@ -1634,12 +1663,68 @@ ft2232_flush (urj_cable_t *cable, urj_ca
switch (cable->todo.data[i].action)
{
case URJ_TAP_CABLE_CLOCK:
- ft2232_clock_schedule (cable,
- cable->todo.data[i].arg.clock.tms,
- cable->todo.data[i].arg.clock.tdi,
- cable->todo.data[i].arg.clock.n);
- last_tdo_valid_schedule = 0;
- break;
+ case URJ_TAP_CABLE_CLOCK_COMPACT:
+ {
+ int tdi = cable->todo.data[i].arg.clock.tdi ? 1 << 7 : 0;
+ int length = 0;
+ uint8_t byte = 0;
+ int tms = 0;
+ int cn = 0;
+
+ if (cable->todo.data[i].action == URJ_TAP_CABLE_CLOCK_COMPACT)
+ {
+ length = cable->todo.data[i].arg.clock.n;
+ byte = cable->todo.data[i].arg.clock.tms;
+ }
+
+ more_cable_clock:
+
+ if (cable->todo.data[i].action == URJ_TAP_CABLE_CLOCK)
+ {
+ tms = cable->todo.data[i].arg.clock.tms ? 1 : 0;
+ cn = cable->todo.data[i].arg.clock.n;
+ }
+ while (cn > 0)
+ {
+ byte |= tms << length;
+ cn--;
+ length++;
+ if (length == 7)
+ {
+ ft2232_clock_compact_schedule (cable, 6, byte | tdi);
+ length = 0;
+ byte = 0;
+ }
+ }
+ if (n + 1 < cable->todo.num_items
+ && cable->todo.data[(i + 1) % cable->todo.max_items].action == URJ_TAP_CABLE_CLOCK
+ && (cable->todo.data[(i + 1) % cable->todo.max_items].arg.clock.tdi ? 1 << 7 : 0) == tdi)
+ {
+ i++;
+ if (i >= cable->todo.max_items)
+ i = 0;
+ n++;
+ goto more_cable_clock;
+ }
+ if (length)
+ {
+ if (n + 1 < cable->todo.num_items
+ || how_much == URJ_TAP_CABLE_COMPLETELY)
+ ft2232_clock_compact_schedule (cable, length - 1, byte | tdi);
+ else
+ {
+ cable->todo.data[i].action = URJ_TAP_CABLE_CLOCK_COMPACT;
+ cable->todo.data[i].arg.clock.tms = byte;
+ cable->todo.data[i].arg.clock.n = length;
+ i--;
+ if (i == -1)
+ i = cable->todo.max_items;
+ }
+ }
+
+ last_tdo_valid_schedule = 0;
+ break;
+ }
case URJ_TAP_CABLE_GET_TDO:
if (!last_tdo_valid_schedule)
@@ -1697,6 +1782,20 @@ ft2232_flush (urj_cable_t *cable, urj_ca
params->last_tdo_valid = last_tdo_valid_finish = 0;
break;
}
+ case URJ_TAP_CABLE_CLOCK_COMPACT:
+ {
+ post_signals &=
+ ~(URJ_POD_CS_TCK | URJ_POD_CS_TDI | URJ_POD_CS_TMS);
+ post_signals |=
+ ((cable->todo.data[j].arg.clock.
+ tms >> cable->todo.data[j].arg.clock.
+ n) ? URJ_POD_CS_TMS : 0);
+ post_signals |=
+ (cable->todo.data[j].arg.clock.
+ tdi ? URJ_POD_CS_TDI : 0);
+ params->last_tdo_valid = last_tdo_valid_finish = 0;
+ break;
+ }
case URJ_TAP_CABLE_GET_TDO:
{
int tdo;
------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
UrJTAG-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/urjtag-development