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 TheBreton . Évalué à 2.
-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 ptitcon51 . Évalué à 1.
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 TheBreton . Évalué à 2.
(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 ptitcon51 . Évalué à 1.
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.