Commit 08e49fd919cd64a4b3b948232aeb5f17bdbe02de
1 parent
34d0d1db
Seance 2
Showing
1 changed file
with
51 additions
and
16 deletions
Show diff stats
test_com.c
@@ -2,6 +2,8 @@ | @@ -2,6 +2,8 @@ | ||
2 | #include <stdio.h> | 2 | #include <stdio.h> |
3 | #include <stdlib.h> | 3 | #include <stdlib.h> |
4 | 4 | ||
5 | +// gcc file.c -l usb-1.0 | ||
6 | + | ||
5 | int main(){ | 7 | int main(){ |
6 | // init | 8 | // init |
7 | libusb_context *context; | 9 | libusb_context *context; |
@@ -15,32 +17,65 @@ int main(){ | @@ -15,32 +17,65 @@ int main(){ | ||
15 | for(int i=0; i<devices_count; i++){ | 17 | for(int i=0; i<devices_count; i++){ |
16 | libusb_device *device = devices[i]; | 18 | libusb_device *device = devices[i]; |
17 | 19 | ||
20 | + // device description | ||
21 | + struct libusb_device_descriptor desc; | ||
22 | + int status = libusb_get_device_descriptor(device, &desc); | ||
23 | + if(status != 0) continue; | ||
24 | + | ||
25 | + // search for device | ||
26 | + if(desc.idVendor != 0x0951 | ||
27 | + || desc.idProduct != 0x01666) | ||
28 | + continue; | ||
29 | + | ||
18 | // open connection | 30 | // open connection |
19 | libusb_device_handle *handle; | 31 | libusb_device_handle *handle; |
20 | - status=libusb_open(device,&handle); | ||
21 | - if(status!=0){ perror("libusb_open"); exit(-1); } | ||
22 | - | ||
23 | - // init interface | ||
24 | - // TODO int interface = valueof("bInterfaceNumber"); | ||
25 | - status = libusb_claim_interface(handle, interface); | ||
26 | - if(status != 0){perror("libusb_claim_interface"); exit(-1);} | 32 | + status = libusb_open(device, &handle); |
33 | + if(status != 0){ perror("libusb_open"); exit(-1); } | ||
34 | + | ||
35 | + // prepare config | ||
36 | + struct libusb_config_descriptor *config_desc; | ||
37 | + status = libusb_get_config_descriptor(device, 0, &config_desc); | ||
38 | + if(status != 0){ perror("libusb_get_config_descriptor"); exit(-1); } | ||
39 | + int configuration = config_desc->bConfigurationValue; | ||
27 | 40 | ||
28 | // detach kernel | 41 | // detach kernel |
29 | - if(libusb_kernel_driver_active(handle, interface)){ | ||
30 | - status = libusb_detach_kernel_driver(handle, interface); | ||
31 | - if(status != 0){perror("libusb_detach_kernel_driver"); exit(-1);} | 42 | + for(int j=0; j<config_desc->bNumInterfaces; j++){ |
43 | + for(int k=0; k<config_desc->interface[j].num_altsetting; k++){ | ||
44 | + int interface = config_desc->interface[j].altsetting[k].bInterfaceNumber; | ||
45 | + if(libusb_kernel_driver_active(handle, interface)){ | ||
46 | + status = libusb_detach_kernel_driver(handle, interface); | ||
47 | + if(status != 0){ perror("libusb_detach_kernel_driver"); exit(-1); } | ||
48 | + } | ||
49 | + } | ||
32 | } | 50 | } |
33 | - | 51 | + |
34 | // use config | 52 | // use config |
35 | - // TODO int configuration = valueof("bConfigurationValue"); | ||
36 | status = libusb_set_configuration(handle, configuration); | 53 | status = libusb_set_configuration(handle, configuration); |
37 | - if(status != 0){perror("libusb_set_configuration"); exit(-1);} | 54 | + if(status != 0){ perror("libusb_set_configuration"); exit(-1); } |
55 | + | ||
56 | + // claim interfaces | ||
57 | + for(int j=0; j<config_desc->bNumInterfaces; j++){ | ||
58 | + for(int k=0; k<config_desc->interface[j].num_altsetting; k++){ | ||
59 | + int interface = config_desc->interface[j].altsetting[k].bInterfaceNumber; | ||
60 | + status = libusb_claim_interface(handle, interface); | ||
61 | + if(status != 0){ perror("libusb_claim_interface"); exit(-1); } | ||
62 | + } | ||
63 | + } | ||
38 | 64 | ||
39 | /* ... some code ... */ | 65 | /* ... some code ... */ |
66 | + // TODO endpoints | ||
40 | 67 | ||
41 | - // close interface | ||
42 | - status = libusb_release_interface(handle, interface); | ||
43 | - if(status != 0){perror("libusb_release_interface"); exit(-1);} | 68 | + // release interfaces |
69 | + for(int j=0; j<config_desc->bNumInterfaces; j++){ | ||
70 | + for(int k=0; k<config_desc->interface[j].num_altsetting; k++){ | ||
71 | + int interface = config_desc->interface[j].altsetting[k].bInterfaceNumber; | ||
72 | + status = libusb_release_interface(handle, interface); | ||
73 | + if(status != 0){ perror("libusb_release_interface"); exit(-1); } | ||
74 | + } | ||
75 | + } | ||
76 | + | ||
77 | + // free config | ||
78 | + libusb_free_config_descriptor(config_desc); | ||
44 | 79 | ||
45 | // close connection | 80 | // close connection |
46 | libusb_close(handle); | 81 | libusb_close(handle); |