diff --git a/Pgm PC/init_USB.c b/Pgm PC/init_USB.c new file mode 100644 index 0000000..d148334 --- /dev/null +++ b/Pgm PC/init_USB.c @@ -0,0 +1,252 @@ +#include +#include +#include + +/* Caractéristiques du périphérique */ +#define VENDOR_ID 0x2341 +#define PRODUCT_ID 0x0001 +#define TAB_PA_SIZE 10 + +libusb_device_handle *handle=NULL; +libusb_device *device=NULL; +libusb_device *found=NULL; //notre périphérique +libusb_context *context; + +/* +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_device **list; + + /* On compte le nombre de périphérique connectés... */ + ssize_t count=libusb_get_device_list(context,&list); + if(count<0) {perror("libusb_get_device_list"); exit(-1);} + ssize_t i=0; + + /* et on en établit la liste complète */ + for(i=0;ibConfigurationValue); + + int interface; + + /* Si le noyau est passé avant nous, + On le détache pour chaque alternative d'interface numéro 0 */ + for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){ + + interface=config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber; + + 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); } //erreur si status!=0 + } + //printf("indice intf trouvée %d\n",interface); + } + + + /* Utilisation de la configuration */ + int configuration=config_desc->bConfigurationValue; + + printf("valeur config %d\n", configuration); // Affichage valeur de la configuration + status=libusb_set_configuration(handle,configuration); + if(status!=0){ perror("libusb_set_configuration"); exit(-1); } + + + /* Appropriation de toutes les interfaces */ + int num_intf; + for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){ + num_intf = config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber; + + status=libusb_claim_interface(handle,indice_intf); + if(status!=0){ perror("libusb_claim_interface"); exit(-1); } + printf("Interface d'indice %d et de numéro %d réclamée\n",indice_intf,num_intf); + + + + /* Parcours des points d'accès (Endpoint) pour chaque interface*/ + for(int num_PA=0;num_PAinterface[indice_intf].altsetting[0].bNumEndpoints ;num_PA++){ + + int type_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bmAttributes; + uint8_t adresse_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bEndpointAddress; + printf("Point d'accès trouvé. Adresse :%d\n",adresse_PA); + + /* Regarde si le point d'accès est de type interruption. + Si oui, on le sauvegarde. */ + int dernier_PA=-1; + if((type_PA & 0b11)==LIBUSB_TRANSFER_TYPE_INTERRUPT){ + //struct EP ep1; + dernier_PA++; + tab_PA[dernier_PA] = adresse_PA; + printf("Point d'accès numéro %d sauvegardé. Adresse : %d\n", dernier_PA, adresse_PA); + + /* + ep1.ep=config_desc->interface[indice_intf].altsetting[0].endpoint->bEndpointAddress; + if (indice_intf==0){ + tab_pa.tableau[indice_intf]->ep=ep1.ep; + tab_pa.tableau[indice_intf]->io=1; + tab_pa.dernier++; + } + else{ + tab_pa.tableau[indice_intf]->ep=ep1.ep; + tab_pa.tableau[indice_intf]->io=0; + tab_pa.dernier++; + if (num_ep >2)break; //entrée => io=0 + + // Le if et else ci-dessus doivent pouvoir être simplifiés. + */ + } + } + } +} + + +/* Libération des interfaces de la configuration active */ +void liberer_interfaces(){ + + /* Récupération de la configuration active */ + + struct libusb_config_descriptor* config_desc; + int status =libusb_get_active_config_descriptor(found,&config_desc); + if(status!=0){perror("libusb_get_active_config_descriptor");exit(-1);} + + /* On parcourt toutes les interfaces*/ + int num_intf; + for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){ + num_intf=config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber; + + /* Libération de l'interface num_intf*/ + status=libusb_release_interface(handle,num_intf); + if(status!=0){ perror("libusb_release_interface"); exit(-1); } + + printf("L'interface numéro %d , d'indice %d a été libérée.\n", num_intf,indice_intf); + } +} + + +/* Envoie un caractère (de commande de LED) sur le port USB */ +void send_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char data){ + + unsigned char PA = tab_PA[0]; //LEDs sur le premier point d'accès + int *transferred = 1; //nombre d'octets transférés + unsigned int timeout = 1000; //temps avant un timeout + int status = libusb_interrupt_transfer(struct libusb_device_handle *handle, PA, &data, sizeof(data), &transferred, timeout) + if(status!=0){perror("libusb_interrupt_transfer");exit(-1);} +} + + +/* Lis le contenu des points d'accès de l'interface IN (boutons et joystick) */ +void receive_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char *boutons, unsigned char *joystick_x, unsigned char *joystick_y){ + + /* Lecture du point d'accès des boutons */ + unsigned char PA = tab_PA[1]; //LEDs sur le premier point d'accès + int *transferred = 1; //nombre d'octets transférés + unsigned int timeout = 1000; //temps avant un timeout + + int status = libusb_interrupt_transfer(struct libusb_device_handle *handle, PA, &boutons, sizeof(boutons), &transferred, timeout) + if(status!=0){perror("libusb_interrupt_transfer");exit(-1);} + + /* Lecture du point d'accès du joystick */ + unsigned char *joystick_xy; //stocke la donnée du point d'accès (1 octet pour chaque axe) + + PA = tab_PA[2]; //LEDs sur le premier point d'accès + *transferred = 2; //nombre d'octets transférés + timeout = 1000; //temps avant un timeout + + int status = libusb_interrupt_transfer(struct libusb_device_handle *handle, PA, &joystick_xy, sizeof(joystick_xy), &transferred, timeout) + if(status!=0){perror("libusb_interrupt_transfer");exit(-1);} + + //TODO Pas sûr !!! + *joystick_x = joystick_xy[0]; //On sépare la data de chaque axe + *joystick_y = joystick_xy[1]; +} + + + +int main(){ + //init_tableau(); // initialisation tableau point d'accès endpoint + + /* Initialisation de la bibliothèque libusb-1.0 */ + + int status=libusb_init(&context); + if(status!=0) {perror("libusb_init"); exit(-1);} + //fin inititialisation + + /* Enumération des périphériques USB */ + enum_periph(); + + /* Ouverture de notre périphérique 'found' */ + int status_ouv=libusb_open(found,&handle); + if(status_ouv!=0){ perror("libusb_open"); exit(-1); } + + /* Configuration du périphérique et sauvegarde des points d'accès */ + char tab_PA[TAB_PA_SIZE]; + config_periph(tab_PA); + + unsigned char *boutons; + unsigned char *joystick_x; + unsigned char *joystick_x; + + //boucle while(pas d'arrêt), envoi et rcpt + // "pas d'arrêt" = appui sur 's' par exemple + + + /* Libération des interfaces*/ + liberer_interfaces(); + + /* Fermeture du périphérique */ + libusb_close(handle); + + + + + libusb_exit(context); //fermeture de la bibliothèque + return 0; +} diff --git a/lufa-master/PolytechLille/PAD/Descriptors.c b/lufa-master/PolytechLille/PAD/Descriptors.c index 9236f78..b2fed06 100644 --- a/lufa-master/PolytechLille/PAD/Descriptors.c +++ b/lufa-master/PolytechLille/PAD/Descriptors.c @@ -123,7 +123,7 @@ const USB_Descriptor_Configuration_t PROGMEM RelayBoard_ConfigurationDescriptor .EndpointAddress = KEYBOARD_OUT_EPADDR, .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = KEYBOARD_EPSIZE, + .EndpointSize = LED_EPSIZE, .PollingIntervalMS = 0x05 }, diff --git a/lufa-master/PolytechLille/PAD/Descriptors.h b/lufa-master/PolytechLille/PAD/Descriptors.h index 6291518..56a83e2 100644 --- a/lufa-master/PolytechLille/PAD/Descriptors.h +++ b/lufa-master/PolytechLille/PAD/Descriptors.h @@ -53,11 +53,11 @@ // Relay Board Interface USB_Descriptor_Interface_t InterfaceOUT; //USB_HID_Descriptor_HID_t HID_KeyboardHID; //UTILE ? - USB_Descriptor_Endpoint_t HID_ReportOUTEndpoint; + USB_Descriptor_Endpoint_t ReportOUTEndpoint; USB_Descriptor_Interface_t InterfaceIN; - USB_Descriptor_Endpoint_t HID_ReportINEndpointBoutons; - USB_Descriptor_Endpoint_t HID_ReportOUTEndpointJoystick; + USB_Descriptor_Endpoint_t ReportINEndpointBoutons; + USB_Descriptor_Endpoint_t ReportOUTEndpointJoystick; } USB_Descriptor_Configuration_t; /** Enum for the device interface descriptor IDs within the device. Each interface descriptor @@ -93,9 +93,9 @@ #define KEYBOARD_OUT_EPADDR (ENDPOINT_DIR_OUT | 2) /** Size in bytes of the Keyboard HID reporting IN and OUT endpoints. */ - #define KEYBOARD_EPSIZE 8 - #define BOUTONS_EPSIZE 8 - #define JOYSTICK_EPSIZE 16 + #define LED_EPSIZE 1 + #define BOUTONS_EPSIZE 1 + #define JOYSTICK_EPSIZE 2 /* Function Prototypes: */ diff --git a/lufa-master/PolytechLille/PAD/PAD.h b/lufa-master/PolytechLille/PAD/PAD.h index 45285f8..35535e0 100644 --- a/lufa-master/PolytechLille/PAD/PAD.h +++ b/lufa-master/PolytechLille/PAD/PAD.h @@ -58,7 +58,7 @@ void EVENT_USB_Device_ConfigurationChanged(void); void SendNextReport(void); void ReceiveNextReport(void); - void EVENT_USB_Device_ControlRequest(void); + //void EVENT_USB_Device_ControlRequest(void); #endif -- libgit2 0.21.2