summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDaniel Drake <dsd@gentoo.org>2008-03-09 00:58:09 +0000
committerDaniel Drake <dsd@gentoo.org>2008-03-09 00:58:09 +0000
commit66348c90ea4570bf999ac301089e006d0cce1926 (patch)
tree6583cebef6f99fa7ec5f65a02f0721ae45c8bb99 /examples
parentd21ebe47ce578c93cd8969be1c933d503e32e5d4 (diff)
downloadlibusb-66348c90ea4570bf999ac301089e006d0cce1926.tar.gz
Separate transfer allocation and submission
Leads to some hefty API changes. Now we're much more similar to the Linux kernel model. Problems with dealing with asynchronous control transfers are passed on to the user, basically you must allocate a buffer, start with the setup, and put the data after. This won't make much sense until documented (soon...)
Diffstat (limited to 'examples')
-rw-r--r--examples/dpfp.c186
1 files changed, 75 insertions, 111 deletions
diff --git a/examples/dpfp.c b/examples/dpfp.c
index 880b3a2..0c2806e 100644
--- a/examples/dpfp.c
+++ b/examples/dpfp.c
@@ -46,8 +46,8 @@ enum {
};
static int next_state(void);
-static int submit_irq_urb(void);
-static int submit_img_urb(void);
+static int submit_irq_transfer(void);
+static int submit_img_transfer(void);
enum {
STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON = 1,
@@ -62,23 +62,11 @@ static int state = 0;
static struct libusb_dev_handle *devh = NULL;
static unsigned char imgbuf[0x1b340];
static unsigned char irqbuf[INTR_LENGTH];
-static libusb_transfer *img_urbh = NULL;
-static libusb_transfer *irq_urbh = NULL;
+static struct libusb_transfer *img_transfer = NULL;
+static struct libusb_transfer *irq_transfer = NULL;
static int img_idx = 0;
static int do_exit = 0;
-static struct libusb_bulk_transfer_request imgrq = {
- .endpoint = EP_DATA,
- .data = imgbuf,
- .length = sizeof(imgbuf),
-};
-
-static struct libusb_bulk_transfer_request intrrq = {
- .endpoint = EP_INTR,
- .data = irqbuf,
- .length = sizeof(irqbuf),
-};
-
static int find_dpfp_device(void)
{
devh = libusb_open_device_with_vid_pid(0x05ba, 0x000a);
@@ -88,18 +76,11 @@ static int find_dpfp_device(void)
static int print_f0_data(void)
{
unsigned char data[0x10];
- struct libusb_control_transfer_request rq = {
- .requesttype = CTRL_IN,
- .request = USB_RQ,
- .value = 0xf0,
- .index = 0,
- .length = sizeof(data),
- .data = data,
- };
int r;
unsigned int i;
- r = libusb_control_transfer(devh, &rq, 0);
+ r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0xf0, 0, data,
+ sizeof(data), 0);
if (r < 0) {
fprintf(stderr, "F0 error %d\n", r);
return r;
@@ -118,17 +99,9 @@ static int print_f0_data(void)
static int get_hwstat(unsigned char *status)
{
- struct libusb_control_transfer_request rq = {
- .requesttype = CTRL_IN,
- .request = USB_RQ,
- .value = 0x07,
- .index = 0,
- .length = 1,
- .data = status,
- };
int r;
- r = libusb_control_transfer(devh, &rq, 0);
+ r = libusb_control_transfer(devh, CTRL_IN, USB_RQ, 0x07, 0, status, 1, 0);
if (r < 0) {
fprintf(stderr, "read hwstat error %d\n", r);
return r;
@@ -145,18 +118,9 @@ static int get_hwstat(unsigned char *status)
static int set_hwstat(unsigned char data)
{
int r;
- struct libusb_control_transfer_request rq = {
- .requesttype = CTRL_OUT,
- .request = USB_RQ,
- .value = 0x07,
- .index = 0,
- .length = 1,
- .data = &data,
- };
printf("set hwstat to %02x\n", data);
-
- r = libusb_control_transfer(devh, &rq, 0);
+ r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x07, 0, &data, 1, 0);
if (r < 0) {
fprintf(stderr, "set hwstat error %d\n", r);
return r;
@@ -172,18 +136,9 @@ static int set_hwstat(unsigned char data)
static int set_mode(unsigned char data)
{
int r;
- struct libusb_control_transfer_request rq = {
- .requesttype = CTRL_OUT,
- .request = USB_RQ,
- .value = 0x4e,
- .index = 0,
- .length = 1,
- .data = &data,
- };
-
printf("set mode %02x\n", data);
- r = libusb_control_transfer(devh, &rq, 0);
+ r = libusb_control_transfer(devh, CTRL_OUT, USB_RQ, 0x4e, 0, &data, 1, 0);
if (r < 0) {
fprintf(stderr, "set mode error %d\n", r);
return r;
@@ -196,56 +151,51 @@ static int set_mode(unsigned char data)
return 0;
}
-static void cb_mode_changed(struct libusb_dev_handle *_devh,
- struct libusb_transfer *urbh, enum libusb_transfer_status status,
- struct libusb_control_setup *setup, unsigned char *data, int actual_length,
- void *user_data)
+static void cb_mode_changed(struct libusb_transfer *transfer)
{
- if (status != LIBUSB_TRANSFER_COMPLETED) {
- fprintf(stderr, "mode change URB not completed!\n");
+ if (transfer->status != LIBUSB_TRANSFER_COMPLETED) {
+ fprintf(stderr, "mode change transfer not completed!\n");
do_exit = 2;
}
printf("async cb_mode_changed\n");
if (next_state() < 0)
do_exit = 2;
+ free(transfer->buffer);
+ libusb_free_transfer(transfer);
}
static int set_mode_async(unsigned char data)
{
- libusb_transfer *urbh;
- struct libusb_control_transfer_request rq = {
- .requesttype = CTRL_OUT,
- .request = USB_RQ,
- .value = 0x4e,
- .index = 0,
- .length = 1,
- .data = &data,
- };
+ int bufsize = LIBUSB_CONTROL_SETUP_SIZE + 1;
+ unsigned char *buf = malloc(bufsize);
+ struct libusb_transfer *transfer;
- printf("async set mode %02x\n", data);
-
- urbh = libusb_async_control_transfer(devh, &rq, cb_mode_changed, NULL,
- 1000);
- if (!urbh) {
- fprintf(stderr, "set mode submit error\n");
- return -1;
+ if (!buf)
+ return -ENOMEM;
+
+ transfer = libusb_alloc_transfer();
+ if (!transfer) {
+ free(buf);
+ return -ENOMEM;
}
- return 0;
+ printf("async set mode %02x\n", data);
+ libusb_fill_control_setup(buf, CTRL_OUT, USB_RQ, 0x4e, 0, 1);
+ buf[LIBUSB_CONTROL_SETUP_SIZE] = data;
+ libusb_fill_control_transfer(transfer, devh, buf, bufsize,
+ cb_mode_changed, NULL, 1000);
+
+ return libusb_submit_transfer(transfer);
}
static int do_sync_intr(unsigned char *data)
{
- struct libusb_bulk_transfer_request request = {
- .endpoint = EP_INTR,
- .data = data,
- .length = INTR_LENGTH,
- };
int r;
int transferred;
- r = libusb_interrupt_transfer(devh, &request, &transferred, 1000);
+ r = libusb_interrupt_transfer(devh, EP_INTR, data, INTR_LENGTH,
+ &transferred, 1000);
if (r < 0) {
fprintf(stderr, "intr error %d\n", r);
return r;
@@ -328,14 +278,12 @@ static int next_state(void)
return 0;
}
-static void cb_irq(libusb_dev_handle *_devh, libusb_transfer *urbh,
- enum libusb_transfer_status status, unsigned char endpoint, int rqlength,
- unsigned char *data, int actual_length, void *user_data)
+static void cb_irq(struct libusb_transfer *transfer)
{
- unsigned char irqtype = data[0];
+ unsigned char irqtype = transfer->buffer[0];
- if (status != LIBUSB_TRANSFER_COMPLETED) {
- fprintf(stderr, "irq URB status %d?\n", status);
+ if (transfer->status != LIBUSB_TRANSFER_COMPLETED) {
+ fprintf(stderr, "irq transfer status %d?\n", transfer->status);
do_exit = 2;
return;
}
@@ -363,16 +311,14 @@ static void cb_irq(libusb_dev_handle *_devh, libusb_transfer *urbh,
}
break;
}
- if (submit_irq_urb() < 0)
+ if (submit_irq_transfer() < 0)
do_exit = 2;
}
-static void cb_img(libusb_dev_handle *_devh, libusb_transfer *urbh,
- enum libusb_transfer_status status, unsigned char endpoint, int rqlength,
- unsigned char *data, int actual_length, void *user_data)
+static void cb_img(struct libusb_transfer *transfer)
{
- if (status != LIBUSB_TRANSFER_COMPLETED) {
- fprintf(stderr, "img URB status %d?\n", status);
+ if (transfer->status != LIBUSB_TRANSFER_COMPLETED) {
+ fprintf(stderr, "img transfer status %d?\n", transfer->status);
do_exit = 2;
return;
}
@@ -383,35 +329,31 @@ static void cb_img(libusb_dev_handle *_devh, libusb_transfer *urbh,
do_exit = 2;
return;
}
- if (submit_img_urb() < 0)
+ if (submit_img_transfer() < 0)
do_exit = 2;
}
-static int submit_irq_urb(void)
+static int submit_irq_transfer(void)
{
- libusb_transfer_free(irq_urbh);
- irq_urbh = libusb_async_interrupt_transfer(devh, &intrrq, cb_irq, NULL, 0);
- return irq_urbh != NULL;
+ return libusb_submit_transfer(irq_transfer);
}
-static int submit_img_urb(void)
+static int submit_img_transfer(void)
{
- libusb_transfer_free(img_urbh);
- img_urbh = libusb_async_bulk_transfer(devh, &imgrq, cb_img, NULL, 0);
- return img_urbh != NULL;
+ return libusb_submit_transfer(img_transfer);
}
static int init_capture(void)
{
int r;
- r = submit_irq_urb();
+ r = submit_irq_transfer();
if (r < 0)
return r;
- r = submit_img_urb();
+ r = submit_img_transfer();
if (r < 0) {
- libusb_transfer_cancel_sync(devh, img_urbh);
+ libusb_cancel_transfer_sync(devh, img_transfer);
return r;
}
@@ -454,6 +396,24 @@ static int do_init(void)
return 0;
}
+static int alloc_transfers(void)
+{
+ img_transfer = libusb_alloc_transfer();
+ if (!img_transfer)
+ return -ENOMEM;
+
+ irq_transfer = libusb_alloc_transfer();
+ if (!irq_transfer)
+ return -ENOMEM;
+
+ libusb_fill_bulk_transfer(img_transfer, devh, EP_DATA, imgbuf,
+ sizeof(imgbuf), cb_img, NULL, 0);
+ libusb_fill_interrupt_transfer(irq_transfer, devh, EP_INTR, irqbuf,
+ sizeof(irqbuf), cb_irq, NULL, 0);
+
+ return 0;
+}
+
static void sighandler(int signum)
{
do_exit = 1;
@@ -493,6 +453,10 @@ int main(void)
/* async from here onwards */
+ r = alloc_transfers();
+ if (r < 0)
+ goto out_deinit;
+
r = init_capture();
if (r < 0)
goto out_deinit;
@@ -512,11 +476,11 @@ int main(void)
printf("shutting down...\n");
- r = libusb_transfer_cancel_sync(devh, irq_urbh);
+ r = libusb_cancel_transfer_sync(devh, irq_transfer);
if (r < 0)
goto out_deinit;
- r = libusb_transfer_cancel_sync(devh, img_urbh);
+ r = libusb_cancel_transfer_sync(devh, img_transfer);
if (r < 0)
goto out_deinit;
@@ -526,8 +490,8 @@ int main(void)
r = 1;
out_deinit:
- libusb_transfer_free(img_urbh);
- libusb_transfer_free(irq_urbh);
+ libusb_free_transfer(img_transfer);
+ libusb_free_transfer(irq_transfer);
set_mode(0);
set_hwstat(0x80);
out_release: