diff options
author | Keith Packard <keithp@keithp.com> | 2014-04-04 23:38:40 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-04-05 00:22:30 -0700 |
commit | ca4b20f9781b1dc6974d26952973dfe0d607478c (patch) | |
tree | 434d89d5a3dd5124718807038829469c193efcba /ao-tools/lib | |
parent | 2424c0e6fe53789dc83d1e96439dcdc13e847b07 (diff) |
ao-tools: Wait for device to become ready instead of failing
For some reason, USB devices take 'a while' to become usable; instead
of bailing immediately, sit around waiting to see if the device
becomes usable if we get an EBUSY or EACCES error.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools/lib')
-rw-r--r-- | ao-tools/lib/cc-usb.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/ao-tools/lib/cc-usb.c b/ao-tools/lib/cc-usb.c index d7ac138c..a3a19d5c 100644 --- a/ao-tools/lib/cc-usb.c +++ b/ao-tools/lib/cc-usb.c @@ -412,19 +412,35 @@ cc_usb_close_remote(struct cc_usb *cc) static struct termios save_termios; +#include <errno.h> + struct cc_usb * cc_usb_open(char *tty) { struct cc_usb *cc; struct termios termios; + int i; if (!tty) tty = DEFAULT_TTY; cc = calloc (sizeof (struct cc_usb), 1); if (!cc) return NULL; - cc->fd = open(tty, O_RDWR | O_NONBLOCK); - if (cc->fd < 0) { + i = 0; + for (;;) { + cc->fd = open(tty, O_RDWR | O_NONBLOCK); + if (cc->fd >= 0) + break; + i++; + if (errno == EBUSY || errno == EPERM || errno == EACCES) { + fprintf(stderr, "open failed, pausing"); + perror(tty); + if (i < 20) { + sleep(3); + continue; + } + } + perror(tty); free (cc); return NULL; |