transport_t olimex_open(const char *devpath, const char *requested_serial) { struct olimex_transport *tr = malloc(sizeof(*tr)); struct usb_device *dev; char buf[64]; if (!tr) { pr_error(__FILE__": can't allocate memory"); return NULL; } tr->base.destroy = usbtr_destroy; tr->base.send = usbtr_send; tr->base.recv = usbtr_recv; usb_init(); usb_find_busses(); usb_find_devices(); if (devpath) { dev = usbutil_find_by_loc(devpath); } else { dev = usbutil_find_by_id(USB_FET_VENDOR, V1_PRODUCT, requested_serial); if (!dev) dev = usbutil_find_by_id(USB_FET_VENDOR, V2_PRODUCT, requested_serial); } if (!dev) { free(tr); return NULL; } if (open_device(tr, dev) < 0) { printc_err(__FILE__ ": failed to open Olimex device\n"); return NULL; } /* Flush out lingering data */ while (usb_bulk_read(tr->handle, tr->in_ep, buf, sizeof(buf), 100) > 0); return (transport_t)tr; }
transport_t rf2500_open(const char *devpath, const char *requested_serial) { struct rf2500_transport *tr = malloc(sizeof(*tr)); struct usb_device *dev; char buf[64]; if (!tr) { pr_error("rf2500: can't allocate memory"); return NULL; } tr->base.destroy = usbtr_destroy; tr->base.send = usbtr_send; tr->base.recv = usbtr_recv; usb_init(); usb_find_busses(); usb_find_devices(); if (devpath) dev = usbutil_find_by_loc(devpath); else dev = usbutil_find_by_id(USB_FET_VENDOR, USB_FET_PRODUCT, requested_serial); if (!dev) { free(tr); return NULL; } if (open_device(tr, dev) < 0) { printc_err("rf2500: failed to open RF2500 device\n"); return NULL; } /* Flush out lingering data. * * The timeout apparently doesn't work on OS/X, and this loop * just hangs once the endpoint buffer empties. */ #ifndef __APPLE__ while (usb_bulk_read(tr->handle, USB_FET_IN_EP, buf, sizeof(buf), 100) > 0); #endif return (transport_t)tr; }
transport_t cp210x_open(const char *devpath, const char *requested_serial, int baud_rate, uint16_t product, uint16_t vendor) { struct cp210x_transport *tr = malloc(sizeof(*tr)); struct usb_device *dev; if (!tr) { pr_error(__FILE__": can't allocate memory"); return NULL; } tr->base.ops = &cp210x_class; usb_init(); usb_find_busses(); usb_find_devices(); if (devpath) dev = usbutil_find_by_loc(devpath); else dev = usbutil_find_by_id(product, vendor, requested_serial); if (!dev) { free(tr); return NULL; } if (open_device(tr, dev, baud_rate) < 0) { printc_err(__FILE__ ": failed to open CP210X device\n"); free(tr); return NULL; } usbtr_flush(&tr->base); return (transport_t)tr; }
transport_t bslhid_open(const char *dev_path, const char *requested_serial) { struct bslhid_transport *tr = malloc(sizeof(*tr)); struct usb_device *dev; if (!tr) { pr_error("bslhid: can't allocate memory"); return NULL; } memset(tr, 0, sizeof(*tr)); tr->base.ops = &bslhid_transport_class; usb_init(); usb_find_busses(); usb_find_devices(); if (dev_path) dev = usbutil_find_by_loc(dev_path); else dev = usbutil_find_by_id(BSLHID_VID, BSLHID_PID, requested_serial); if (!dev) { free(tr); return NULL; } if (open_device(tr, dev) < 0) { printc_err("bslhid: failed to open BSL HID device\n"); free(tr); return NULL; } bslhid_flush(&tr->base); return &tr->base; }