#include //bibliothèque USB #include #include #include #include #include #include libusb_device **list; libusb_device_handle *handle = NULL; libusb_device *device; struct termios termios_p; int init_serial(char *device,int speed) //Initialisation du port série { int fd=open(device,O_RDWR); if(fd<0){perror(device); exit(-1);} //Lecture des parametres courants tcgetattr(fd,&termios_p); //On ignore les BREAK et les caracteres avec erreurs de parite termios_p.c_iflag = IGNBRK | IGNPAR; //Pas de mode de sortie particulier termios_p.c_oflag = 0; //Liaison a 9600 bps avec 7 bits de donnees et une parite paire termios_p.c_cflag = B9600 | CS7 | PARENB; //Mode non-canonique avec echo termios_p.c_lflag = ECHO; //Caracteres immediatement disponibles termios_p.c_cc[VMIN] = 1; termios_p.c_cc[VTIME] = 0; //Sauvegarde des nouveaux parametres tcsetattr(fd,TCSANOW,&termios_p); return fd; } void close_serial(int fd) //Fermeture du port série { tcsetattr(fd,TCSANOW,&termios_p); close(fd); } void callback(struct libusb_transfer *transf) //Fonction pour le transfert des instructions à la tourelle { libusb_fill_control_setup(transf->buffer, 0xa1, 0x01, 0x300, 0x00, 0); libusb_fill_control_transfer(transf, transf->dev_handle, transf->buffer, NULL, NULL, 1000); fflush(stdout); libusb_free_transfer(transf); //on libere la structure de transfert } void configuration_periph(libusb_device *device) //Configuration de la tourelle { //Ouverture du pepherique int status=libusb_open(device,&handle); if(status!=0) { perror("libusb_open"); exit(-1); } //Recuperation de la configuration d'indice 0 du périphérique struct libusb_config_descriptor *config; status=libusb_get_active_config_descriptor(device,&config); if(status!=0) { perror("libusb_get_active_config_descriptor"); exit(-1); } //Interfaces int i; int interface; //Probleme noyau for(i=0;i<(config->bNumInterfaces);i++) { if(libusb_kernel_driver_active(handle,interface)) { status=libusb_detach_kernel_driver(handle,interface); if(status!=0) { perror("libusb_detach_kernel_driver"); exit(-1); } } } //Utilisation d'une configuration du périphérique int configuration=config->bConfigurationValue; printf("%d\n", configuration); /* status=libusb_set_configuration(handle,configuration); if(status!=0) { perror("libusb_set_configuration"); exit(-1); } //Claim interfaces for(i=0;i<(config->bNumInterfaces);i++) { interface=config->interface[i].altsetting[0].bInterfaceNumber; printf("Numero d'interface : %d\n", interface); status=libusb_claim_interface(handle,interface); if(status!=0) { perror("libusb_claim_interface"); exit(-1); } }*/ } void fermeture(libusb_device_handle *handle) //Fermeture du périphérique { int i, interface, status; libusb_device *device = libusb_get_device(handle); struct libusb_config_descriptor *config; status = libusb_get_active_config_descriptor(device, &config); if(status != 0) { perror("libusb_get_active_config_descriptor");exit(-1); } for(i=0;i<(config->bNumInterfaces);i++) { interface=config->interface[i].altsetting[0].bInterfaceNumber; status=libusb_release_interface(handle,interface); //On libère l'interface if(status!=0) { perror("libusb_release_interface"); exit(-1); } printf("Interface liberee : %d\n",interface); } libusb_close(handle); } void enumeration(libusb_context *context) //Enumération des périphériques USB { int t=0; 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