ftdi: Optimize GPIO toggling 99/1999/3
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>
Thu, 27 Feb 2014 21:23:58 +0000 (22:23 +0100)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Fri, 9 May 2014 19:27:50 +0000 (19:27 +0000)
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>
src/jtag/drivers/ftdi.c

index 81b27c2..f427a6b 100644 (file)
@@ -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;
 }