From 9fd63972758d6d5572f7bcaadec9b1c0e974a2e8 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 7 Mar 2009 21:05:40 -0800 Subject: [PATCH] Only flip changing bits in async mode --- lib/cp-usb-async.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/cp-usb-async.c b/lib/cp-usb-async.c index 3f5f76ab..1fe09aad 100644 --- a/lib/cp-usb-async.c +++ b/lib/cp-usb-async.c @@ -38,6 +38,8 @@ struct cp_usb_async { libusb_device_handle *handle; struct cp_usb_packet packet[MAX_OUTSTANDING]; int p, ack; + uint8_t value; + uint8_t set; }; struct cp_usb_async * @@ -56,11 +58,14 @@ cp_usb_async_open(void) } cp->handle = libusb_open_device_with_vid_pid(cp->ctx, 0x10c4, 0xea60); + cp->ack = -1; if (!cp->handle) { libusb_exit(cp->ctx); free(cp); return NULL; } + cp->value = 0; + cp->set = 0; return cp; } @@ -103,9 +108,16 @@ void cp_usb_async_write(struct cp_usb_async *cp, uint8_t mask, uint8_t value) { int p; - uint16_t gpio_set = ((uint16_t) value << 8) | mask; + uint16_t gpio_set; int ret; + if (cp->set) { + value = (cp->value & ~mask) | (value & mask); + mask = value ^ cp->value; + } + cp->set = 1; + cp->value = value; + gpio_set = ((uint16_t) value << 8) | mask; if (cp->p == MAX_OUTSTANDING) cp_usb_async_sync(cp); p = cp->p; @@ -172,5 +184,5 @@ cp_usb_async_sync(struct cp_usb_async *cp) libusb_handle_events(cp->ctx); } cp->p = 0; - cp->ack = 0; + cp->ack = -1; } -- 2.30.2