diff --git a/USB/Makefile b/USB/Makefile new file mode 100644 index 0000000..fc3296a --- /dev/null +++ b/USB/Makefile @@ -0,0 +1,25 @@ + +export CC = gcc + +export LDFLAGS = -l usb-1.0 + + +TARGET = usb_driver + + + +C_SRC = $(wildcard *.c) +OBJS = $(C_SRC:.c=.o) + +all: $(TARGET) + +clean: + rm -f *.o + + +%.o:%.c + $(CC) -c $< -o $@ + +$(TARGET): $(OBJS) + $(CC) -o $@ $(OBJS) $(LDFLAGS) + diff --git a/USB/Makefile~ b/USB/Makefile~ new file mode 100644 index 0000000..3e0dbe1 --- /dev/null +++ b/USB/Makefile~ @@ -0,0 +1,5 @@ +tutorat : tutorat.o + gcc -o tutorat tutorat.o -l usb-1.0 + +tutorat.o : tutorat.c + gcc -c tutorat.c diff --git a/USB/usb_driver b/USB/usb_driver new file mode 100755 index 0000000..8f28cb7 Binary files /dev/null and b/USB/usb_driver differ diff --git a/USB/usb_driver.c b/USB/usb_driver.c new file mode 100644 index 0000000..fae9656 --- /dev/null +++ b/USB/usb_driver.c @@ -0,0 +1,403 @@ +#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