31 #include "freenect_internal.h"
33 int fnusb_init(
fnusb_ctx *ctx, freenect_usb_context *usb_ctx)
37 res = libusb_init(&ctx->ctx);
39 ctx->should_free_ctx = 1;
42 ctx->should_free_ctx = 0;
48 ctx->should_free_ctx = 0;
56 if (ctx->should_free_ctx) {
57 libusb_exit(ctx->ctx);
65 return libusb_handle_events(ctx->ctx);
70 dev->usb_cam.parent = dev;
76 ssize_t cnt = libusb_get_device_list (dev->parent->usb.ctx, &devs);
80 bool start_cam =
false, start_motor =
false;
82 int i = 0, nr_cam = 0, nr_mot = 0;
83 struct libusb_device_descriptor desc;
84 for (i = 0; i < cnt; ++i)
86 int r = libusb_get_device_descriptor (devs[i], &desc);
91 if (desc.idVendor == MS_MAGIC_VENDOR && desc.idProduct == MS_MAGIC_CAMERA_PRODUCT && !start_cam)
96 if (libusb_open (devs[i], &dev->usb_cam.dev) != 0)
99 if (!dev->usb_cam.dev)
101 int err = libusb_claim_interface (dev->usb_cam.dev, 0);
103 printf(
"Error claiming camera device: ");
104 if(err==LIBUSB_ERROR_NOT_FOUND){
105 printf(
"LIBUSB_ERROR_NOT_FOUND\n");
106 }
else if(err==LIBUSB_ERROR_BUSY){
107 printf(
"LIBUSB_ERROR_BUSY\n");
108 }
else if(err==LIBUSB_ERROR_NO_DEVICE){
109 printf(
"LIBUSB_ERROR_NO_DEVICE\n");
111 printf(
"Unknown error\n");
123 if (desc.idVendor == MS_MAGIC_VENDOR && desc.idProduct == MS_MAGIC_MOTOR_PRODUCT && !start_motor)
129 if (libusb_open (devs[i], &dev->usb_motor.dev) != 0)
132 if (!dev->usb_motor.dev)
134 int err = libusb_claim_interface (dev->usb_motor.dev, 0);
136 printf(
"Error claiming motor device: ");
137 if(err==LIBUSB_ERROR_NOT_FOUND){
138 printf(
"LIBUSB_ERROR_NOT_FOUND\n");
139 }
else if(err==LIBUSB_ERROR_BUSY){
140 printf(
"LIBUSB_ERROR_BUSY\n");
141 }
else if(err==LIBUSB_ERROR_NO_DEVICE){
142 printf(
"LIBUSB_ERROR_NO_DEVICE\n");
144 printf(
"Unknown error\n");
155 libusb_free_device_list (devs, 1);
157 if (start_cam && start_motor)
163 static void iso_callback(
struct libusb_transfer *xfer)
168 if(xfer->status == LIBUSB_TRANSFER_COMPLETED) {
169 uint8_t *buf = (
void*)xfer->buffer;
170 for (i=0; i<strm->pkts; i++) {
171 strm->cb(strm->parent->parent, buf, xfer->iso_packet_desc[i].actual_length);
174 libusb_submit_transfer(xfer);
176 printf(
"Xfer error: %d\n", xfer->status);
186 strm->num_xfers = xfers;
189 strm->buffer = malloc(xfers * pkts * len);
190 strm->xfers = malloc(
sizeof(
struct libusb_transfer*) * xfers);
192 uint8_t *bufp = strm->buffer;
194 for (i=0; i<xfers; i++) {
196 strm->xfers[i] = libusb_alloc_transfer(pkts);
198 libusb_fill_iso_transfer(strm->xfers[i], dev->dev, ep, bufp, pkts * len, pkts, iso_callback, strm, 0);
200 libusb_set_iso_packet_lengths(strm->xfers[i], len);
202 ret = libusb_submit_transfer(strm->xfers[i]);
203 if(ret==LIBUSB_ERROR_NO_DEVICE)
204 printf(
"Failed to submit xfer %d: LIBUSB_ERROR_NO_DEVICE\n",i);
205 else if(ret==LIBUSB_ERROR_BUSY)
206 printf(
"Failed to submit xfer %d: LIBUSB_ERROR_BUSY\n",i);
208 printf(
"Failed to submit xfer %d: %d\n", i, ret);
217 int fnusb_control(
fnusb_dev *dev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength)
219 return libusb_control_transfer(dev->dev, bmRequestType, bRequest, wValue, wIndex, data, wLength, 0);