ca6bb997
rguillom
Ajout Pgm/init.c ...
|
1
2
3
4
5
|
#include <libusb-1.0/libusb.h>
#include <stdio.h>
#include <stdlib.h>
/* Caractéristiques du périphérique */
|
cf8950d2
rguillom
suppression magic...
|
6
7
8
|
#define VENDOR_ID 0x2341
#define PRODUCT_ID 0x0001
#define TAB_PA_SIZE 10
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
9
10
11
12
13
14
|
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);}
|
cf8950d2
rguillom
suppression magic...
|
185
|
|
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;
|
cf8950d2
rguillom
suppression magic...
|
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
|
*/
|
cf8950d2
rguillom
suppression magic...
|
231
|
|
0fd27a37
rguillom
fix
|
232
|
receive_data(tab_PA, &boutons, &joystick_x, &joystick_y); //Réception des boutons et joystick
|
cf8950d2
rguillom
suppression magic...
|
233
234
|
|
0fd27a37
rguillom
fix
|
235
|
printf("Boutons : %02x, Joystick_x : %02x, Joystick_y :%02x\n", boutons, joystick_x, joystick_y); //Affichage si changement
|
cf8950d2
rguillom
suppression magic...
|
236
|
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...
|
237
|
|
0fd27a37
rguillom
fix
|
238
239
240
|
boutons_anc = boutons;
joystick_x_anc = joystick_x;
joystick_y_anc = joystick_y;
|
3966cf83
rguillom
modifs diverses :...
|
241
|
//}
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
242
|
|
3966cf83
rguillom
modifs diverses :...
|
243
244
|
}
//*/
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
245
246
247
248
249
250
251
252
253
254
255
256
257
|
/* Libération des interfaces*/
liberer_interfaces();
/* Fermeture du périphérique */
libusb_close(handle);
libusb_exit(context); //fermeture de la bibliothèque
return 0;
}
|