From: Andreas Fritiofson Date: Thu, 27 Feb 2014 21:23:58 +0000 (+0100) Subject: ftdi: Optimize GPIO toggling X-Git-Tag: v0.9.0-rc1~417 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=4a4f716163c23c99e1b97ed6eecb0cacffb3ea0b ftdi: Optimize GPIO toggling Only send the new I/O state for the bytes that changed. Change-Id: I930edc9518e6019331e68e4756acc5e92dda25a4 Signed-off-by: Andreas Fritiofson Reviewed-on: http://openocd.zylin.com/1999 Tested-by: jenkins Reviewed-by: Jens Bauer Reviewed-by: Freddie Chopin --- diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c index 81b27c26f1..f427a6bdc3 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; }