Comment communiquer avec mon p�riph�rique USB ?
La mani�re de communiquer d�pend du type de tranfert (Bulk, Isochrone, Interrupt, Control).
Le type de transfert plus simple � g�rer est certainement le transfert Bulk.
Il suffit de remplir la structure de donn�es suivante :
struct usbdevfs_bulktransfer {
unsigned int ep;
unsigned int len;
unsigned int timeout; /* in milliseconds */
void *data;
};
et d'appeler la fonction C suivante : ioctl(fd, USBDEVFS_BULK, pointeur sur la structure usbdevfs_bulktransfer);
Exemple de manipulation de ces notions - lecture de donn�es Bulk :
int fd;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
fd = open("/proc/bus/usb/001/002", O_RDWR);
if(fd != -1) {
struct usb_bulktransfer bulk;
int ret;
bulk.ep = USB_DIR_IN | 1;
bulk.len = 1024;
bulk.timeout = 1000;
bulk.data = malloc(1024);
ret = ioctl(fd, USBDEVFS_BULK, &bulk);
if (ret < 0)
printf("Error in bulk transfer");
else {
/* les données sont disponibles dans bulk.data */
}
close(fd);
} |
Exemple de manipulation de ces notions - �criture de donn�es bulk :
int fd;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
fd = open("/proc/bus/usb/001/002", O_RDWR);
if(fd != -1) {
struct usb_bulktransfer bulk;
int ret;
bulk.ep = 1;
bulk.len = 1024;
bulk.timeout = 1000;
bulk.data = malloc(1024);
ret = ioctl(fd, USBDEVFS_BULK, &bulk);
if (ret < 0)
printf("Error in bulk transfer");
else {
/* les données sont disponibles dans bulk.data */
}
close(fd);
} |
Les transfers de type Interrupt IN sont beaucoup plus difficiles � g�rer. La principale difficult� r�side dans la fait qu'ils ont lieu de mani�re asynchrone. Une fois le transfert initialis�, le programme re�oit des signaux (au sens Unix du terme) qu'il doit intercepter.
Partager