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,7 +46,7 @@ | ||
46 | #include "Descriptors.h" | 46 | #include "Descriptors.h" |
47 | 47 | ||
48 | //#include <LUFA/Drivers/Board/LEDs.h> | 48 | //#include <LUFA/Drivers/Board/LEDs.h> |
49 | - #include "LUFA/Drivers/PeripheralSerial.h" | 49 | + //#include <LUFA/Drivers/PeripheralSerial.h> //inventé? |
50 | #include <LUFA/Drivers/USB/USB.h> | 50 | #include <LUFA/Drivers/USB/USB.h> |
51 | #include <LUFA/Platform/Platform.h> | 51 | #include <LUFA/Platform/Platform.h> |
52 | 52 |
@@ -0,0 +1,164 @@ | @@ -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 | +} |