Blame view

init_USB.c 5.48 KB
142ecdaf   rguillom   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  #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 {
58268c72   rguillom   Qq modifs mineurs
15
      uint8_t ep; 				//adresse d'accès de l'endpoint
142ecdaf   rguillom   first commit
16
17
18
19
20
21
22
23
24
25
26
27
28
      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;
  }
  
58268c72   rguillom   Qq modifs mineurs
29
  /*énumération des périphériques USB*/
142ecdaf   rguillom   first commit
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  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);
          
58268c72   rguillom   Qq modifs mineurs
46
          /* PEUT VARIER D'UNE CARTE A L'AUTRE ?*/ 
142ecdaf   rguillom   first commit
47
48
49
50
51
52
          if(desc.idVendor == 0x413c && desc.idProduct == 0x2003) 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);
  }
  
58268c72   rguillom   Qq modifs mineurs
53
  
142ecdaf   rguillom   first commit
54
  void config_periph(){
142ecdaf   rguillom   first commit
55
56
57
58
59
60
      struct libusb_config_descriptor *config=NULL;
      libusb_get_active_config_descriptor(found,&config);   //on récupère la structure config_descriptor config dans found
      
      for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){
          
          //Si le méchant noyau est passé avant nous
58268c72   rguillom   Qq modifs mineurs
61
          int interface; //on récupère tous les numéros des alt_settings numéro 0 => for et détach
142ecdaf   rguillom   first commit
62
63
64
          
          interface=config->interface[num_intf].altsetting[0].bInterfaceNumber;
  
58268c72   rguillom   Qq modifs mineurs
65
          // on detache cette interface
142ecdaf   rguillom   first commit
66
          if(libusb_kernel_driver_active(handle,interface)){
58268c72   rguillom   Qq modifs mineurs
67
          int status=libusb_detach_kernel_driver(handle,interface);
142ecdaf   rguillom   first commit
68
69
70
71
72
73
          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);
      }
          
          
58268c72   rguillom   Qq modifs mineurs
74
75
76
77
      //Utilisation d'une configuration du périphérique
      int configuration=config->bConfigurationValue;
      int status=libusb_set_configuration(handle,configuration);
      if(status!=0){ perror("libusb_set_configuration"); exit(-1); }
142ecdaf   rguillom   first commit
78
          
58268c72   rguillom   Qq modifs mineurs
79
80
81
      //Appropriation d'une interface (fonctionnalité USB)
      status=libusb_claim_interface(handle,interface);   
      if(status!=0){ perror("libusb_claim_interface"); exit(-1); }  //si status!=0 il y a une erreur
142ecdaf   rguillom   first commit
82
          
58268c72   rguillom   Qq modifs mineurs
83
84
      printf("indice interface claim %d",interface);
         
142ecdaf   rguillom   first commit
85
  
58268c72   rguillom   Qq modifs mineurs
86
87
88
89
90
91
      //Sauvegarde des points d'accès
      for(int num_intf=0;num_intf < config->bNumInterfaces ;num_intf++){
          for(num_ep=0;num_ep<config->interface[num_intf].altsetting[0].bNumEndpoints ;num_ep++){
              int eptype = config->interface[num_intf].altsetting[0].endpoint.bDescriptorType;
              if(eptype & 0b11==LIBUSB_TRANSFER_TYPE_INTERRUPT){ //sauvegarde dans tab_pa du point d'accès qui est une interruption
                  struct EP ep1;
142ecdaf   rguillom   first commit
92
                      
58268c72   rguillom   Qq modifs mineurs
93
94
95
96
97
98
99
100
101
                  //LAISSER TOMBER INPUT OUTPUT
                  ep1.ep=config->interface[num_intf].altsetting[0].endpoint.bEndpointAddress;
                  if (num_intf==0){
                       if (eptype & 0b10000000 == LIBUSB_ENDPOINT_OUT){ 
                           tab_pa.tableau[num_intf].ep=ep1.ep;
                           tab_pa.tableau[num_intf].io=1;
                           tab_pa.dernier++;
                           break;
                      }      //sortie => io=1
142ecdaf   rguillom   first commit
102
                  }
58268c72   rguillom   Qq modifs mineurs
103
104
105
106
107
108
109
110
                  else{
                      if (eptype & 0b10000000 == LIBUSB_ENDPOINT_IN) {
                          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
                      }
                  }   
142ecdaf   rguillom   first commit
111
              }
142ecdaf   rguillom   first commit
112
          }
58268c72   rguillom   Qq modifs mineurs
113
114
      if (num_intf = 3) break;
      }
142ecdaf   rguillom   first commit
115
          
58268c72   rguillom   Qq modifs mineurs
116
117
118
119
      //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); }
142ecdaf   rguillom   first commit
120
              
58268c72   rguillom   Qq modifs mineurs
121
      }
142ecdaf   rguillom   first commit
122
  }
58268c72   rguillom   Qq modifs mineurs
123
  
142ecdaf   rguillom   first commit
124
125
126
127
128
129
  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);}
58268c72   rguillom   Qq modifs mineurs
130
      //fin inititialisation
142ecdaf   rguillom   first commit
131
132
133
134
135
136
137
138
139
140
141
      
      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
      
  
      
      
58268c72   rguillom   Qq modifs mineurs
142
      /*fermeture du périphérique*/
142ecdaf   rguillom   first commit
143
144
      libusb_close(handle);
      
58268c72   rguillom   Qq modifs mineurs
145
      libusb_exit(context); //fermeture de la bibliothèque
142ecdaf   rguillom   first commit
146
147
      return 0;
  }