Blame view

src/libusb_wrapper.c 7.39 KB
d6e16d2e   achemin1   Tout propre
1
  #include "libusb_wrapper.h"
b79c0c43   gperson   ajout de code,Ver...
2
  
b24d2980   achemin1   Nettoyage du code...
3
  
72cd0d89   achemin1   (Ré)Ajout 4.1 bonus
4
  
d6e16d2e   achemin1   Tout propre
5
6
7
8
9
10
11
  void usbinit(libusb_context **context_ptr) {
      //libusb_context *context;
      int statusInit = libusb_init(context_ptr);
      if (statusInit != LIBUSB_SUCCESS) {
          perror("libusb_init");
          exit(-1);
      }
b24d2980   achemin1   Nettoyage du code...
12
13
  }
  
d6e16d2e   achemin1   Tout propre
14
15
  void usbclose(libusb_context *context) {
      libusb_exit(context);
b24d2980   achemin1   Nettoyage du code...
16
17
  }
  
d6e16d2e   achemin1   Tout propre
18
  // Si le méchant noyau est passé avant vous :
7d6f5a45   achemin1   add begin of main...
19
  void getFromKernel(libusb_device_handle *handle, int interface) { //private method for now
d6e16d2e   achemin1   Tout propre
20
21
22
23
24
25
26
      if (libusb_kernel_driver_active(handle, interface)) {
          int statusKDriver = libusb_detach_kernel_driver(handle, interface);
          if (statusKDriver != LIBUSB_SUCCESS) {
              perror("libusb_detach_kernel_driver");
              exit(-1);
          }
      }
b24d2980   achemin1   Nettoyage du code...
27
28
  }
  
d6e16d2e   achemin1   Tout propre
29
30
31
32
33
34
35
36
37
  ssize_t getListDevices(libusb_context *context, libusb_device ***list_ptr) {
      ssize_t count = libusb_get_device_list(context, list_ptr);
      if (count < 0) {
          perror("libusb_get_device_list");
          exit(-1);
      }
      return count;
  }
  
6bd47a15   achemin1   Ajout du principe...
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  void* _enumerateDevices(libusb_context *context, void (*func)(libusb_device *device)){
      libusb_device **list;
      ssize_t count = getListDevices(context, &list);
  
      ssize_t i = 0;
      for (i = 0; i < count; i++) {
          libusb_device *device = list[i];
  
          func(device);
      }
  
      libusb_free_device_list(list, 1);
  
      return NULL; //DBGONLY TEMP
  }
  
d6e16d2e   achemin1   Tout propre
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  //print readable string, not asked for tutoring
  void _printConfig(libusb_device *device) {//private method
      // Ouverture du périphérique
      libusb_device_handle *handle;
      int statusDevice = libusb_open(device, &handle);
      if (statusDevice != LIBUSB_SUCCESS) {
          perror("libusb_open");
          //return; //exit(-1);
      }
  
      int MAXLEN_DESCRIPTOR_STRING = 200;
      uint8_t desc_idx = 2;
      //uint16_t langid = 16;
      unsigned char data[200];
  
      // TEST 16
      for (desc_idx = 0; desc_idx < 16; desc_idx++) {
          int statusAscii = libusb_get_string_descriptor_ascii(
                  handle, desc_idx, data, MAXLEN_DESCRIPTOR_STRING);
          if (statusAscii == -9) // TEST seems to be LIBUSB_ERROR
              break;
          printf(" - Descriptor string : %s ; %i\n", data, statusAscii);
      }
  
      libusb_close(handle);
b24d2980   achemin1   Nettoyage du code...
79
80
  }
  
533260c1   achemin1   Ajout des lecture...
81
  
6bd47a15   achemin1   Ajout du principe...
82
83
  void _displayOneDevice(libusb_device *device){
      struct libusb_device_descriptor desc;
533260c1   achemin1   Ajout des lecture...
84
  
6bd47a15   achemin1   Ajout du principe...
85
86
87
88
89
90
      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;
      }
533260c1   achemin1   Ajout des lecture...
91
  
6bd47a15   achemin1   Ajout du principe...
92
93
      uint8_t bus = libusb_get_bus_number(device);
      uint8_t address = libusb_get_device_address(device);
533260c1   achemin1   Ajout des lecture...
94
  
6bd47a15   achemin1   Ajout du principe...
95
96
97
      printf("Device Found @ (Bus:Address) %d:%d\n", bus, address);
      printf("Vendor ID 0x0%x\n", desc.idVendor);
      printf("Product ID 0x0%x\n", desc.idProduct);
533260c1   achemin1   Ajout des lecture...
98
  
6bd47a15   achemin1   Ajout du principe...
99
100
      //displayDeviceEndpoints(device); //Not really work on Axel@Alptop
  }
533260c1   achemin1   Ajout des lecture...
101
  
6bd47a15   achemin1   Ajout du principe...
102
103
104
  void displayDevices(libusb_context *context) {
      _enumerateDevices(context, _displayOneDevice);
  }
d6e16d2e   achemin1   Tout propre
105
  
72cd0d89   achemin1   (Ré)Ajout 4.1 bonus
106
107
108
109
110
111
112
113
114
  void _displayOneDeviceMore(libusb_device *device){
      _displayOneDevice(device);
      _printConfig(device);
  }
  
  void displayDevicesMore(libusb_context *context) {
      _enumerateDevices(context, _displayOneDeviceMore);
  }
  
7d6f5a45   achemin1   add begin of main...
115
116
117
118
119
120
121
  //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;
72cd0d89   achemin1   (Ré)Ajout 4.1 bonus
122
  
7d6f5a45   achemin1   add begin of main...
123
124
125
126
127
128
      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;
      }
d6e16d2e   achemin1   Tout propre
129
  
d6e16d2e   achemin1   Tout propre
130
  
7d6f5a45   achemin1   add begin of main...
131
132
133
134
135
136
137
138
139
140
141
142
143
      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
d6e16d2e   achemin1   Tout propre
144
  
533260c1   achemin1   Ajout des lecture...
145
  
6bd47a15   achemin1   Ajout du principe...
146
147
148
149
  void displayDeviceEndpoints(libusb_device_handle* handle) {
      //recover pointer from handle
      libusb_device *device;
      device = libusb_get_device(handle);
c8f6b178   achemin1   Affichage valeur ...
150
  
3d1c6506   achemin1   Affichage de l'ex...
151
  
7d6f5a45   achemin1   add begin of main...
152
153
      // lectures des configs => on prend la première configuration pour l'instant
      /*int configuration = 0; // valueof("bConfigurationValue");
3d1c6506   achemin1   Affichage de l'ex...
154
      int statusConfig = libusb_set_configuration(handle, configuration);
d6e16d2e   achemin1   Tout propre
155
156
157
      if (statusConfig != LIBUSB_SUCCESS) {
          perror("libusb_set_configuration");
          return;
7d6f5a45   achemin1   add begin of main...
158
      }*/
d6e16d2e   achemin1   Tout propre
159
  
3d1c6506   achemin1   Affichage de l'ex...
160
161
      // 4.2 configuration du périph usb
      struct libusb_config_descriptor *config;
d6e16d2e   achemin1   Tout propre
162
163
164
165
      int statusFetchConfig = libusb_get_active_config_descriptor(device, &config);
      if (statusFetchConfig != LIBUSB_SUCCESS) {
          perror("libusb_get_active_config_descriptor");
          return;
c8f6b178   achemin1   Affichage valeur ...
166
      }
7d6f5a45   achemin1   add begin of main...
167
168
  
      //caractéristiques globales
c8f6b178   achemin1   Affichage valeur ...
169
      printf("Config.bConfigurationValue : %d\n", config->bConfigurationValue);
7d6f5a45   achemin1   add begin of main...
170
      printf("Config/ bLength:%d\nbDescriptorType:%d\nbNumInterfaces:%d\n",
3d1c6506   achemin1   Affichage de l'ex...
171
172
             config->bLength, config->bDescriptorType, config->bNumInterfaces);
  
3d1c6506   achemin1   Affichage de l'ex...
173
  
7d6f5a45   achemin1   add begin of main...
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
      //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 lindice et le numéro de chaque interface détectée et réclamée. Affichez aussi les points daccè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
3d1c6506   achemin1   Affichage de l'ex...
224
225
226
      }
  
      printf("\n");
b79c0c43   gperson   ajout de code,Ver...
227
  
d6e16d2e   achemin1   Tout propre
228
      libusb_close(handle);
b79c0c43   gperson   ajout de code,Ver...
229
  
d6e16d2e   achemin1   Tout propre
230
  }