From 7d6f5a45ed1474e28f2b235fb3af1ce446cbf91d Mon Sep 17 00:00:00 2001 From: Axel CHEMIN Date: Wed, 9 Dec 2020 11:47:58 +0100 Subject: [PATCH] add begin of main program --- include/libusb_wrapper.h | 5 +++++ src/libusb_wrapper.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------- src/main.c | 19 +++++++++++++++++-- 3 files changed, 105 insertions(+), 17 deletions(-) diff --git a/include/libusb_wrapper.h b/include/libusb_wrapper.h index 9ea1806..cea5d2c 100644 --- a/include/libusb_wrapper.h +++ b/include/libusb_wrapper.h @@ -11,10 +11,15 @@ void usbinit(libusb_context** context_ptr); void usbclose(libusb_context* context); ssize_t getListDevices(libusb_context* context, libusb_device***list_ptr); +void getFromKernel(libusb_device_handle *handle, int interface); + void displayDevices(libusb_context *context); void displayDevicesMore(libusb_context *context); +void getFirstDeviceFromID(libusb_context *context, int vid, int pid, libusb_device **device); + + void displayDeviceEndpoints (); #endif diff --git a/src/libusb_wrapper.c b/src/libusb_wrapper.c index 643a30b..f5d423e 100644 --- a/src/libusb_wrapper.c +++ b/src/libusb_wrapper.c @@ -16,7 +16,7 @@ void usbclose(libusb_context *context) { } // Si le méchant noyau est passé avant vous : -void _getFromKernel(libusb_device_handle *handle, int interface) { //private method for now +void getFromKernel(libusb_device_handle *handle, int interface) { //private method for now if (libusb_kernel_driver_active(handle, interface)) { int statusKDriver = libusb_detach_kernel_driver(handle, interface); if (statusKDriver != LIBUSB_SUCCESS) { @@ -112,11 +112,35 @@ void displayDevicesMore(libusb_context *context) { _enumerateDevices(context, _displayOneDeviceMore); } +//get device from iteration (and not from not recommanded function : +//ugly using global vars ?? Cannot communicate between getFirstDeviceFromID and _getFirstDeviceFromID +int g_vid; +int g_pid; +libusb_device *g_device = NULL; +void _getFirstDeviceFromID(libusb_device *device) { + struct libusb_device_descriptor desc; -//void getFirstDeviceFromID(vid, pid) + int status = libusb_get_device_descriptor(device, &desc); + if (status != LIBUSB_SUCCESS){ + printf("Cannot get device desc : %s\n", libusb_error_name(status)); //DBGONLY + perror("libusb_open"); + return; + } -//void getDevicesFromID(vid, pid) + if(desc.idVendor == g_vid && desc.idProduct == g_pid){ + g_device = device; + } +} + +void getFirstDeviceFromID(libusb_context *context, int vid, int pid, libusb_device **device) { + g_vid = vid; //pass parameters for enumeration + g_pid = pid; //idem + _enumerateDevices(context, _getFirstDeviceFromID); + device = &g_device; //get return from enumeration +} + +//void getDevicesFromID(vid, pid) //return array void displayDeviceEndpoints(libusb_device_handle* handle) { @@ -125,14 +149,13 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { device = libusb_get_device(handle); - // lectures des configs? - int configuration = 0; // valueof("bConfigurationValue"); + // lectures des configs => on prend la première configuration pour l'instant + /*int configuration = 0; // valueof("bConfigurationValue"); int statusConfig = libusb_set_configuration(handle, configuration); if (statusConfig != LIBUSB_SUCCESS) { perror("libusb_set_configuration"); return; - } - + }*/ // 4.2 configuration du périph usb struct libusb_config_descriptor *config; @@ -141,18 +164,63 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { perror("libusb_get_active_config_descriptor"); return; } + + //caractéristiques globales printf("Config.bConfigurationValue : %d\n", config->bConfigurationValue); - printf("Config/ bLength:%d;bDescriptorType:%d;bNumInterfaces:%d", + printf("Config/ bLength:%d\nbDescriptorType:%d\nbNumInterfaces:%d\n", config->bLength, config->bDescriptorType, config->bNumInterfaces); - // itération de l'interface - for (int indexInterface = 0; indexInterface < config->bNumInterfaces; - indexInterface++) { - // struct libusb_interface * interface = - // &config->interface[indexInterface]; - printf("^%d", indexInterface); - printf("Alt%d", config->interface[indexInterface].num_altsetting); + //itération des interfaces + printf("Itération de l'interface\n"); + for (int indexInterface = 0; indexInterface < config->bNumInterfaces; indexInterface++) { + printf("-indexInterface=%d\n", indexInterface); + printf("-Altsetting=%d\n", config->interface[indexInterface].num_altsetting); + + const struct libusb_interface * interface = &config->interface[indexInterface]; + + + //if 1 setting (or more) + if(interface->num_altsetting != 0) { + const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0]; + + printf("--bNumEndpoints=%d\n", interface_desc->bNumEndpoints); + printf("--bDescriptorType=%d\n", interface_desc->bDescriptorType); + + for(int indexEndpoints = 0; indexEndpoints < interface_desc->bNumEndpoints ; indexEndpoints++){ + const struct libusb_endpoint_descriptor * endpoint_desc = &interface_desc->endpoint[indexEndpoints]; + printf("---bDescriptorType=%d\n", endpoint_desc->bDescriptorType); + printf("---bEndpointAddress=%d\n", endpoint_desc->bEndpointAddress); + + if(endpoint_desc->extra != NULL) + printf("---extra: %s\n", endpoint_desc->extra); + if(endpoint_desc->bmAttributes == LIBUSB_TRANSFER_TYPE_INTERRUPT)//TODO AJOUT MASQUE ? (voir doc) + printf("---is of type INTERRUPT\n"); + + } + } + + + + //Affichez l’indice et le numéro de chaque interface détectée et réclamée. Affichez aussi les points d’accès trouvés en précisant ceux sauvés. + +/* + //int interface=valueof("bInterfaceNumber"); + int status=libusb_claim_interface(handle,interface->bInterfaceNumber); + if(status!=0){ perror("libusb_claim_interface"); exit(-1); } + + status=libusb_release_interface(handle,interface->bInterfaceNumber); + if(status!=0){ perror("libusb_release_interface"); exit(-1); } + + //claim_interface(.., config interface altsetting bInterfaceNumber + //config interface altsetting endpoint bmAttributes == LIBUSB_TRANSFER_TYPE_INTERRUPT + //add des enpoint unint8_t*/ + + + //DESCRIPTOR.C /.H :décommenter + + + //IL FAUT RELEASE UNIQUEMENT LES INTERFACES QUI NE SONT PAS DES HID } printf("\n"); diff --git a/src/main.c b/src/main.c index 9393193..e2433c1 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,9 @@ #include #include +#define VID 1003 +#define PID 8259 + int main(int argc, char *argv[]){ printf("Hello World :-|\n"); @@ -34,7 +37,7 @@ int main(int argc, char *argv[]){ handle = libusb_open_device_with_vid_pid(context, vendor_id, product_id); if(handle != NULL){ printf("Show endpoints of VID:%hu;PID:%hu\n", vendor_id, product_id); - displayDeviceEndpoints(NULL); + displayDeviceEndpoints(handle); } else{ printf("Error while getting handle of VID:%hu;PID:%hu\n", vendor_id, product_id); @@ -49,8 +52,20 @@ int main(int argc, char *argv[]){ }else{ //interactive mode printf("Welcome to interactive mode\n"); + printf("Compiled for VID:PID => %d:%d\n", VID, PID); + + //Find the device + printf("Iterate list of devices, and getting the right one\n"); + libusb_device *device = NULL; + getFirstDeviceFromID(context, VID, PID, &device); + //code + if(device==NULL){ + printf("Error : cannot find the device !\n"); + return 1; + } + + //Take the interfaces - /*Future code*/ printf("Finished\n"); } -- libgit2 0.21.2