Forum Programmation.c++ Création d'un mini driver avec libusb

Posté par  .
Étiquettes : aucune
0
2
avr.
2007
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 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[])
{
struct usb_bus *busses, *bus;
int retval = 0;
usb_init();
usb_find_busses();
usb_find_devices();
busses = usb_get_busses();

/* loop through busses... */
for (bus = busses; bus; bus = bus->next) {
struct usb_device *dev;

/* loop through devices on bus ...*/
for (dev = bus->devices; dev; dev = dev->next) {
usb_dev_handle *udev;
if (dev->descriptor.idVendor == CAM_VENDOR_ID
&& dev->descriptor.idProduct == CAM_PRODUCT_ID) {
printf("Found remote\n");
udev = usb_open(dev);
if (!udev) {
printf("Failed to open device\n");
exit(1);
}
printf("Opened device\n");
/*
* Choose the first configuration (1)
*/
if (usb_set_configuration(udev,1)< 0) {
printf("Failed to set conf: %s\n",
usb_strerror());
exit(1);
}
printf("Set conf\n");
/*
* Choose the first interface (0)
*/
retval = usb_claim_interface(udev,1);
if (retval == -EBUSY) {
printf("Interface busy\n");
exit(1);
}
printf("Claimed device\n");
write_data(udev);
usb_release_interface(udev,0);
printf("released device\n");
usb_close(udev);
printf("closed device\n");
exit(0);
} else {
printf("Found another device\n");
continue;
}
}
}
exit(1);
}

void write_data(usb_dev_handle* udev)
{
printf("writing data...\n");
char buf[SIZE];
int bytes = 0;
int i = 0;
while (1) {
}
fclose(fh);
}
  • # pticours

    Posté par  . Évalué à 2.

    Bon, sur l'usb il existe plusieurs facon de communiquer, ces packet sont de type
    -interrupt (non-géré par libusb)
    -bulk
    -isochrone
    -control

    Les packet control sont normaliser pour certain services (pour l'enumeration et deux ou trois operations diverse) c'est bien rare de les utiliser en foncionnelle.

    Les packet bulk sont des packet destiné a un endpoint (in ou out), le out est une emission du pc vers le device, le in une lecture du device vers le pc.
    donc
    int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
    *dev :le handle du device que tu recupere à l'ouverture
    ep : le numeral du endpoint sur lequel ce fait l'operation
    *bytes : pointeur sur les données a recevoir ou le tableau de reception
    syze : la taille a recevoir ou a emettre
    timeout : un temps en milli second sans doute d'attente de la fin d'operation.

    Les packet interrupt sont cycliquement emis du device vers le PC (ceci est une approximation du mechanisme !)

    Les packet isochrone sont destiné a la transmission rapide de donné sans garanti de reception (typiquement je pense que les images de la CAM utiliseront de l'isochrone)

    je te conseille la lecture de:
    http://www.usb.org/developers/docs/usb_20_031507.zip
    qui est tres complet sur l'usb.
    • [^] # Re: pticours

      Posté par  . Évalué à 1.

      Merci de ta réponse,
      En fait pour les images j'ai déja un driver, je pense qu'on peut coupler les deux sans poser de problèmes.
      Par contre les trames que j'ai récupéré sous windows avec usb monitor sont en hexadécimal, sais tu si je dois les stocké dans mon tableau tel quel.
      Encore Merci
      • [^] # Re: pticours

        Posté par  . Évalué à 2.

        je pense que tu confond contenu et forme. Le tableau suivant
        (1) char Array[] ={0x33,0x36,0x37};
        et
        (2)char Array[]={'3','6','7'};

        sont strictement egaux, dans un cas j'ecris le contenu en hexa et dans l'autre en ascii, mais d'un point de vue binaire le resultat de la compilation est strictement identique
        A ne pas faire :
        char Array[] ={"0x33","0x36","0x37"};

        Donc remplis ton tableau dans la forme que tu veut mais a mon avis c'est la forme (1) qui est le plus simple
        • [^] # Re: pticours

          Posté par  . Évalué à 1.

          En fait je confondais pas mais j'étais pas sur que le système voit la même chose. Mais en fait ça parait normal puisque ça devient de toute façon du binaire.
          Merci pour ton aide

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.