isochronous transfer for UVC camera
SAITOU Toshihide
toshi at ruby.ocn.ne.jp
Thu Nov 1 11:40:43 UTC 2012
In message: <20121030.231917.104031274.toshi at ruby.ocn.ne.jp>
SAITOU Toshihide <toshi at ruby.ocn.ne.jp> writes:
> In message: <201210301446.43464.hselasky at c2i.net>
> Hans Petter Selasky <hselasky at c2i.net> writes:
>> On Tuesday 30 October 2012 14:31:38 SAITOU Toshihide wrote:
>>> Is this true about these functions below?
>>
>> Alternate setting is supported, though if the interface does not exist or has
>> already the programmed alternate setting, it will simply do nothing.
>
> I have no idea...
>
> I will build the kernel tomorrow to remove the ugen driver which is
> deactivated in the code though.
Ugen is not separable and not related.
Now I have got the data from UVC cam, \(^-^)/ not yet
examine though.
Thank you HPS for your useful information.
#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>
#define VID 0x0458
#define PID 0x7081
#define ConfVal 1 // Configuration Value
#define IfNum 1 // Interface Number
#define AltIfNum 1 // Alternate Interface Number
#define PKT_LEN 0xc00
#define PKTS_PER_XFER 0x80
#define TIMEOUT 10 // 10 ms
static void cb(struct libusb_transfer *xfer)
{
printf("\nReceived.\n"); // xfer->buffer
libusb_submit_transfer(xfer); // repeat
}
int main( int argc, char **argv)
{
libusb_context *ctx = NULL;
libusb_device *dev = NULL;
libusb_device_handle *handle;
struct libusb_config_descriptor *confDesc;
int numInterfaces;
uint8_t buf[64];
int i;
// get cam device
libusb_init(&ctx);
handle = libusb_open_device_with_vid_pid(ctx, VID, PID);
dev = libusb_get_device(handle);
// if kernel driver is active, detach a kernel driver.
libusb_get_config_descriptor(dev, ConfVal, &confDesc);
numInterfaces = (int)confDesc->bNumInterfaces;
for (i=0; i<numInterfaces; i++)
{
if (libusb_kernel_driver_active(handle, i) == 1)
{
printf("Detaching kernel driver for interface %d.\n", i);
if (libusb_detach_kernel_driver(handle, i) != 0)
{
fprintf(stderr, "detach failed.\n");
}
}
}
// set the active configuration.
libusb_set_configuration(handle, ConfVal);
// claim an interface in a given libusb_handle.
libusb_claim_interface(handle, 0);
// negotiate parameters here.
// claim an interface in a given libusb_handle.
libusb_claim_interface(handle, IfNum);
// activate an alternate setting for an interface.
libusb_set_interface_alt_setting(handle, IfNum, AltIfNum);
// do an isochronous transfer.
struct libusb_transfer *xfer = libusb_alloc_transfer(PKTS_PER_XFER);
uint8_t *data = malloc(PKT_LEN*PKTS_PER_XFER);
libusb_fill_iso_transfer(
xfer, handle, 0x82, // Interface 1 Alt 1 Endpoint 0 Address 0x82
data, PKT_LEN*PKTS_PER_XFER, PKTS_PER_XFER,
cb, NULL, TIMEOUT);
libusb_set_iso_packet_lengths(xfer, PKT_LEN);
// submit transfer.
libusb_submit_transfer(xfer);
while (1) {
libusb_handle_events(ctx);
}
}
---
SAITOU Toshihide
More information about the freebsd-usb
mailing list