Commit fe51ebfb739e3678a31985fe1acde6b277ec965c

Authored by rguillom
1 parent 5e9ff3d3

avancées part1

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  
... ...
lufa-master/PolytechLille/PAD/init_USB.c 0 → 100644
... ... @@ -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 +}
... ...