fe51ebfb
rguillom
avancées part1
|
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include <libusb-1.0/libusb.h>
#include <stdio.h>
#include <stdlib.h>
libusb_device_handle *handle=NULL;
libusb_device *device=NULL;
libusb_device *found=NULL; //notre périphérique
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_context *context){
libusb_device **list;
ssize_t count=libusb_get_device_list(context,&list);
if(count<0) {perror("libusb_get_device_list"); exit(-1);}
ssize_t i=0;
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;
uint8_t bus=libusb_get_bus_number(device); //num bus
uint8_t address=libusb_get_device_address(device); //num adresse
printf("Device Found @ (Bus:Address) %d:%d\n",bus,address);
printf("Vendor ID 0x0%x\n",desc.idVendor);
printf("Product ID 0x0%x\n",desc.idProduct);
/* PEUT VARIER D'UNE CARTE A L'AUTRE ?*/
if(desc.idVendor == 0x2341 && desc.idProduct == 0x0001) found = device; //recherche de notre périphérique et sauvegarde dans found
//printf("device :%d \n handle : %d\n", device, found); //test si le "found" reste le meme
}
libusb_free_device_list(list,1);
}
void config_periph(){
struct libusb_config_descriptor *config=NULL;
libusb_get_active_config_descriptor(found,&config); //on récupère la structure config_descriptor config dans found
int interface;
for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){
//Si le méchant noyau est passé avant nous
//On récupère tous les numéros des alt_settings numéro 0 => for et détach
interface=config->interface[num_intf].altsetting[0].bInterfaceNumber;
// on detache cette interface
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); } //si status!=0 il y a une erreur
}
printf("indice intf trouvée %d\n",interface);
}
//Utilisation d'une configuration du périphérique
int configuration=config->bConfigurationValue;
printf("valeur config %d\n", config->bConfigurationValue); // Affichage valeur de la configuration
int status=libusb_set_configuration(handle,configuration);
if(status!=0){ perror("libusb_set_configuration"); exit(-1); }
//Appropriation de toutes les interfaces (fonctionnalité USB)
for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){
status=libusb_claim_interface(handle,num_intf);
if(status!=0){ perror("libusb_claim_interface"); exit(-1); } //si status!=0 il y a une erreur
printf("indice interface claim %d\n",num_intf);
}
//Sauvegarde des points d'accès
for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){
for(int num_ep=0;num_ep<config->interface[num_intf].altsetting[0].bNumEndpoints ;num_ep++){
int eptype = config->interface[num_intf].altsetting[0].endpoint->bDescriptorType;
|
1bbb7756
gcremasc
J'ai apporté qque...
|
96
97
|
// Regarde si les endpoint sont de type interruption.
|
fe51ebfb
rguillom
avancées part1
|
98
99
100
|
if((eptype & 0b11)==LIBUSB_TRANSFER_TYPE_INTERRUPT){ //sauvegarde dans tab_pa du point d'accès qui est une interruption
struct EP ep1;
|
1bbb7756
gcremasc
J'ai apporté qque...
|
101
|
//met les endpoint dans un tableau en indiquant arbitrairement si on le veut en sortie ou non (voir les struct du début)
|
fe51ebfb
rguillom
avancées part1
|
102
103
|
ep1.ep=config->interface[num_intf].altsetting[0].endpoint.bEndpointAddress;
if (num_intf==0){
|
fe51ebfb
rguillom
avancées part1
|
104
105
106
|
tab_pa.tableau[num_intf].ep=ep1.ep;
tab_pa.tableau[num_intf].io=1;
tab_pa.dernier++;
|
fe51ebfb
rguillom
avancées part1
|
107
108
|
}
else{
|
1bbb7756
gcremasc
J'ai apporté qque...
|
109
|
|
fe51ebfb
rguillom
avancées part1
|
110
111
112
113
|
tab_pa.tableau[num_intf].ep=ep1.ep;
tab_pa.tableau[num_intf].io=0;
tab_pa.dernier++;
if (num_ep >2)break;//entrée => io=0
|
1bbb7756
gcremasc
J'ai apporté qque...
|
114
|
} // Le if et else ci-dessus doivent pouvoir être simplifiés.
|
fe51ebfb
rguillom
avancées part1
|
115
116
117
118
119
120
|
}
}
if (num_intf == 3) break;
}
|
1bbb7756
gcremasc
J'ai apporté qque...
|
121
|
|
fe51ebfb
rguillom
avancées part1
|
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
//release des interfaces
for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){
status=libusb_release_interface(handle,interface);
if(status!=0){ perror("libusb_release_interface"); exit(-1); }
}
}
int main(){
init_tableau(); // initialisation tableau point d'accès endpoint
//initialisation de la bibliothèque libusb-1.0
libusb_context *context;
int status=libusb_init(&context);
if(status!=0) {perror("libusb_init"); exit(-1);}
//fin inititialisation
enum_periph(context); //énumération périphériques USB
//ouverture du périphérique
//libusb_device_handle *handle;
int status_ouv=libusb_open(found,&handle);
if(status_ouv!=0){ perror("libusb_open"); exit(-1); } //status_ouv!=0 => erreur d'ouverture
config_periph();
/*fermeture du périphérique*/
libusb_close(handle);
libusb_exit(context); //fermeture de la bibliothèque
return 0;
|
1bbb7756
gcremasc
J'ai apporté qque...
|
158
|
}
|