aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>2014-02-27 22:23:58 +0100
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2014-05-09 19:27:50 +0000
commit4a4f716163c23c99e1b97ed6eecb0cacffb3ea0b (patch)
treef76f40b7489d49b4327ce50af6136aad3c84aadf
parent2eb8a31a6bc91a645ed6aa06752835f4c61cd703 (diff)
ftdi: Optimize GPIO toggling
Only send the new I/O state for the bytes that changed. Change-Id: I930edc9518e6019331e68e4756acc5e92dda25a4 Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/1999 Tested-by: jenkins Reviewed-by: Jens Bauer <jens@gpio.dk> Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
-rw-r--r--src/jtag/drivers/ftdi.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c
index 81b27c26..f427a6bd 100644
--- a/src/jtag/drivers/ftdi.c
+++ b/src/jtag/drivers/ftdi.c
@@ -174,14 +174,19 @@ static int ftdi_set_signal(const struct signal *s, char value)
return ERROR_FAIL;
}
+ uint16_t old_output = output;
+ uint16_t old_direction = direction;
+
output = data ? output | s->data_mask : output & ~s->data_mask;
if (s->oe_mask == s->data_mask)
direction = oe ? direction | s->oe_mask : direction & ~s->oe_mask;
else
output = oe ? output | s->oe_mask : output & ~s->oe_mask;
- mpsse_set_data_bits_low_byte(mpsse_ctx, output & 0xff, direction & 0xff);
- mpsse_set_data_bits_high_byte(mpsse_ctx, output >> 8, direction >> 8);
+ if ((output & 0xff) != (old_output & 0xff) || (direction & 0xff) != (old_direction & 0xff))
+ mpsse_set_data_bits_low_byte(mpsse_ctx, output & 0xff, direction & 0xff);
+ if ((output >> 8 != old_output >> 8) || (direction >> 8 != old_direction >> 8))
+ mpsse_set_data_bits_high_byte(mpsse_ctx, output >> 8, direction >> 8);
return ERROR_OK;
}