Blame view

Pgm PC/init_USB.c 9.21 KB
ca6bb997   rguillom   Ajout Pgm/init.c ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  #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;
  
ca6bb997   rguillom   Ajout Pgm/init.c ...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  
  /*é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...
37
          printf("Product ID 0x0%x\n\n",desc.idProduct);
ca6bb997   rguillom   Ajout Pgm/init.c ...
38
39
40
41
          
          /* Recherche de notre périphérique et sauvegarde dans 'found' */
          if(desc.idVendor == VENDOR_ID && desc.idProduct == PRODUCT_ID){
          	found = device;
0fd27a37   rguillom   fix
42
43
          	printf("\nPériphérique trouvé @ (Bus:Adresse) %d:%d\n", bus, address);
          	//printf("handle %d\n",found);
ca6bb997   rguillom   Ajout Pgm/init.c ...
44
45
46
47
48
49
50
51
          	break;
          }
      }
      if (found == NULL) printf("Périphérique non trouvé\n");
      libusb_free_device_list(list,1);
  }
  
  
3966cf83   rguillom   modifs diverses :...
52
  void config_periph(unsigned char tab_PA[TAB_PA_SIZE]){
ca6bb997   rguillom   Ajout Pgm/init.c ...
53
54
55
56
  
  	/* 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...
57
      printf("La valeur de la configuration d'indice 0 est %d\n",config_desc->bConfigurationValue);
ca6bb997   rguillom   Ajout Pgm/init.c ...
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
      
      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 :...
76
77
      
      int dernier_PA=-1;
ca6bb997   rguillom   Ajout Pgm/init.c ...
78
79
      int configuration=config_desc->bConfigurationValue;
      
01b3f0af   rguillom   PAD.c modif fonct...
80
      //printf("valeur config %d\n", configuration); // Affichage valeur de la configuration
ca6bb997   rguillom   Ajout Pgm/init.c ...
81
82
83
84
85
86
87
88
89
90
91
      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...
92
      	printf("\tInterface d'indice %d et de numéro %d réclamée\n",indice_intf,num_intf);
ca6bb997   rguillom   Ajout Pgm/init.c ...
93
94
95
96
      
  
  
  		/* Parcours des points d'accès (Endpoint) pour chaque interface*/
ca6bb997   rguillom   Ajout Pgm/init.c ...
97
  		
3966cf83   rguillom   modifs diverses :...
98
99
  		for(int num_PA=0;num_PA<config_desc->interface[indice_intf].altsetting[0].bNumEndpoints ;num_PA++){
  			
ca6bb997   rguillom   Ajout Pgm/init.c ...
100
101
  			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...
102
              printf("\t\tPoint d'accès trouvé. Adresse : %d\n",adresse_PA);
ca6bb997   rguillom   Ajout Pgm/init.c ...
103
104
105
              
          	/* Regarde si le point d'accès est de type interruption.
          	Si oui, on le sauvegarde. */
ca6bb997   rguillom   Ajout Pgm/init.c ...
106
107
108
109
          	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...
110
              	printf("\t\tPoint d'accès numéro %d sauvegardé. Adresse : %d\n", dernier_PA, adresse_PA);
ca6bb997   rguillom   Ajout Pgm/init.c ...
111
            	}
3966cf83   rguillom   modifs diverses :...
112
113
          
          }	
ca6bb997   rguillom   Ajout Pgm/init.c ...
114
      }
3966cf83   rguillom   modifs diverses :...
115
      //printf("dernier indice tab_PA : %d\n", dernier_PA);
ca6bb997   rguillom   Ajout Pgm/init.c ...
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  }
  
  
  /* 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...
137
          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 ...
138
139
140
141
142
143
144
145
  	}
  }
  
  
  /* 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 :...
146
  	printf("adresse PA %d\n", tab_PA[0]);
01b3f0af   rguillom   PAD.c modif fonct...
147
  	int transferred = 1; 	//nombre d'octets transférés
0fd27a37   rguillom   fix
148
  	unsigned int timeout = 100;	//temps avant un timeout
01b3f0af   rguillom   PAD.c modif fonct...
149
  	int status = libusb_interrupt_transfer(handle, PA, &data, sizeof(data), &transferred, timeout);
ca6bb997   rguillom   Ajout Pgm/init.c ...
150
151
152
153
154
155
  	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){
0fd27a37   rguillom   fix
156
157
158
159
160
  	
  	unsigned char PA;
  	int length, transferred;
  	unsigned int timeout;	
  	
ca6bb997   rguillom   Ajout Pgm/init.c ...
161
  	/* Lecture du point d'accès des boutons */
0fd27a37   rguillom   fix
162
  	PA = tab_PA[1]; //LEDs sur le premier point d'accès
ca6bb997   rguillom   Ajout Pgm/init.c ...
163
  	
0fd27a37   rguillom   fix
164
165
166
167
168
169
170
171
172
  	//printf("adresse PA %d\n", tab_PA[1]);
  	//printf("handle %d\n",found);
  	//printf("boutons %p\n", boutons);
  	
  	length = 1;
  	timeout = 100;	//temps avant un timeout
  	
  	int status = libusb_interrupt_transfer(handle, PA, boutons, length, &transferred, timeout);
  	if(status!=0){perror("libusb_interrupt_transfer");exit(-1);}
ca6bb997   rguillom   Ajout Pgm/init.c ...
173
174
  	
  	/* Lecture du point d'accès du joystick */
0fd27a37   rguillom   fix
175
  	unsigned char joystick_xy[2]; //stocke la donnée du point d'accès (1 octet pour chaque axe)
ca6bb997   rguillom   Ajout Pgm/init.c ...
176
177
  
  	PA = tab_PA[2]; //LEDs sur le premier point d'accès
0fd27a37   rguillom   fix
178
179
180
  	//printf("adresse PA %d\n", tab_PA[2]);
  	length = 2;
  	timeout = 100;	//temps avant un timeout
ca6bb997   rguillom   Ajout Pgm/init.c ...
181
  	
0fd27a37   rguillom   fix
182
  	status = libusb_interrupt_transfer(handle, PA, joystick_xy, length, &transferred, timeout);
ca6bb997   rguillom   Ajout Pgm/init.c ...
183
184
  	if(status!=0){perror("libusb_interrupt_transfer");exit(-1);}
  	
0fd27a37   rguillom   fix
185
  	//TODO Pas sûr !
01b3f0af   rguillom   PAD.c modif fonct...
186
187
188
189
  	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 ...
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  }
  
  
  
  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 :...
211
      unsigned char tab_PA[TAB_PA_SIZE];
ca6bb997   rguillom   Ajout Pgm/init.c ...
212
213
      config_periph(tab_PA);
      
0fd27a37   rguillom   fix
214
215
216
      unsigned char boutons, boutons_anc=0xff;
      unsigned char joystick_x, joystick_x_anc=0xff;
      unsigned char joystick_y, joystick_y_anc=0xff;
01b3f0af   rguillom   PAD.c modif fonct...
217
      unsigned char caractere;
ca6bb997   rguillom   Ajout Pgm/init.c ...
218
      
3966cf83   rguillom   modifs diverses :...
219
220
221
222
223
      
      //TODO boucle while(pas d'arrêt), envoi et rcpt
      //TODO "pas d'arrêt" = appui sur 's' par exemple
      
      while(1){
0fd27a37   rguillom   fix
224
225
      	/*// si un caractère intéressant est tapé au clavier, l'envoie à la carte.
  		if (((c=getchar())>='a' && (c=getchar())<='f') || ((c=getchar())>='A' && (c=getchar())<='F')) { 
01b3f0af   rguillom   PAD.c modif fonct...
226
      		//récupération caractère
0fd27a37   rguillom   fix
227
      		send_data(tab_PA, c);	//Envoi de la commande des leds
01b3f0af   rguillom   PAD.c modif fonct...
228
229
      	}
      	else {
3966cf83   rguillom   modifs diverses :...
230
      	*/
0fd27a37   rguillom   fix
231
232
233
234
235
      		//printf("début rcpt\n");
      		receive_data(tab_PA, &boutons, &joystick_x, &joystick_y); //Réception des boutons et joystick
      		//printf("fin rcpt\n");
      		printf("Boutons : %02x, Joystick_x : %02x, Joystick_y :%02x\n", boutons, joystick_x, joystick_y);	//Affichage si changement
      		if ((boutons != boutons_anc) || (joystick_x != joystick_x_anc) || (joystick_y != joystick_y_anc)) printf("Boutons : %02x, Joystick_x : %02x, Joystick_y :%c\n", boutons, joystick_x, joystick_y);	//Affichage si changement
01b3f0af   rguillom   PAD.c modif fonct...
236
      		
0fd27a37   rguillom   fix
237
238
239
      		boutons_anc = boutons;
      		joystick_x_anc = joystick_x;
      		joystick_y_anc = joystick_y;
3966cf83   rguillom   modifs diverses :...
240
      	//}
ca6bb997   rguillom   Ajout Pgm/init.c ...
241
      
3966cf83   rguillom   modifs diverses :...
242
243
      }
      //*/
ca6bb997   rguillom   Ajout Pgm/init.c ...
244
245
246
247
248
249
250
251
252
253
254
255
256
      
      /* Libération des interfaces*/
      liberer_interfaces();
      
  	/* Fermeture du périphérique */
      libusb_close(handle);
      
      
  
      
      libusb_exit(context); //fermeture de la bibliothèque
      return 0;
  }