Commit 9424ae9ab8d1d9a9162c02c795010713f75a44fa
1 parent
6fbb050a
ajouts claim interface
Showing
3 changed files
with
91 additions
and
2 deletions
Show diff stats
include/libusb_wrapper.h
... | ... | @@ -7,9 +7,11 @@ |
7 | 7 | #include <stdbool.h> |
8 | 8 | |
9 | 9 | void usbinit(libusb_context** context_ptr); |
10 | - | |
11 | 10 | void usbclose(libusb_context* context); |
12 | 11 | |
12 | +void interfaceclaim(libusb_device_handle *handle, struct libusb_interface *interface); | |
13 | +void interfaceclose(libusb_device_handle *handle, struct libusb_interface *interface); | |
14 | + | |
13 | 15 | ssize_t getListDevices(libusb_context* context, libusb_device***list_ptr); |
14 | 16 | void getFromKernel(libusb_device_handle *handle, int interface); |
15 | 17 | |
... | ... | @@ -19,6 +21,11 @@ void displayDevicesMore(libusb_context *context); |
19 | 21 | |
20 | 22 | void getFirstDeviceFromID(libusb_context *context, int vid, int pid, libusb_device **device); |
21 | 23 | |
24 | +void getOurInterfaces(libusb_device *device, | |
25 | + struct libusb_interface **int_hidjoy, | |
26 | + struct libusb_interface **int_leds, | |
27 | + struct libusb_interface **int_vibrators | |
28 | +); | |
22 | 29 | |
23 | 30 | void displayDeviceEndpoints (); |
24 | 31 | ... | ... |
src/libusb_wrapper.c
... | ... | @@ -15,6 +15,18 @@ void usbclose(libusb_context *context) { |
15 | 15 | libusb_exit(context); |
16 | 16 | } |
17 | 17 | |
18 | +void interfaceclaim(libusb_device_handle *handle, struct libusb_interface *interface){ | |
19 | + const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0]; //TODO enlever cette ligne, refactor | |
20 | + int status=libusb_claim_interface(handle, interface_desc->bInterfaceNumber); | |
21 | + if(status!=0){ perror("libusb_claim_interface"); exit(-1); } | |
22 | +} | |
23 | + | |
24 | +void interfaceclose(libusb_device_handle *handle, struct libusb_interface *interface){ | |
25 | + const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0]; | |
26 | + int status = libusb_release_interface(handle, interface_desc->bInterfaceNumber); | |
27 | + if(status!=0){ perror("libusb_release_interface"); exit(-1); } | |
28 | +} | |
29 | + | |
18 | 30 | // Si le méchant noyau est passé avant vous : |
19 | 31 | void getFromKernel(libusb_device_handle *handle, int interface) { //private method for now |
20 | 32 | if (libusb_kernel_driver_active(handle, interface)) { |
... | ... | @@ -196,7 +208,6 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { |
196 | 208 | printf("---extra: %s\n", endpoint_desc->extra); |
197 | 209 | if(endpoint_desc->bmAttributes == LIBUSB_TRANSFER_TYPE_INTERRUPT)//TODO AJOUT MASQUE ? (voir doc) |
198 | 210 | printf("---is of type INTERRUPT\n"); |
199 | - | |
200 | 211 | } |
201 | 212 | } |
202 | 213 | |
... | ... | @@ -228,3 +239,47 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { |
228 | 239 | libusb_close(handle); |
229 | 240 | |
230 | 241 | } |
242 | + | |
243 | +void getOurInterfaces(libusb_device *device, | |
244 | + struct libusb_interface **int_hidjoy, | |
245 | + struct libusb_interface **int_leds, | |
246 | + struct libusb_interface **int_vibrators | |
247 | +) { | |
248 | + //REDONDANCE DE CODE AVEC displayDeviceEndpoints | |
249 | + | |
250 | + // 4.2 configuration du périph usb | |
251 | + struct libusb_config_descriptor *config; | |
252 | + int statusFetchConfig = libusb_get_active_config_descriptor(device, &config); | |
253 | + if (statusFetchConfig != LIBUSB_SUCCESS) { | |
254 | + perror("libusb_get_active_config_descriptor"); | |
255 | + return; | |
256 | + } | |
257 | + | |
258 | + //caractéristiques globales | |
259 | + printf("Config.bConfigurationValue : %d\n", config->bConfigurationValue); | |
260 | + printf("Config/ bLength:%d\nbDescriptorType:%d\nbNumInterfaces:%d\n", | |
261 | + config->bLength, config->bDescriptorType, config->bNumInterfaces); | |
262 | + | |
263 | + | |
264 | + //itération des interfaces | |
265 | + printf("Itération de l'interface\n"); | |
266 | + for (int indexInterface = 0; indexInterface < config->bNumInterfaces; indexInterface++) { | |
267 | + printf("-indexInterface=%d\n", indexInterface); | |
268 | + printf("-Altsetting=%d\n", config->interface[indexInterface].num_altsetting); | |
269 | + | |
270 | + struct libusb_interface * interface = &config->interface[indexInterface]; | |
271 | + | |
272 | + //todo use le descriptor pour avoir bInterfaceNumber? | |
273 | + if(indexInterface==0){ | |
274 | + *int_hidjoy = interface; | |
275 | + }else if(indexInterface==1){ | |
276 | + *int_leds = interface; | |
277 | + }else if(indexInterface==2){ | |
278 | + *int_vibrators = interface; | |
279 | + } | |
280 | + | |
281 | + //#define pour les indices correspondants aux interfaces | |
282 | + //variables globales | |
283 | + } | |
284 | + | |
285 | +} | |
231 | 286 | \ No newline at end of file | ... | ... |
src/main.c
... | ... | @@ -64,7 +64,34 @@ int main(int argc, char *argv[]){ |
64 | 64 | return 1; |
65 | 65 | } |
66 | 66 | |
67 | + //take the handle | |
68 | + libusb_device_handle *device_handle = NULL; | |
69 | + if(libusb_open(device, &device_handle) != 0){ | |
70 | + printf("Error : cannot handle the device\n"); | |
71 | + return 1; | |
72 | + } | |
73 | + | |
67 | 74 | //Take the interfaces |
75 | + printf("Search for interfaces\n"); | |
76 | + struct libusb_interface * int_hidjoy = NULL; | |
77 | + struct libusb_interface * int_leds = NULL; | |
78 | + struct libusb_interface * int_vibrators = NULL; | |
79 | + getOurInterfaces(device, &int_hidjoy, &int_leds, &int_vibrators); | |
80 | + | |
81 | + //Claim interface | |
82 | + printf("Claim interfaces ...\n"); | |
83 | + printf("-Leds\n"); | |
84 | + interfaceclaim(device_handle, int_leds); | |
85 | + printf("-Vibrators\n"); | |
86 | + interfaceclaim(device_handle, int_vibrators); | |
87 | + | |
88 | + //Close | |
89 | + printf("Unclaim interfaces ...\n"); | |
90 | + //printf("-HID Joy\n"); //would not work | |
91 | + //interfaceclose(device, ...) | |
92 | + printf("-Leds\n"); | |
93 | + interfaceclose(device_handle, int_leds); | |
94 | + interfaceclose(device_handle, int_vibrators); | |
68 | 95 | |
69 | 96 | |
70 | 97 | printf("Finished\n"); | ... | ... |