struct xusb *xusb_open_one(const struct xusb_spec *specs, int numspecs, xusb_filter_t filterfunc, void *data) { struct xlist_node *xusb_list; struct xlist_node *curr; int num; struct xusb *xusb = NULL; xusb_list = xusb_find_byproduct(specs, numspecs, filterfunc, data); num = xlist_length(xusb_list); DBG("total %d devices\n", num); switch(num) { case 0: ERR("No matching device.\n"); break; case 1: curr = xlist_shift(xusb_list); xusb = curr->data; xlist_destroy(curr, NULL); xlist_destroy(xusb_list, NULL); xusb_claim_interface(xusb); xusb_showinfo(xusb); break; default: ERR("Too many devices (%d). Aborting.\n", num); break; } return xusb; }
/* * USB handling */ struct astribank_device *astribank_open(const char devpath[], int iface_num) { struct astribank_device *astribank = NULL; struct xusb *xusb; DBG("devpath='%s' iface_num=%d\n", devpath, iface_num); if((astribank = malloc(sizeof(struct astribank_device))) == NULL) { ERR("Out of memory\n"); goto fail; } memset(astribank, 0, sizeof(*astribank)); if (iface_num) { xusb = xusb_find_bypath(astribank_specs, ARRAY_SIZE(astribank_specs), devpath); } else { xusb = xusb_find_bypath(astribank_pic_specs, ARRAY_SIZE(astribank_pic_specs), devpath); } if (!xusb) { ERR("%s: No device found\n", __func__); goto fail; } astribank->xusb = xusb; astribank->is_usb2 = (xusb_packet_size(xusb) == 512); astribank->my_interface_num = iface_num; if (xusb_claim_interface(astribank->xusb) < 0) { ERR("xusb_claim_interface failed\n"); goto fail; } astribank->tx_sequenceno = 1; return astribank; fail: if (astribank) { free(astribank); astribank = NULL; } return NULL; }