ao-tools/ao-list: Show devices that have no TTY
[fw/altos] / ao-tools / lib / cc-usbdev.c
index ed39c0628c955deb5c1d28bd528ad842e5590745..6c3ba5910b3602465e918dc38f7bcec04d700e9f 100644 (file)
@@ -132,11 +132,23 @@ usb_tty(char *sys)
                        /* Check for tty/ttyACMx style names
                         */
                        tty_dir = cc_fullname(endpoint_full, "tty");
-                       free(endpoint_full);
                        ntty = scandir(tty_dir, &namelist,
                                       dir_filter_tty,
                                       alphasort);
                        free (tty_dir);
+                       if (ntty > 0) {
+                               tty = cc_fullname("/dev", namelist[0]->d_name);
+                               free(endpoint_full);
+                               free(namelist);
+                               return tty;
+                       }
+
+                       /* Check for ttyACMx style names
+                        */
+                       ntty = scandir(endpoint_full, &namelist,
+                                      dir_filter_tty,
+                                      alphasort);
+                       free(endpoint_full);
                        if (ntty > 0) {
                                tty = cc_fullname("/dev", namelist[0]->d_name);
                                free(namelist);
@@ -197,8 +209,17 @@ dir_filter_dev(const struct dirent *d)
        return 1;
 }
 
+static int
+is_am(int idVendor, int idProduct) {
+       if (idVendor == 0xfffe)
+               return 1;
+       if (idVendor == 0x0403 && idProduct == 0x6015)
+               return 1;
+       return 0;
+}
+
 struct cc_usbdevs *
-cc_usbdevs_scan(void)
+cc_usbdevs_scan(int non_tty)
 {
        int                     e;
        struct dirent           **ents;
@@ -220,10 +241,10 @@ cc_usbdevs_scan(void)
                dir = cc_fullname(USB_DEVICES, ents[e]->d_name);
                dev = usb_scan_device(dir);
                free(dir);
-               if (dev->idVendor == 0xfffe && dev->tty) {
+               if (is_am(dev->idVendor, dev->idProduct) && (non_tty || dev->tty)) {
                        if (devs->dev)
                                devs->dev = realloc(devs->dev,
-                                                   devs->ndev + 1 * sizeof (struct usbdev *));
+                                                   (devs->ndev + 1) * sizeof (struct usbdev *));
                        else
                                devs->dev = malloc (sizeof (struct usbdev *));
                        devs->dev[devs->ndev++] = dev;
@@ -253,12 +274,12 @@ match_dev(char *product, int serial)
        int                     i;
        char                    *tty = NULL;
 
-       devs = cc_usbdevs_scan();
+       devs = cc_usbdevs_scan(FALSE);
        if (!devs)
                return NULL;
        for (i = 0; i < devs->ndev; i++) {
                dev = devs->dev[i];
-               if (product && strcmp (product, dev->product) != 0)
+               if (product && strncmp (product, dev->product, strlen(product)) != 0)
                        continue;
                if (serial && serial != dev->serial)
                        continue;