Commit 7d6f5a45ed1474e28f2b235fb3af1ce446cbf91d
1 parent
7e2160f8
add begin of main program
Showing
3 changed files
with
105 additions
and
17 deletions
Show diff stats
include/libusb_wrapper.h
@@ -11,10 +11,15 @@ void usbinit(libusb_context** context_ptr); | @@ -11,10 +11,15 @@ void usbinit(libusb_context** context_ptr); | ||
11 | void usbclose(libusb_context* context); | 11 | void usbclose(libusb_context* context); |
12 | 12 | ||
13 | ssize_t getListDevices(libusb_context* context, libusb_device***list_ptr); | 13 | ssize_t getListDevices(libusb_context* context, libusb_device***list_ptr); |
14 | +void getFromKernel(libusb_device_handle *handle, int interface); | ||
15 | + | ||
14 | 16 | ||
15 | void displayDevices(libusb_context *context); | 17 | void displayDevices(libusb_context *context); |
16 | void displayDevicesMore(libusb_context *context); | 18 | void displayDevicesMore(libusb_context *context); |
17 | 19 | ||
20 | +void getFirstDeviceFromID(libusb_context *context, int vid, int pid, libusb_device **device); | ||
21 | + | ||
22 | + | ||
18 | void displayDeviceEndpoints (); | 23 | void displayDeviceEndpoints (); |
19 | 24 | ||
20 | #endif | 25 | #endif |
src/libusb_wrapper.c
@@ -16,7 +16,7 @@ void usbclose(libusb_context *context) { | @@ -16,7 +16,7 @@ void usbclose(libusb_context *context) { | ||
16 | } | 16 | } |
17 | 17 | ||
18 | // Si le méchant noyau est passé avant vous : | 18 | // Si le méchant noyau est passé avant vous : |
19 | -void _getFromKernel(libusb_device_handle *handle, int interface) { //private method for now | 19 | +void getFromKernel(libusb_device_handle *handle, int interface) { //private method for now |
20 | if (libusb_kernel_driver_active(handle, interface)) { | 20 | if (libusb_kernel_driver_active(handle, interface)) { |
21 | int statusKDriver = libusb_detach_kernel_driver(handle, interface); | 21 | int statusKDriver = libusb_detach_kernel_driver(handle, interface); |
22 | if (statusKDriver != LIBUSB_SUCCESS) { | 22 | if (statusKDriver != LIBUSB_SUCCESS) { |
@@ -112,11 +112,35 @@ void displayDevicesMore(libusb_context *context) { | @@ -112,11 +112,35 @@ void displayDevicesMore(libusb_context *context) { | ||
112 | _enumerateDevices(context, _displayOneDeviceMore); | 112 | _enumerateDevices(context, _displayOneDeviceMore); |
113 | } | 113 | } |
114 | 114 | ||
115 | +//get device from iteration (and not from not recommanded function : | ||
116 | +//ugly using global vars ?? Cannot communicate between getFirstDeviceFromID and _getFirstDeviceFromID | ||
117 | +int g_vid; | ||
118 | +int g_pid; | ||
119 | +libusb_device *g_device = NULL; | ||
120 | +void _getFirstDeviceFromID(libusb_device *device) { | ||
121 | + struct libusb_device_descriptor desc; | ||
115 | 122 | ||
116 | -//void getFirstDeviceFromID(vid, pid) | 123 | + int status = libusb_get_device_descriptor(device, &desc); |
124 | + if (status != LIBUSB_SUCCESS){ | ||
125 | + printf("Cannot get device desc : %s\n", libusb_error_name(status)); //DBGONLY | ||
126 | + perror("libusb_open"); | ||
127 | + return; | ||
128 | + } | ||
117 | 129 | ||
118 | 130 | ||
119 | -//void getDevicesFromID(vid, pid) | 131 | + if(desc.idVendor == g_vid && desc.idProduct == g_pid){ |
132 | + g_device = device; | ||
133 | + } | ||
134 | +} | ||
135 | + | ||
136 | +void getFirstDeviceFromID(libusb_context *context, int vid, int pid, libusb_device **device) { | ||
137 | + g_vid = vid; //pass parameters for enumeration | ||
138 | + g_pid = pid; //idem | ||
139 | + _enumerateDevices(context, _getFirstDeviceFromID); | ||
140 | + device = &g_device; //get return from enumeration | ||
141 | +} | ||
142 | + | ||
143 | +//void getDevicesFromID(vid, pid) //return array | ||
120 | 144 | ||
121 | 145 | ||
122 | void displayDeviceEndpoints(libusb_device_handle* handle) { | 146 | void displayDeviceEndpoints(libusb_device_handle* handle) { |
@@ -125,14 +149,13 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { | @@ -125,14 +149,13 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { | ||
125 | device = libusb_get_device(handle); | 149 | device = libusb_get_device(handle); |
126 | 150 | ||
127 | 151 | ||
128 | - // lectures des configs? | ||
129 | - int configuration = 0; // valueof("bConfigurationValue"); | 152 | + // lectures des configs => on prend la première configuration pour l'instant |
153 | + /*int configuration = 0; // valueof("bConfigurationValue"); | ||
130 | int statusConfig = libusb_set_configuration(handle, configuration); | 154 | int statusConfig = libusb_set_configuration(handle, configuration); |
131 | if (statusConfig != LIBUSB_SUCCESS) { | 155 | if (statusConfig != LIBUSB_SUCCESS) { |
132 | perror("libusb_set_configuration"); | 156 | perror("libusb_set_configuration"); |
133 | return; | 157 | return; |
134 | - } | ||
135 | - | 158 | + }*/ |
136 | 159 | ||
137 | // 4.2 configuration du périph usb | 160 | // 4.2 configuration du périph usb |
138 | struct libusb_config_descriptor *config; | 161 | struct libusb_config_descriptor *config; |
@@ -141,18 +164,63 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { | @@ -141,18 +164,63 @@ void displayDeviceEndpoints(libusb_device_handle* handle) { | ||
141 | perror("libusb_get_active_config_descriptor"); | 164 | perror("libusb_get_active_config_descriptor"); |
142 | return; | 165 | return; |
143 | } | 166 | } |
167 | + | ||
168 | + //caractéristiques globales | ||
144 | printf("Config.bConfigurationValue : %d\n", config->bConfigurationValue); | 169 | printf("Config.bConfigurationValue : %d\n", config->bConfigurationValue); |
145 | - printf("Config/ bLength:%d;bDescriptorType:%d;bNumInterfaces:%d", | 170 | + printf("Config/ bLength:%d\nbDescriptorType:%d\nbNumInterfaces:%d\n", |
146 | config->bLength, config->bDescriptorType, config->bNumInterfaces); | 171 | config->bLength, config->bDescriptorType, config->bNumInterfaces); |
147 | 172 | ||
148 | 173 | ||
149 | - // itération de l'interface | ||
150 | - for (int indexInterface = 0; indexInterface < config->bNumInterfaces; | ||
151 | - indexInterface++) { | ||
152 | - // struct libusb_interface * interface = | ||
153 | - // &config->interface[indexInterface]; | ||
154 | - printf("^%d", indexInterface); | ||
155 | - printf("Alt%d", config->interface[indexInterface].num_altsetting); | 174 | + //itération des interfaces |
175 | + printf("Itération de l'interface\n"); | ||
176 | + for (int indexInterface = 0; indexInterface < config->bNumInterfaces; indexInterface++) { | ||
177 | + printf("-indexInterface=%d\n", indexInterface); | ||
178 | + printf("-Altsetting=%d\n", config->interface[indexInterface].num_altsetting); | ||
179 | + | ||
180 | + const struct libusb_interface * interface = &config->interface[indexInterface]; | ||
181 | + | ||
182 | + | ||
183 | + //if 1 setting (or more) | ||
184 | + if(interface->num_altsetting != 0) { | ||
185 | + const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0]; | ||
186 | + | ||
187 | + printf("--bNumEndpoints=%d\n", interface_desc->bNumEndpoints); | ||
188 | + printf("--bDescriptorType=%d\n", interface_desc->bDescriptorType); | ||
189 | + | ||
190 | + for(int indexEndpoints = 0; indexEndpoints < interface_desc->bNumEndpoints ; indexEndpoints++){ | ||
191 | + const struct libusb_endpoint_descriptor * endpoint_desc = &interface_desc->endpoint[indexEndpoints]; | ||
192 | + printf("---bDescriptorType=%d\n", endpoint_desc->bDescriptorType); | ||
193 | + printf("---bEndpointAddress=%d\n", endpoint_desc->bEndpointAddress); | ||
194 | + | ||
195 | + if(endpoint_desc->extra != NULL) | ||
196 | + printf("---extra: %s\n", endpoint_desc->extra); | ||
197 | + if(endpoint_desc->bmAttributes == LIBUSB_TRANSFER_TYPE_INTERRUPT)//TODO AJOUT MASQUE ? (voir doc) | ||
198 | + printf("---is of type INTERRUPT\n"); | ||
199 | + | ||
200 | + } | ||
201 | + } | ||
202 | + | ||
203 | + | ||
204 | + | ||
205 | + //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. | ||
206 | + | ||
207 | +/* | ||
208 | + //int interface=valueof("bInterfaceNumber"); | ||
209 | + int status=libusb_claim_interface(handle,interface->bInterfaceNumber); | ||
210 | + if(status!=0){ perror("libusb_claim_interface"); exit(-1); } | ||
211 | + | ||
212 | + status=libusb_release_interface(handle,interface->bInterfaceNumber); | ||
213 | + if(status!=0){ perror("libusb_release_interface"); exit(-1); } | ||
214 | + | ||
215 | + //claim_interface(.., config interface altsetting bInterfaceNumber | ||
216 | + //config interface altsetting endpoint bmAttributes == LIBUSB_TRANSFER_TYPE_INTERRUPT | ||
217 | + //add des enpoint unint8_t*/ | ||
218 | + | ||
219 | + | ||
220 | + //DESCRIPTOR.C /.H :décommenter | ||
221 | + | ||
222 | + | ||
223 | + //IL FAUT RELEASE UNIQUEMENT LES INTERFACES QUI NE SONT PAS DES HID | ||
156 | } | 224 | } |
157 | 225 | ||
158 | printf("\n"); | 226 | printf("\n"); |
src/main.c
@@ -2,6 +2,9 @@ | @@ -2,6 +2,9 @@ | ||
2 | #include <stdio.h> | 2 | #include <stdio.h> |
3 | #include <string.h> | 3 | #include <string.h> |
4 | 4 | ||
5 | +#define VID 1003 | ||
6 | +#define PID 8259 | ||
7 | + | ||
5 | int main(int argc, char *argv[]){ | 8 | int main(int argc, char *argv[]){ |
6 | printf("Hello World :-|\n"); | 9 | printf("Hello World :-|\n"); |
7 | 10 | ||
@@ -34,7 +37,7 @@ int main(int argc, char *argv[]){ | @@ -34,7 +37,7 @@ int main(int argc, char *argv[]){ | ||
34 | handle = libusb_open_device_with_vid_pid(context, vendor_id, product_id); | 37 | handle = libusb_open_device_with_vid_pid(context, vendor_id, product_id); |
35 | if(handle != NULL){ | 38 | if(handle != NULL){ |
36 | printf("Show endpoints of VID:%hu;PID:%hu\n", vendor_id, product_id); | 39 | printf("Show endpoints of VID:%hu;PID:%hu\n", vendor_id, product_id); |
37 | - displayDeviceEndpoints(NULL); | 40 | + displayDeviceEndpoints(handle); |
38 | } | 41 | } |
39 | else{ | 42 | else{ |
40 | printf("Error while getting handle of VID:%hu;PID:%hu\n", vendor_id, product_id); | 43 | 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[]){ | @@ -49,8 +52,20 @@ int main(int argc, char *argv[]){ | ||
49 | }else{ | 52 | }else{ |
50 | //interactive mode | 53 | //interactive mode |
51 | printf("Welcome to interactive mode\n"); | 54 | printf("Welcome to interactive mode\n"); |
55 | + printf("Compiled for VID:PID => %d:%d\n", VID, PID); | ||
56 | + | ||
57 | + //Find the device | ||
58 | + printf("Iterate list of devices, and getting the right one\n"); | ||
59 | + libusb_device *device = NULL; | ||
60 | + getFirstDeviceFromID(context, VID, PID, &device); | ||
61 | + //code | ||
62 | + if(device==NULL){ | ||
63 | + printf("Error : cannot find the device !\n"); | ||
64 | + return 1; | ||
65 | + } | ||
66 | + | ||
67 | + //Take the interfaces | ||
52 | 68 | ||
53 | - /*Future code*/ | ||
54 | 69 | ||
55 | printf("Finished\n"); | 70 | printf("Finished\n"); |
56 | } | 71 | } |