Blame view

USB/usb_driver.c 6.32 KB
bcd81fea   dmohamed   UPDATE-AJout des ...
1
2
3
  #include <libusb-1.0/libusb.h> //bibliothèque USB
  #include <stdio.h>
  #include <stdlib.h>
00d9a353   dmohamed   UPDATE
4
  
bcd81fea   dmohamed   UPDATE-AJout des ...
5
6
7
8
9
  #include <fcntl.h>
  #include <strings.h>
  #include <unistd.h>
  
  
28da8e7b   dmohamed   UPDATE
10
11
12
13
14
15
16
17
18
19
20
21
22
  #define LED_ON 0x21
  #define LED_OFF 0x22
  #define MOVE_RIGHT 0x04
  #define MOVE_LEFT 0x08
  #define MOVE_STOP 0x10
  
  
  #define ACM_CTRL_DTR  0x01
  #define ACM_CTRL_RTS 0x02
  
  static int ep_in_addr  = 0x83;
  static int ep_out_addr = 0x04;
  
bcd81fea   dmohamed   UPDATE-AJout des ...
23
24
25
  libusb_device **list;
  libusb_device_handle *handle = NULL;
  libusb_device *device;
bcd81fea   dmohamed   UPDATE-AJout des ...
26
27
  
  
bcd81fea   dmohamed   UPDATE-AJout des ...
28
29
  
  
bcd81fea   dmohamed   UPDATE-AJout des ...
30
31
32
33
34
35
36
37
38
  
  void configuration_periph(libusb_device *device) //Configuration de la tourelle
  {
    //Ouverture du pepherique
    int status=libusb_open(device,&handle);
    if(status!=0)
      {
        perror("libusb_open"); exit(-1);
      }
28da8e7b   dmohamed   UPDATE
39
      
bcd81fea   dmohamed   UPDATE-AJout des ...
40
41
42
43
44
45
46
47
48
49
50
51
52
    
    //Recuperation de la configuration d'indice 0 du périphérique
    struct libusb_config_descriptor *config;
    status=libusb_get_active_config_descriptor(device,&config);
    if(status!=0)
      {
        perror("libusb_get_active_config_descriptor"); exit(-1);
      }
  
    //Interfaces
    int i;
    int interface;
    
28da8e7b   dmohamed   UPDATE
53
    //On détache le noyau de notre périphérique
bcd81fea   dmohamed   UPDATE-AJout des ...
54
55
    for(i=0;i<(config->bNumInterfaces);i++)
      {
28da8e7b   dmohamed   UPDATE
56
        interface=config->interface[i].altsetting[0].bInterfaceNumber;
bcd81fea   dmohamed   UPDATE-AJout des ...
57
        if(libusb_kernel_driver_active(handle,interface))
28da8e7b   dmohamed   UPDATE
58
59
60
61
62
63
64
        {
          status=libusb_detach_kernel_driver(handle,interface);
          if(status!=0)
          {
            perror("libusb_detach_kernel_driver"); exit(-1);
          }
        }
bcd81fea   dmohamed   UPDATE-AJout des ...
65
66
      }
  
28da8e7b   dmohamed   UPDATE
67
  
bcd81fea   dmohamed   UPDATE-AJout des ...
68
69
    //Utilisation d'une configuration du périphérique
    int configuration=config->bConfigurationValue;
bcd81fea   dmohamed   UPDATE-AJout des ...
70
  
28da8e7b   dmohamed   UPDATE
71
    status=libusb_set_configuration(handle,configuration);
bcd81fea   dmohamed   UPDATE-AJout des ...
72
73
74
75
    if(status!=0)
      {
        perror("libusb_set_configuration"); exit(-1);
      }
28da8e7b   dmohamed   UPDATE
76
77
      
      
bcd81fea   dmohamed   UPDATE-AJout des ...
78
79
80
81
82
83
84
    //Claim interfaces
    for(i=0;i<(config->bNumInterfaces);i++)
      {
        interface=config->interface[i].altsetting[0].bInterfaceNumber;
        printf("Numero d'interface : %d\n", interface);
        status=libusb_claim_interface(handle,interface);
        if(status!=0)
28da8e7b   dmohamed   UPDATE
85
86
87
88
        {
          perror("libusb_claim_interface"); exit(-1);
        }
      }
bcd81fea   dmohamed   UPDATE-AJout des ...
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  }
  
  
  void fermeture(libusb_device_handle *handle) //Fermeture du périphérique
  {
    int i, interface, status;
    libusb_device *device = libusb_get_device(handle);
    struct libusb_config_descriptor *config;
    status = libusb_get_active_config_descriptor(device, &config);
    if(status != 0)
      {
        perror("libusb_get_active_config_descriptor");exit(-1);
      }
    
    for(i=0;i<(config->bNumInterfaces);i++)
      {
        interface=config->interface[i].altsetting[0].bInterfaceNumber;
        status=libusb_release_interface(handle,interface); //On libère l'interface
        if(status!=0)
  	{
  	  perror("libusb_release_interface");
  	  exit(-1);
  	}
        printf("Interface liberee : %d\n",interface);
      }
     
    libusb_close(handle);
    }
  
  
  void enumeration(libusb_context *context) //Enumération des périphériques USB
  {
    int t=0;
    libusb_device **list;
    ssize_t count=libusb_get_device_list(context,&list);
    if(count<0)
      {
        perror("libusb_get_device_list"); exit(-1);
      }
28da8e7b   dmohamed   UPDATE
128
  
bcd81fea   dmohamed   UPDATE-AJout des ...
129
130
131
132
133
134
135
136
137
    ssize_t i=0;
    for(i=0;i<count;i++)
    {
    libusb_device *device=list[i];
    struct libusb_device_descriptor desc;
    int status=libusb_get_device_descriptor(device,&desc);
    if(status!=0) continue;
    uint8_t bus=libusb_get_bus_number(device);
    uint8_t address=libusb_get_device_address(device);
28da8e7b   dmohamed   UPDATE
138
139
140
   
   //Lorsque l'on retrouves notre périphérique nous passons à la configuration.
   if ((desc.idVendor==0x0010) && (desc.idProduct==0x1010)) 
bcd81fea   dmohamed   UPDATE-AJout des ...
141
      {
28da8e7b   dmohamed   UPDATE
142
        printf("périphérique trouvée !\n");
bcd81fea   dmohamed   UPDATE-AJout des ...
143
144
145
146
        t=1;
        configuration_periph(device);
      }
    }
28da8e7b   dmohamed   UPDATE
147
    if(t==0) printf("périphérique non connectée !\n");
bcd81fea   dmohamed   UPDATE-AJout des ...
148
  }
28da8e7b   dmohamed   UPDATE
149
150
       
  
bcd81fea   dmohamed   UPDATE-AJout des ...
151
152
  
  
00d9a353   dmohamed   UPDATE
153
  void envoi(unsigned char c)
bcd81fea   dmohamed   UPDATE-AJout des ...
154
  {
28da8e7b   dmohamed   UPDATE
155
156
157
158
159
160
161
162
      /* To send a char to the device simply initiate a bulk_transfer to the
       * Endpoint with address ep_out_addr.
       */
      int actual_length;
      if (libusb_bulk_transfer(handle, ep_out_addr, &c, 1,
                               &actual_length, 0) < 0) {
          fprintf(stderr, "Error while sending char\n");
      }
bcd81fea   dmohamed   UPDATE-AJout des ...
163
164
  }
  
28da8e7b   dmohamed   UPDATE
165
  int reception(unsigned char * data, int size)
bcd81fea   dmohamed   UPDATE-AJout des ...
166
  {
28da8e7b   dmohamed   UPDATE
167
168
169
170
171
172
173
174
175
176
177
178
      /* To receive characters from the device initiate a bulk_transfer to the
       * Endpoint with address ep_in_addr.
       */
      int actual_length;
      int status = libusb_bulk_transfer(handle, ep_in_addr, data, size, &actual_length,
                                    1000);
      if (status == LIBUSB_ERROR_TIMEOUT) {
          printf("timeout (%d)\n", actual_length);
          return -1;
      } else if (status < 0) {
          fprintf(stderr, "Error while waiting for char\n");
          return -1;
bcd81fea   dmohamed   UPDATE-AJout des ...
179
180
      }
  
28da8e7b   dmohamed   UPDATE
181
      return actual_length;
bcd81fea   dmohamed   UPDATE-AJout des ...
182
  }
28da8e7b   dmohamed   UPDATE
183
184
185
  
  
  
bcd81fea   dmohamed   UPDATE-AJout des ...
186
187
188
189
  int main()
  {
     //Initialisation de la bibliotheque libusb
    libusb_context *context;
00d9a353   dmohamed   UPDATE
190
    unsigned char buf[65];
28da8e7b   dmohamed   UPDATE
191
    int len;
bcd81fea   dmohamed   UPDATE-AJout des ...
192
193
194
195
196
197
198
    
    int status=libusb_init(&context);
    if(status!=0)
      {
        perror("libusb_init"); exit(-1);
      }
  
28da8e7b   dmohamed   UPDATE
199
200
  //Enumération des périphériques USB. Si le périphérique est trouvé, cette fonction fait appel à la fonction configuration_perip.
    enumeration(context); 
bcd81fea   dmohamed   UPDATE-AJout des ...
201
  
28da8e7b   dmohamed   UPDATE
202
203
204
205
206
207
208
  //configuration du périphérique
   status = libusb_control_transfer(handle, 0x21, 0x22, ACM_CTRL_DTR | ACM_CTRL_RTS,
                                  0, NULL, 0, 0);
      if (status < 0) {
          fprintf(stderr, "Error during control transfer: %s\n",
                  libusb_error_name(status));
  }
bcd81fea   dmohamed   UPDATE-AJout des ...
209
210
  
  
00d9a353   dmohamed   UPDATE
211
  
28da8e7b   dmohamed   UPDATE
212
213
214
215
216
217
218
219
       //Configuration du port série.
      unsigned char encoding[] = { 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08 };
      status = libusb_control_transfer(handle, 0x21, 0x20, 0, 0, encoding,
                                  sizeof(encoding), 0);
      if (status < 0) {
          fprintf(stderr, "Error during control transfer: %s\n",
                  libusb_error_name(status));
        } 
bcd81fea   dmohamed   UPDATE-AJout des ...
220
  
28da8e7b   dmohamed   UPDATE
221
       
bcd81fea   dmohamed   UPDATE-AJout des ...
222
  
28da8e7b   dmohamed   UPDATE
223
224
225
    //Menu de commande
    char action;
    for(;;) 
bcd81fea   dmohamed   UPDATE-AJout des ...
226
      { 
28da8e7b   dmohamed   UPDATE
227
228
229
230
231
  
        printf("s=fermer / d=allumer led / g=eteindre led / h=moteur gauche / b=moteur droit / t=moteur éteint \n");
        scanf("%c",&action);
  	  
      switch (action)
bcd81fea   dmohamed   UPDATE-AJout des ...
232
233
234
  	    {
  	    case 's':
  	      fermeture(handle);
bcd81fea   dmohamed   UPDATE-AJout des ...
235
236
237
238
239
  	      libusb_free_device_list(list,1);
  	      libusb_exit(context);
  	      return 0;
  	      break;
  	    case 'd':
00d9a353   dmohamed   UPDATE
240
  	      envoi(LED_ON);
bcd81fea   dmohamed   UPDATE-AJout des ...
241
  	      sleep(1);
00d9a353   dmohamed   UPDATE
242
  	      
bcd81fea   dmohamed   UPDATE-AJout des ...
243
244
  	      break;
  	    case 'g':
00d9a353   dmohamed   UPDATE
245
  	      envoi(LED_OFF);
bcd81fea   dmohamed   UPDATE-AJout des ...
246
  	      sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
247
248
  	      break;
  	    case 'h':
00d9a353   dmohamed   UPDATE
249
  	      envoi(MOVE_LEFT);
28da8e7b   dmohamed   UPDATE
250
          sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
251
252
  	      break;
  	    case 'b':
00d9a353   dmohamed   UPDATE
253
  	      envoi(MOVE_RIGHT);
28da8e7b   dmohamed   UPDATE
254
          sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
255
256
  	      break;
  	    case 't' :
00d9a353   dmohamed   UPDATE
257
  	      envoi(MOVE_STOP);
28da8e7b   dmohamed   UPDATE
258
          sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
259
260
261
262
263
  	      break;
  	    default :
  	      printf("Commande invalide ! Retaper :\n");
  	      break;
  	    }
00d9a353   dmohamed   UPDATE
264
265
266
          
          sleep(1);
  }
bcd81fea   dmohamed   UPDATE-AJout des ...
267
268
269
  
    return 0;
  }