tools: usb: aio example applications
[firefly-linux-kernel-4.4.55.git] / tools / usb / ffs-aio-example / multibuff / host_app / test.c
1 #include <libusb.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <unistd.h>
5
6 #define VENDOR  0x1d6b
7 #define PRODUCT 0x0105
8
9 /* endpoints indexes */
10
11 #define EP_BULK_IN      (1 | LIBUSB_ENDPOINT_IN)
12 #define EP_BULK_OUT     (2 | LIBUSB_ENDPOINT_OUT)
13
14 #define BUF_LEN         8192
15
16 /*
17  * struct test_state - describes test program state
18  * @list: list of devices returned by libusb_get_device_list function
19  * @found: pointer to struct describing tested device
20  * @ctx: context, set to NULL
21  * @handle: handle of tested device
22  * @attached: indicates that device was attached to kernel, and has to be
23  *            reattached at the end of test program
24  */
25
26 struct test_state {
27         libusb_device *found;
28         libusb_context *ctx;
29         libusb_device_handle *handle;
30         int attached;
31 };
32
33 /*
34  * test_init - initialize test program
35  */
36
37 int test_init(struct test_state *state)
38 {
39         int i, ret;
40         ssize_t cnt;
41         libusb_device **list;
42
43         state->found = NULL;
44         state->ctx = NULL;
45         state->handle = NULL;
46         state->attached = 0;
47
48         ret = libusb_init(&state->ctx);
49         if (ret) {
50                 printf("cannot init libusb: %s\n", libusb_error_name(ret));
51                 return 1;
52         }
53
54         cnt = libusb_get_device_list(state->ctx, &list);
55         if (cnt <= 0) {
56                 printf("no devices found\n");
57                 goto error1;
58         }
59
60         for (i = 0; i < cnt; ++i) {
61                 libusb_device *dev = list[i];
62                 struct libusb_device_descriptor desc;
63                 ret = libusb_get_device_descriptor(dev, &desc);
64                 if (ret) {
65                         printf("unable to get device descriptor: %s\n",
66                                libusb_error_name(ret));
67                         goto error2;
68                 }
69                 if (desc.idVendor == VENDOR && desc.idProduct == PRODUCT) {
70                         state->found = dev;
71                         break;
72                 }
73         }
74
75         if (!state->found) {
76                 printf("no devices found\n");
77                 goto error2;
78         }
79
80         ret = libusb_open(state->found, &state->handle);
81         if (ret) {
82                 printf("cannot open device: %s\n", libusb_error_name(ret));
83                 goto error2;
84         }
85
86         if (libusb_claim_interface(state->handle, 0)) {
87                 ret = libusb_detach_kernel_driver(state->handle, 0);
88                 if (ret) {
89                         printf("unable to detach kernel driver: %s\n",
90                                libusb_error_name(ret));
91                         goto error3;
92                 }
93                 state->attached = 1;
94                 ret = libusb_claim_interface(state->handle, 0);
95                 if (ret) {
96                         printf("cannot claim interface: %s\n",
97                                libusb_error_name(ret));
98                         goto error4;
99                 }
100         }
101
102         return 0;
103
104 error4:
105         if (state->attached == 1)
106                 libusb_attach_kernel_driver(state->handle, 0);
107
108 error3:
109         libusb_close(state->handle);
110
111 error2:
112         libusb_free_device_list(list, 1);
113
114 error1:
115         libusb_exit(state->ctx);
116         return 1;
117 }
118
119 /*
120  * test_exit - cleanup test program
121  */
122
123 void test_exit(struct test_state *state)
124 {
125         libusb_release_interface(state->handle, 0);
126         if (state->attached == 1)
127                 libusb_attach_kernel_driver(state->handle, 0);
128         libusb_close(state->handle);
129         libusb_exit(state->ctx);
130 }
131
132 int main(void)
133 {
134         struct test_state state;
135
136         if (test_init(&state))
137                 return 1;
138
139         while (1) {
140                 static unsigned char buffer[BUF_LEN];
141                 int bytes;
142                 libusb_bulk_transfer(state.handle, EP_BULK_IN, buffer, BUF_LEN,
143                                      &bytes, 500);
144         }
145         test_exit(&state);
146 }