diff options
author | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2014-02-27 22:23:58 +0100 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2014-05-09 19:27:50 +0000 |
commit | 4a4f716163c23c99e1b97ed6eecb0cacffb3ea0b (patch) | |
tree | f76f40b7489d49b4327ce50af6136aad3c84aadf | |
parent | 2eb8a31a6bc91a645ed6aa06752835f4c61cd703 (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.c | 9 |
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; } |