ao-tools: Wait for device to become ready instead of failing
[fw/altos] / ao-tools / lib / cc-usb.c
index 485583f98b3897c1816547ffc4b7ae95ee32a6b1..a3a19d5cda58c875fce4c0dc90d54d15013fa3a2 100644 (file)
@@ -123,9 +123,10 @@ cc_handle_hex_read(struct cc_usb *cc)
 static void
 cc_usb_dbg(int indent, uint8_t *bytes, int len)
 {
-       int     eol = 1;
+       static int      eol = 1;
        int     i;
        uint8_t c;
+       ccdbg_debug(CC_DEBUG_BITBANG, "<<<%d bytes>>>", len);
        while (len--) {
                c = *bytes++;
                if (eol) {
@@ -135,10 +136,12 @@ cc_usb_dbg(int indent, uint8_t *bytes, int len)
                }
                switch (c) {
                case '\r':
-                       ccdbg_debug(CC_DEBUG_BITBANG, "^M");
+                       ccdbg_debug(CC_DEBUG_BITBANG, "\\r");
                        break;
                case '\n':
                        eol = 1;
+                       ccdbg_debug(CC_DEBUG_BITBANG, "\\n\n");
+                       break;
                default:
                        if (c < ' ' || c > '~')
                                ccdbg_debug(CC_DEBUG_BITBANG, "\\%02x", c);
@@ -193,7 +196,6 @@ _cc_usb_sync(struct cc_usb *cc, int wait_for_input)
                        ret = read(cc->fd, cc->in_buf + cc->in_count,
                                   CC_IN_BUF - cc->in_count);
                        if (ret > 0) {
-                               int i;
                                cc_usb_dbg(24, cc->in_buf + cc->in_count, ret);
                                cc->in_count += ret;
                                if (cc->hex_count)
@@ -410,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;