URL: https://linuxfr.org/forums/programmation-c/posts/cr%C3%A9ation-dun-mini-driver-avec-libusb Title: Création d'un mini driver avec libusb Authors: ptitcon51 Date: 2007年04月02日T15:19:17+02:00 Tags: Score: 0 Bonjour a tous, J'essaie de communiquer avec une caméra rotative via un port usb. J'utilise donc la librairie libusb pour cela. Le but est de faire pivoter la caméra (on s'occupera de l'image plus tard). J'ai déjà récupéré les trames à envoyer à la caméra les endpoint le VendorId et PorductId avec lsusb et en utilisant les test de la librairies. Mon problème se situe lors de l'écriture, dois-je utiliser la fonctions "usb_bulk_write" ou "usb_control_msg". De plus quelqu'un pourrait-il m'éclairer sur les paramètres des ces fonctions? Ou trouver ce que l'on doit mettre. Sachant qu'en allant voir sur [http://libusb.sourceforge.net/doc](http://libusb.sourceforge.net/doc) on tombe sur des trucs du genre : int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout); ou encore, int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout); Ce qui ne m'éclaire pas plus sur les valeurs des entiers que je dois mettre. Pour l'info je n'arrive meme pas à faire éclaire la led de ma clé USB pour voir si je m'y connecte. voila mon petit bout de code pour ce qui veulent voir comment on accède au port usb. Avant d'écrire dessus. Et avec ma fonction write incomplète. #include <stdio.h> #include <errno.h> #include <stdio.h> #include <usb.h> #include using namespace std; #define CAM_VENDOR_ID 0x0930 #define CAM_PRODUCT_ID 0x6533 #define SIZE 32 #define IN_EP 0x81 #define OUT_EP 0x02 void write_data(usb_dev_handle *udev); int main(int argc, char *argv[]) { £spaces£ £/spaces£struct usb_bus *busses, *bus; £spaces£ £/spaces£int retval = 0; £spaces£ £/spaces£usb_init(); £spaces£ £/spaces£usb_find_busses(); £spaces£ £/spaces£usb_find_devices(); £spaces£ £/spaces£busses = usb_get_busses(); £spaces£ £/spaces£/* loop through busses... */ £spaces£ £/spaces£for (bus = busses; bus; bus = bus->next) { £spaces£ £/spaces£struct usb_device *dev; £spaces£ £/spaces£/* loop through devices on bus ...*/ £spaces£ £/spaces£for (dev = bus->devices; dev; dev = dev->next) { £spaces£ £/spaces£usb_dev_handle *udev; £spaces£ £/spaces£if (dev->descriptor.idVendor == CAM_VENDOR_ID £spaces£ £/spaces£&& dev->descriptor.idProduct == CAM_PRODUCT_ID) { £spaces£ £/spaces£printf("Found remote\n"); £spaces£ £/spaces£udev = usb_open(dev); £spaces£ £/spaces£if (!udev) { £spaces£ £/spaces£printf("Failed to open device\n"); £spaces£ £/spaces£exit(1); £spaces£ £/spaces£} £spaces£ £/spaces£printf("Opened device\n"); £spaces£ £/spaces£/* £spaces£ £/spaces£* Choose the first configuration (1) £spaces£ £/spaces£*/ £spaces£ £/spaces£if (usb_set_configuration(udev,1)< 0) { £spaces£ £/spaces£printf("Failed to set conf: %s\n", £spaces£ £/spaces£usb_strerror()); £spaces£ £/spaces£exit(1); £spaces£ £/spaces£} £spaces£ £/spaces£printf("Set conf\n"); £spaces£ £/spaces£/* £spaces£ £/spaces£* Choose the first interface (0) £spaces£ £/spaces£*/ £spaces£ £/spaces£retval = usb_claim_interface(udev,1); £spaces£ £/spaces£if (retval == -EBUSY) { £spaces£ £/spaces£printf("Interface busy\n"); £spaces£ £/spaces£exit(1); £spaces£ £/spaces£} £spaces£ £/spaces£printf("Claimed device\n"); £spaces£ £/spaces£write_data(udev); £spaces£ £/spaces£usb_release_interface(udev,0); £spaces£ £/spaces£printf("released device\n"); £spaces£ £/spaces£usb_close(udev); £spaces£ £/spaces£printf("closed device\n"); £spaces£ £/spaces£exit(0); £spaces£ £/spaces£} else { £spaces£ £/spaces£printf("Found another device\n"); £spaces£ £/spaces£continue; £spaces£ £/spaces£} £spaces£ £/spaces£} £spaces£ £/spaces£} £spaces£ £/spaces£exit(1); } void write_data(usb_dev_handle* udev) { £spaces£ £/spaces£printf("writing data...\n"); £spaces£ £/spaces£char buf[SIZE]; £spaces£ £/spaces£int bytes = 0; £spaces£ £/spaces£int i = 0; £spaces£ £/spaces£while (1) { £spaces£ £/spaces£} £spaces£ £/spaces£fclose(fh); }