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