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>
This commit is contained in:
parent
2eb8a31a6b
commit
4a4f716163
|
@ -174,14 +174,19 @@ static int ftdi_set_signal(const struct signal *s, char value)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t old_output = output;
|
||||||
|
uint16_t old_direction = direction;
|
||||||
|
|
||||||
output = data ? output | s->data_mask : output & ~s->data_mask;
|
output = data ? output | s->data_mask : output & ~s->data_mask;
|
||||||
if (s->oe_mask == s->data_mask)
|
if (s->oe_mask == s->data_mask)
|
||||||
direction = oe ? direction | s->oe_mask : direction & ~s->oe_mask;
|
direction = oe ? direction | s->oe_mask : direction & ~s->oe_mask;
|
||||||
else
|
else
|
||||||
output = oe ? output | s->oe_mask : output & ~s->oe_mask;
|
output = oe ? output | s->oe_mask : output & ~s->oe_mask;
|
||||||
|
|
||||||
mpsse_set_data_bits_low_byte(mpsse_ctx, output & 0xff, direction & 0xff);
|
if ((output & 0xff) != (old_output & 0xff) || (direction & 0xff) != (old_direction & 0xff))
|
||||||
mpsse_set_data_bits_high_byte(mpsse_ctx, output >> 8, direction >> 8);
|
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;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue