Blame view

USB/usb_driver.c 6.45 KB
bcd81fea   dmohamed   UPDATE-AJout des ...
1
2
3
4
5
6
7
8
9
  #include <libusb-1.0/libusb.h> //bibliothèque USB
  #include <stdio.h>
  #include <stdlib.h>
  #include <termios.h>
  #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
  
  
28da8e7b   dmohamed   UPDATE
153
  void envoie(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;
28da8e7b   dmohamed   UPDATE
190
191
    unsigned char * buf;
    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
  
  
28da8e7b   dmohamed   UPDATE
211
212
213
214
215
216
217
218
219
220
221
  /* - set line encoding: here 9600 8N1
       * 9600 = 0x2580 ~> 0x80, 0x25 in little endian
       */
       //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 ...
222
  
28da8e7b   dmohamed   UPDATE
223
       
bcd81fea   dmohamed   UPDATE-AJout des ...
224
  
28da8e7b   dmohamed   UPDATE
225
226
227
    //Menu de commande
    char action;
    for(;;) 
bcd81fea   dmohamed   UPDATE-AJout des ...
228
      { 
28da8e7b   dmohamed   UPDATE
229
230
231
232
233
  
        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 ...
234
235
236
  	    {
  	    case 's':
  	      fermeture(handle);
bcd81fea   dmohamed   UPDATE-AJout des ...
237
238
239
240
241
  	      libusb_free_device_list(list,1);
  	      libusb_exit(context);
  	      return 0;
  	      break;
  	    case 'd':
28da8e7b   dmohamed   UPDATE
242
  	      envoie(LED_ON);
bcd81fea   dmohamed   UPDATE-AJout des ...
243
  	      sleep(1);
28da8e7b   dmohamed   UPDATE
244
245
  	      //len = read_chars(buf, 1);
          
bcd81fea   dmohamed   UPDATE-AJout des ...
246
247
  	      break;
  	    case 'g':
28da8e7b   dmohamed   UPDATE
248
  	      envoie(LED_OFF);
bcd81fea   dmohamed   UPDATE-AJout des ...
249
  	      sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
250
251
  	      break;
  	    case 'h':
28da8e7b   dmohamed   UPDATE
252
253
  	      envoie(MOVE_LEFT);
          sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
254
255
  	      break;
  	    case 'b':
28da8e7b   dmohamed   UPDATE
256
257
  	      envoie(MOVE_RIGHT);
          sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
258
259
  	      break;
  	    case 't' :
28da8e7b   dmohamed   UPDATE
260
261
  	      envoie(MOVE_STOP);
          sleep(1);
bcd81fea   dmohamed   UPDATE-AJout des ...
262
263
264
265
266
267
268
  	      break;
  	    default :
  	      printf("Commande invalide ! Retaper :\n");
  	      break;
  	    }
  	}
  
bcd81fea   dmohamed   UPDATE-AJout des ...
269
270
271
  
    return 0;
  }