Commit fe51ebfb739e3678a31985fe1acde6b277ec965c
1 parent
5e9ff3d3
avancées part1
Showing
2 changed files
with
165 additions
and
1 deletions
Show diff stats
lufa-master/PolytechLille/PAD/PAD.h
... | ... | @@ -46,7 +46,7 @@ |
46 | 46 | #include "Descriptors.h" |
47 | 47 | |
48 | 48 | //#include <LUFA/Drivers/Board/LEDs.h> |
49 | - #include "LUFA/Drivers/PeripheralSerial.h" | |
49 | + //#include <LUFA/Drivers/PeripheralSerial.h> //inventé? | |
50 | 50 | #include <LUFA/Drivers/USB/USB.h> |
51 | 51 | #include <LUFA/Platform/Platform.h> |
52 | 52 | ... | ... |
... | ... | @@ -0,0 +1,164 @@ |
1 | +#include <libusb-1.0/libusb.h> | |
2 | +#include <stdio.h> | |
3 | +#include <stdlib.h> | |
4 | + | |
5 | +libusb_device_handle *handle=NULL; | |
6 | +libusb_device *device=NULL; | |
7 | +libusb_device *found=NULL; //notre périphérique | |
8 | + | |
9 | +struct TABLEAU{ | |
10 | + struct EP *tableau[3]; //tableau des points d'accès en interruption | |
11 | + int dernier; | |
12 | +}; | |
13 | + | |
14 | +struct EP { | |
15 | + uint8_t ep; //adresse d'accès de l'endpoint | |
16 | + unsigned char io; //décrit si c'est une entrée ou une sortie | |
17 | +}; | |
18 | + | |
19 | +//init structure tableau | |
20 | +struct TABLEAU tab_pa; | |
21 | + | |
22 | +void init_tableau(){ | |
23 | + for (int i=0;i<3;i++){ | |
24 | + tab_pa.tableau[i]=NULL; | |
25 | + } | |
26 | + tab_pa.dernier=0; | |
27 | +} | |
28 | + | |
29 | +/*énumération des périphériques USB*/ | |
30 | +void enum_periph(libusb_context *context){ | |
31 | + libusb_device **list; | |
32 | + ssize_t count=libusb_get_device_list(context,&list); | |
33 | + if(count<0) {perror("libusb_get_device_list"); exit(-1);} | |
34 | + ssize_t i=0; | |
35 | + for(i=0;i<count;i++){ | |
36 | + libusb_device *device=list[i]; //enregistre l'appareil i dans la liste list | |
37 | + struct libusb_device_descriptor desc; | |
38 | + int status=libusb_get_device_descriptor(device,&desc); //enregistre le descripteur d'appareil | |
39 | + if(status!=0) continue; | |
40 | + uint8_t bus=libusb_get_bus_number(device); //num bus | |
41 | + uint8_t address=libusb_get_device_address(device); //num adresse | |
42 | + printf("Device Found @ (Bus:Address) %d:%d\n",bus,address); | |
43 | + printf("Vendor ID 0x0%x\n",desc.idVendor); | |
44 | + printf("Product ID 0x0%x\n",desc.idProduct); | |
45 | + | |
46 | + /* PEUT VARIER D'UNE CARTE A L'AUTRE ?*/ | |
47 | + if(desc.idVendor == 0x2341 && desc.idProduct == 0x0001) found = device; //recherche de notre périphérique et sauvegarde dans found | |
48 | + //printf("device :%d \n handle : %d\n", device, found); //test si le "found" reste le meme | |
49 | + } | |
50 | + libusb_free_device_list(list,1); | |
51 | +} | |
52 | + | |
53 | + | |
54 | +void config_periph(){ | |
55 | + struct libusb_config_descriptor *config=NULL; | |
56 | + libusb_get_active_config_descriptor(found,&config); //on récupère la structure config_descriptor config dans found | |
57 | + | |
58 | + int interface; | |
59 | + | |
60 | + for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){ | |
61 | + | |
62 | + //Si le méchant noyau est passé avant nous | |
63 | + | |
64 | + //On récupère tous les numéros des alt_settings numéro 0 => for et détach | |
65 | + | |
66 | + interface=config->interface[num_intf].altsetting[0].bInterfaceNumber; | |
67 | + | |
68 | + // on detache cette interface | |
69 | + if(libusb_kernel_driver_active(handle,interface)){ | |
70 | + int status=libusb_detach_kernel_driver(handle,interface); | |
71 | + if(status!=0){ perror("libusb_detach_kernel_driver"); exit(-1); } //si status!=0 il y a une erreur | |
72 | + } | |
73 | + printf("indice intf trouvée %d\n",interface); | |
74 | + } | |
75 | + | |
76 | + | |
77 | + //Utilisation d'une configuration du périphérique | |
78 | + int configuration=config->bConfigurationValue; | |
79 | + printf("valeur config %d\n", config->bConfigurationValue); // Affichage valeur de la configuration | |
80 | + int status=libusb_set_configuration(handle,configuration); | |
81 | + if(status!=0){ perror("libusb_set_configuration"); exit(-1); } | |
82 | + | |
83 | + //Appropriation de toutes les interfaces (fonctionnalité USB) | |
84 | + for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){ | |
85 | + status=libusb_claim_interface(handle,num_intf); | |
86 | + if(status!=0){ perror("libusb_claim_interface"); exit(-1); } //si status!=0 il y a une erreur | |
87 | + printf("indice interface claim %d\n",num_intf); | |
88 | + } | |
89 | + | |
90 | + | |
91 | + | |
92 | + //Sauvegarde des points d'accès | |
93 | + for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){ | |
94 | + for(int num_ep=0;num_ep<config->interface[num_intf].altsetting[0].bNumEndpoints ;num_ep++){ | |
95 | + int eptype = config->interface[num_intf].altsetting[0].endpoint->bDescriptorType; | |
96 | + if((eptype & 0b11)==LIBUSB_TRANSFER_TYPE_INTERRUPT){ //sauvegarde dans tab_pa du point d'accès qui est une interruption | |
97 | + struct EP ep1; | |
98 | + | |
99 | + | |
100 | + | |
101 | + /* | |
102 | + //LAISSER TOMBER INPUT OUTPUT | |
103 | + ep1.ep=config->interface[num_intf].altsetting[0].endpoint.bEndpointAddress; | |
104 | + if (num_intf==0){ | |
105 | + if (eptype & 0b10000000 == LIBUSB_ENDPOINT_OUT){ | |
106 | + tab_pa.tableau[num_intf].ep=ep1.ep; | |
107 | + tab_pa.tableau[num_intf].io=1; | |
108 | + tab_pa.dernier++; | |
109 | + break; | |
110 | + } //sortie => io=1 | |
111 | + } | |
112 | + else{ | |
113 | + if (eptype & 0b10000000 == LIBUSB_ENDPOINT_IN) { | |
114 | + tab_pa.tableau[num_intf].ep=ep1.ep; | |
115 | + tab_pa.tableau[num_intf].io=0; | |
116 | + tab_pa.dernier++; | |
117 | + if (num_ep >2)break;//entrée => io=0 | |
118 | + } | |
119 | + } | |
120 | + */ | |
121 | + } | |
122 | + } | |
123 | + if (num_intf == 3) break; | |
124 | + } | |
125 | + | |
126 | + | |
127 | + | |
128 | + | |
129 | + //release des interfaces | |
130 | + for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){ | |
131 | + status=libusb_release_interface(handle,interface); | |
132 | + if(status!=0){ perror("libusb_release_interface"); exit(-1); } | |
133 | + | |
134 | + } | |
135 | +} | |
136 | + | |
137 | + | |
138 | + | |
139 | + | |
140 | +int main(){ | |
141 | + init_tableau(); // initialisation tableau point d'accès endpoint | |
142 | + //initialisation de la bibliothèque libusb-1.0 | |
143 | + libusb_context *context; | |
144 | + int status=libusb_init(&context); | |
145 | + if(status!=0) {perror("libusb_init"); exit(-1);} | |
146 | + //fin inititialisation | |
147 | + | |
148 | + enum_periph(context); //énumération périphériques USB | |
149 | + | |
150 | + //ouverture du périphérique | |
151 | + //libusb_device_handle *handle; | |
152 | + int status_ouv=libusb_open(found,&handle); | |
153 | + if(status_ouv!=0){ perror("libusb_open"); exit(-1); } //status_ouv!=0 => erreur d'ouverture | |
154 | + | |
155 | + config_periph(); | |
156 | + | |
157 | + | |
158 | + | |
159 | + /*fermeture du périphérique*/ | |
160 | + libusb_close(handle); | |
161 | + | |
162 | + libusb_exit(context); //fermeture de la bibliothèque | |
163 | + return 0; | |
164 | +} | ... | ... |