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 		libusb_bulk_transfer(state.handle, EP_BULK_OUT, buffer, BUF_LEN,
145 				     &bytes, 500);
146 	}
147 	test_exit(&state);
148 }
149