diff options
author | Keith Packard <keithp@keithp.com> | 2009-09-04 15:01:32 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2009-09-04 15:01:32 -0700 |
commit | 332b056459b1352e233a8bf5f08498df12d32160 (patch) | |
tree | 092c78a014572920ac8d382f4a6d41033fd7b9f5 /ao-tools/lib/cc-usb.c | |
parent | df88ae4c5f229efcc0ea5cb0a81fc2bb8f96fea2 (diff) |
'fix' ao-eeprom to read two blocks at once. Work around kernel bugs.
The kernel appears to leave serial data undelivered at times. Reading
two blocks at once appears to make it relinquish the queued data.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools/lib/cc-usb.c')
-rw-r--r-- | ao-tools/lib/cc-usb.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/ao-tools/lib/cc-usb.c b/ao-tools/lib/cc-usb.c index 81309983..17f05911 100644 --- a/ao-tools/lib/cc-usb.c +++ b/ao-tools/lib/cc-usb.c @@ -157,7 +157,8 @@ cc_usb_dbg(int indent, uint8_t *bytes, int len) /* * Flush pending writes, fill pending reads */ -void + +int cc_usb_sync(struct cc_usb *cc) { int ret; @@ -167,7 +168,7 @@ cc_usb_sync(struct cc_usb *cc) fds.fd = cc->fd; for (;;) { if (cc->read_count || cc->out_count) - timeout = -1; + timeout = 5000; else timeout = 0; fds.events = 0; @@ -176,8 +177,13 @@ cc_usb_sync(struct cc_usb *cc) if (cc->out_count) fds.events |= POLLOUT; ret = poll(&fds, 1, timeout); - if (ret == 0) + if (ret == 0) { + if (timeout) { + fprintf(stderr, "USB link timeout\n"); + exit(1); + } break; + } if (ret < 0) { perror("poll"); break; |