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