Blame view

Pgm PC/init_USB.c 10.1 KB
ca6bb997   rguillom   Ajout Pgm/init.c ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  #include <libusb-1.0/libusb.h>
  #include <stdio.h>
  #include <stdlib.h>
  
  /* Caractéristiques du périphérique */
  #define VENDOR_ID		0x2341
  #define PRODUCT_ID		0x0001
  #define TAB_PA_SIZE		10
  
  libusb_device_handle *handle=NULL;
  libusb_device *device=NULL;
  libusb_device *found=NULL; //notre périphérique
  libusb_context *context;
  
  /*
  struct TABLEAU{
  	struct EP *tableau[3]; //tableau des points d'accès en interruption
  	int dernier;
  };
  
  struct EP {
      uint8_t ep; 				//adresse d'accès de l'endpoint
      unsigned char io;   //décrit si c'est une entrée ou une sortie
  };
  
  //init structure tableau
  struct TABLEAU tab_pa;
  
  void init_tableau(){
      for (int i=0;i<3;i++){        
      tab_pa.tableau[i]=NULL;
      }
      tab_pa.dernier=0;
  }
  */
  
  /*énumération des périphériques USB*/
  void enum_periph(){
      libusb_device **list;
      
      /* On compte le nombre de périphérique connectés... */
      ssize_t count=libusb_get_device_list(context,&list);
      if(count<0) {perror("libusb_get_device_list"); exit(-1);}
      ssize_t i=0;
      
      /* et on en établit la liste complète */
      for(i=0;i<count;i++){
          libusb_device *device=list[i];      //enregistre l'appareil i dans la liste list
          struct libusb_device_descriptor desc;
          int status=libusb_get_device_descriptor(device,&desc);      //enregistre le descripteur d'appareil
          if(status!=0) continue;
          
          /* On capture et affiche les numéros de bus et d'addresse */
          uint8_t bus=libusb_get_bus_number(device);
          uint8_t address=libusb_get_device_address(device);
          printf("Device Found @ (Bus:Address) %d:%d\n",bus,address);
          printf("Vendor ID 0x0%x\n",desc.idVendor);
01b3f0af   rguillom   PAD.c modif fonct...
58
          printf("Product ID 0x0%x\n\n",desc.idProduct);
ca6bb997   rguillom   Ajout Pgm/init.c ...
59
60
61
62
63
64
65
66
67
68
69
70
71
          
          /* Recherche de notre périphérique et sauvegarde dans 'found' */
          if(desc.idVendor == VENDOR_ID && desc.idProduct == PRODUCT_ID){
          	found = device;
          	printf("\nPériphérique trouvé @ (Bus:Adresse) %d:%d\n", bus, address);     //test si le "found" reste le meme
          	break;
          }
      }
      if (found == NULL) printf("Périphérique non trouvé\n");
      libusb_free_device_list(list,1);
  }
  
  
3966cf83   rguillom   modifs diverses :...
72
  void config_periph(unsigned char tab_PA[TAB_PA_SIZE]){
ca6bb997   rguillom   Ajout Pgm/init.c ...
73
74
75
76
  
  	/* Récupération de la 1ère configuration du périphérique (indice 0) */
      struct libusb_config_descriptor *config_desc=NULL;
      int status = libusb_get_config_descriptor(found,0,&config_desc); //config d'indice 0
01b3f0af   rguillom   PAD.c modif fonct...
77
      printf("La valeur de la configuration d'indice 0 est %d\n",config_desc->bConfigurationValue);
ca6bb997   rguillom   Ajout Pgm/init.c ...
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
      
      int interface;
      
      /* Si le noyau est passé avant nous,
          On le détache pour chaque alternative d'interface numéro 0 */
      for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){        
          
          interface=config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber;
          
          if(libusb_kernel_driver_active(handle,interface)){
          	int status=libusb_detach_kernel_driver(handle,interface);
          	if(status!=0){ perror("libusb_detach_kernel_driver"); exit(-1); } //erreur si status!=0
          }
      	//printf("indice intf trouvée %d\n",interface);
      }
   
          
      /* Utilisation de la configuration */
3966cf83   rguillom   modifs diverses :...
96
97
      
      int dernier_PA=-1;
ca6bb997   rguillom   Ajout Pgm/init.c ...
98
99
      int configuration=config_desc->bConfigurationValue;
      
01b3f0af   rguillom   PAD.c modif fonct...
100
      //printf("valeur config %d\n", configuration); // Affichage valeur de la configuration
ca6bb997   rguillom   Ajout Pgm/init.c ...
101
102
103
104
105
106
107
108
109
110
111
      status=libusb_set_configuration(handle,configuration);
      if(status!=0){ perror("libusb_set_configuration"); exit(-1); }
          
          
      /* Appropriation de toutes les interfaces */
      int num_intf;
      for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){
      	num_intf = config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber;
      	
      	status=libusb_claim_interface(handle,indice_intf);   
      	if(status!=0){ perror("libusb_claim_interface"); exit(-1); }
01b3f0af   rguillom   PAD.c modif fonct...
112
      	printf("\tInterface d'indice %d et de numéro %d réclamée\n",indice_intf,num_intf);
ca6bb997   rguillom   Ajout Pgm/init.c ...
113
114
115
116
      
  
  
  		/* Parcours des points d'accès (Endpoint) pour chaque interface*/
ca6bb997   rguillom   Ajout Pgm/init.c ...
117
  		
3966cf83   rguillom   modifs diverses :...
118
119
  		for(int num_PA=0;num_PA<config_desc->interface[indice_intf].altsetting[0].bNumEndpoints ;num_PA++){
  			
ca6bb997   rguillom   Ajout Pgm/init.c ...
120
121
  			int type_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bmAttributes;
  			uint8_t adresse_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bEndpointAddress;
01b3f0af   rguillom   PAD.c modif fonct...
122
              printf("\t\tPoint d'accès trouvé. Adresse : %d\n",adresse_PA);
ca6bb997   rguillom   Ajout Pgm/init.c ...
123
124
125
              
          	/* Regarde si le point d'accès est de type interruption.
          	Si oui, on le sauvegarde. */
ca6bb997   rguillom   Ajout Pgm/init.c ...
126
127
128
129
          	if((type_PA & 0b11)==LIBUSB_TRANSFER_TYPE_INTERRUPT){
  				//struct EP ep1;
              	dernier_PA++;
              	tab_PA[dernier_PA] = adresse_PA;
01b3f0af   rguillom   PAD.c modif fonct...
130
              	printf("\t\tPoint d'accès numéro %d sauvegardé. Adresse : %d\n", dernier_PA, adresse_PA);
ca6bb997   rguillom   Ajout Pgm/init.c ...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  			
  				/*
  				ep1.ep=config_desc->interface[indice_intf].altsetting[0].endpoint->bEndpointAddress;
  				if (indice_intf==0){
  					tab_pa.tableau[indice_intf]->ep=ep1.ep;
              		tab_pa.tableau[indice_intf]->io=1;
  					tab_pa.dernier++;
            		}
  				else{               
       	    		tab_pa.tableau[indice_intf]->ep=ep1.ep;
            			tab_pa.tableau[indice_intf]->io=0;
            			tab_pa.dernier++;
           			if (num_ep >2)break;	//entrée => io=0
           	
            		 // Le if et else ci-dessus doivent pouvoir être simplifiés.
            		*/
            	}
3966cf83   rguillom   modifs diverses :...
148
149
          
          }	
ca6bb997   rguillom   Ajout Pgm/init.c ...
150
      }
3966cf83   rguillom   modifs diverses :...
151
      //printf("dernier indice tab_PA : %d\n", dernier_PA);
ca6bb997   rguillom   Ajout Pgm/init.c ...
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  }
  
  
  /* Libération des interfaces de la configuration active */
  void liberer_interfaces(){ 
      
      /* Récupération de la configuration active */
      
      struct libusb_config_descriptor* config_desc;
      int status =libusb_get_active_config_descriptor(found,&config_desc); 
      if(status!=0){perror("libusb_get_active_config_descriptor");exit(-1);}
      
      /* On parcourt toutes les interfaces*/
      int num_intf;
      for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){
      	num_intf=config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber;
      	
      	/* Libération de l'interface num_intf*/
          status=libusb_release_interface(handle,num_intf);
          if(status!=0){ perror("libusb_release_interface"); exit(-1); }  
          
01b3f0af   rguillom   PAD.c modif fonct...
173
          printf("\tL'interface numéro %d, d'indice %d a été libérée.\n", num_intf,indice_intf);          
ca6bb997   rguillom   Ajout Pgm/init.c ...
174
175
176
177
178
179
180
181
  	}
  }
  
  
  /* Envoie un caractère (de commande de LED) sur le port USB */
  void send_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char data){
  
  	unsigned char PA = tab_PA[0]; //LEDs sur le premier point d'accès
3966cf83   rguillom   modifs diverses :...
182
  	printf("adresse PA %d\n", tab_PA[0]);
01b3f0af   rguillom   PAD.c modif fonct...
183
  	int transferred = 1; 	//nombre d'octets transférés
ca6bb997   rguillom   Ajout Pgm/init.c ...
184
  	unsigned int timeout = 1000;	//temps avant un timeout
01b3f0af   rguillom   PAD.c modif fonct...
185
  	int status = libusb_interrupt_transfer(handle, PA, &data, sizeof(data), &transferred, timeout);
ca6bb997   rguillom   Ajout Pgm/init.c ...
186
187
188
189
190
191
192
193
194
  	if(status!=0){perror("libusb_interrupt_transfer");exit(-1);}
  }
  
  
  /* Lis le contenu des points d'accès de l'interface IN (boutons et joystick) */
  void receive_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char *boutons, unsigned char *joystick_x, unsigned char *joystick_y){
  
  	/* Lecture du point d'accès des boutons */
  	unsigned char PA = tab_PA[1]; //LEDs sur le premier point d'accès
3966cf83   rguillom   modifs diverses :...
195
  	printf("adresse PA %d\n", tab_PA[1]);
01b3f0af   rguillom   PAD.c modif fonct...
196
  	int transferred = 1; 	//nombre d'octets transférés
ca6bb997   rguillom   Ajout Pgm/init.c ...
197
198
  	unsigned int timeout = 1000;	//temps avant un timeout
  	
01b3f0af   rguillom   PAD.c modif fonct...
199
  	int status = libusb_interrupt_transfer(handle, PA, boutons, sizeof(boutons), &transferred, timeout);
3966cf83   rguillom   modifs diverses :...
200
  	if(status!=0){perror("libusb_interrupt_transfer");printf("erreur lecture boutons, adresse PA %d\n",tab_PA[1]);exit(-1);}
ca6bb997   rguillom   Ajout Pgm/init.c ...
201
202
  	
  	/* Lecture du point d'accès du joystick */
01b3f0af   rguillom   PAD.c modif fonct...
203
  	unsigned char *joystick_xy=NULL; //stocke la donnée du point d'accès (1 octet pour chaque axe)
ca6bb997   rguillom   Ajout Pgm/init.c ...
204
205
  
  	PA = tab_PA[2]; //LEDs sur le premier point d'accès
3966cf83   rguillom   modifs diverses :...
206
  	printf("adresse PA %d\n", tab_PA[2]);
01b3f0af   rguillom   PAD.c modif fonct...
207
  	transferred = 2; 	//nombre d'octets transférés
ca6bb997   rguillom   Ajout Pgm/init.c ...
208
209
  	timeout = 1000;	//temps avant un timeout
  	
01b3f0af   rguillom   PAD.c modif fonct...
210
  	status = libusb_interrupt_transfer(handle, PA, joystick_xy, sizeof(joystick_xy), &transferred, timeout);
ca6bb997   rguillom   Ajout Pgm/init.c ...
211
212
213
  	if(status!=0){perror("libusb_interrupt_transfer");exit(-1);}
  	
  	//TODO Pas sûr !!!
01b3f0af   rguillom   PAD.c modif fonct...
214
215
216
217
  	if (joystick_xy !=NULL){
  		*joystick_x = joystick_xy[0];	//On sépare la data de chaque axe
  		*joystick_y = joystick_xy[1];
  	}
ca6bb997   rguillom   Ajout Pgm/init.c ...
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
  }
  
  
  
  int main(){
      //init_tableau(); // initialisation tableau point d'accès endpoint
      
      /* Initialisation de la bibliothèque libusb-1.0 */
      
      int status=libusb_init(&context);
      if(status!=0) {perror("libusb_init"); exit(-1);}
      //fin inititialisation
      
      /* Enumération des périphériques USB */
      enum_periph();
      
      /* Ouverture de notre périphérique 'found' */
      int status_ouv=libusb_open(found,&handle);
      if(status_ouv!=0){ perror("libusb_open"); exit(-1); }
      
      /* Configuration du périphérique et sauvegarde des points d'accès */
3966cf83   rguillom   modifs diverses :...
239
      unsigned char tab_PA[TAB_PA_SIZE];
ca6bb997   rguillom   Ajout Pgm/init.c ...
240
241
      config_periph(tab_PA);
      
3966cf83   rguillom   modifs diverses :...
242
243
244
      unsigned char *boutons = NULL, *boutons_anc = NULL;
      unsigned char *joystick_x = NULL, *joystick_x_anc = NULL;
      unsigned char *joystick_y = NULL, *joystick_y_anc = NULL;
01b3f0af   rguillom   PAD.c modif fonct...
245
      unsigned char caractere;
ca6bb997   rguillom   Ajout Pgm/init.c ...
246
      
3966cf83   rguillom   modifs diverses :...
247
248
249
250
251
252
      
      //TODO boucle while(pas d'arrêt), envoi et rcpt
      //TODO "pas d'arrêt" = appui sur 's' par exemple
      
      while(1){
      	/*if (appui sur une touche){
01b3f0af   rguillom   PAD.c modif fonct...
253
254
255
256
      		//récupération caractère
      		send_data(tab_PA, caractere);	//Envoi de la commande des leds
      	}
      	else {
3966cf83   rguillom   modifs diverses :...
257
258
      	*/
      		printf("début rcpt\n");
01b3f0af   rguillom   PAD.c modif fonct...
259
      		receive_data(tab_PA, boutons, joystick_x, joystick_y); //Réception des boutons et joystick
3966cf83   rguillom   modifs diverses :...
260
261
      		printf("fin rcpt\n");
      		if ((boutons == NULL) || (joystick_x == NULL) || (joystick_y == NULL)) printf("Erreur réception : pointeurs boutons ou joystick nul\n");
01b3f0af   rguillom   PAD.c modif fonct...
262
263
264
265
266
      		if ((*boutons != *boutons_anc) || (joystick_x != joystick_x_anc) || (joystick_y != joystick_y_anc)) printf("Boutons : %c, Joystick_x : %c, Joystick_y :%c\n", *boutons, *joystick_x, *joystick_y);	//Affichage si changement
      		
      		*boutons_anc = *boutons;
      		*joystick_x_anc = *joystick_x;
      		*joystick_y_anc = *joystick_y;
3966cf83   rguillom   modifs diverses :...
267
      	//}
ca6bb997   rguillom   Ajout Pgm/init.c ...
268
      
3966cf83   rguillom   modifs diverses :...
269
270
      }
      //*/
ca6bb997   rguillom   Ajout Pgm/init.c ...
271
272
273
274
275
276
277
278
279
280
281
282
283
      
      /* Libération des interfaces*/
      liberer_interfaces();
      
  	/* Fermeture du périphérique */
      libusb_close(handle);
      
      
  
      
      libusb_exit(context); //fermeture de la bibliothèque
      return 0;
  }