Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Interroger un périphérique USB/HID

2 réponses
Avatar
Benoit Izac
Bonjour,

J'ai un périphérique, un onduleur, raccordé via un port USB à ma
machine. Celui-ci est reconnu comme HID :
| kernel: uhid0: MGE UPS SYSTEMS ellipse, rev 1.10/0.01, addr 2, iclass
| 3/0

Je cherche à interroger celui-ci via un petit programme ; je sais qu'il
y a nut mais il ne fonctionne pas en USB sur les BSD, les sources de la
libusb m'ont convaincu :
[bsd.c]
| * Note: I don't have a clue what I'm doing. I just looked at the
| * man pages and source to try and find things that did the same as
| * the Linux version. -- Richard
| * [...] Note: I, like Richard, have no clue what I'm doing.
| [...]
| if (strncmp(di.udi_devnames[0], "ugen", 4) != 0)
| /* best not to play with things we don't understand */
| continue;

Je ne veux pas utiliser non plus le port série parce que d'une part je
l'utilise déjà, d'autre part ce serait trop facile.

-- Ce que j'arrive à faire :
- pour chaque device /dev/usb?, l'interroger via
ioctl(fd, USB_DEVICEINFO, &dev_info);
j'obtiens ainsi une structure usb_device_info qui correspond bien à mon
UPS. Par contre étrangement, class, subclass et protocol sont à 0.
- sur /dev/uhid0 :
ioctl(fd, USB_GET_REPORT_ID, &id) me renvoie toujours id == 0;
ioctl(fd, USB_GET_REPORT_DESC, &rdesc) fonctionne parfaitement.
ioctl(fd, USB_GET_REPORT, &report) échoue avec Input/output error
ioctl(fd, USB_SET_REPORT, &report) échoue avec Input/output error
ioctl(fd, USB_SET_IMMED, &i) échoue avec Operation not supported
read() me donne à chaque fois 9 bytes ; les résultats semblent corrects
(pourcentage, temps restant et états).


-- Ce que je souhaite faire :
- pouvoir recevoir un rapport complet ;
- pouvoir choisir un rapport ;
- comprendre comment ça marche.

L'OS est FreeBSD-5.4 mais je pense qu'il n'y a pas grande différence
entre les 3 BSD à la vu de leur pages de manuel respectives.

Je n'ai pas joué avec ioctl USB_REQUEST car j'ai été un peu effrayé par
la page de manuel usb(4). Donc si vous avez une idée de comment marche
la bête ou vous connaissez un bon tutoriel (pour BSD cela va de soi)...

Je précise que j'ai lu usb(4), uhid(4), « Device Class Definition for
Human Interface Devices (HID) », « Universal Serial Bus Usage Tables for
HID Power Devices » et je continue ma lecture de « Universal Serial Bus
Specification ».

Merci.
--
Benoit Izac

2 réponses

Avatar
Thierry Thomas
Lundi 18 juillet 2005 à 22:23 GMT, Benoit Izac a écrit :
Bonjour,


onjour,

J'ai un périphérique, un onduleur, raccordé via un port USB à ma
machine. Celui-ci est reconnu comme HID :
| kernel: uhid0: MGE UPS SYSTEMS ellipse, rev 1.10/0.01, addr 2, iclass
| 3/0

Je cherche à interroger celui-ci via un petit programme ; je sais qu'il
y a nut mais il ne fonctionne pas en USB sur les BSD, les sources de la
libusb m'ont convaincu :


Il y a justement un portage en cours sur FreeBSD, en collaboration avec
le mainteneur de nut, qui bosse justement chez MGE.

Déjà, il ne faut plus qu'il soit pris par HID, soit en faisant un noyau
sans hid, ou mieux en le mettant en liste noire, ce qui peut être fait
par le patch inclus dans le PR usb/80383
<http://www.freebsd.org/cgi/query-pr.cgi?pr€383>.

Ensuite, il faut compiler le nouveau pilote newhidups. Je l'avais fait à
la main, mais le port de nut vient d'être mis à jour pour le prendre en
compte dans un sous-port (pas encore testé).
--
Th. Thomas.

Avatar
Benoit Izac
Bonjour,

le 19/07/2005 à 12:11, Thierry Thomas a écrit
dans le message :

J'ai un périphérique, un onduleur, raccordé via un port USB à ma
machine. Celui-ci est reconnu comme HID :
| kernel: uhid0: MGE UPS SYSTEMS ellipse, rev 1.10/0.01, addr 2,
| iclass 3/0

Je cherche à interroger celui-ci via un petit programme ; je sais
qu'il y a nut mais il ne fonctionne pas en USB sur les BSD, les
sources de la libusb m'ont convaincu :


Il y a justement un portage en cours sur FreeBSD, en collaboration
avec le mainteneur de nut, qui bosse justement chez MGE.

Déjà, il ne faut plus qu'il soit pris par HID, soit en faisant un
noyau sans hid, ou mieux en le mettant en liste noire, ce qui peut
être fait par le patch inclus dans le PR usb/80383
<http://www.freebsd.org/cgi/query-pr.cgi?pr€383>.

Ensuite, il faut compiler le nouveau pilote newhidups. Je l'avais fait
à la main, mais le port de nut vient d'être mis à jour pour le prendre
en compte dans un sous-port (pas encore testé).


J'ai déjà essayé d'enlever hid du kernel et l'onduleur est reconnu par
ugen :
| kernel: ugen0: MGE UPS SYSTEMS ellipse, rev 1.10/0.01, addr 2

Mais même de cette manière, nut ne fonctionne pas (il ne vois pas
l'onduleur). J'utilise bien newhidups de nut-usb-2.0.2.

Le problème est que je n'arrive pas à faire la requête
« Get_Report ». Comme je n'ai pas de Linux ou Windows sous la main, je
ne sais pas si cette requête fonctionne avec un autre OS, n'est pas
supporté par l'onduleur ou bien je ne la fais pas correctement.

En fait je suis un peu perdu entre les « Control (Endpoint 0) »,
« Interrupt In » et « Interrupt Out ». Lorsque je fait un read, je ne
sais pas d'où ça vient ; je pense que c'est « Interrupt In » mais ce que
je ne m'explique pas c'est comment utiliser le « Control pipe ».

À force de relire les pages de manuel, je sens bien que la solution est
dans ioctl USB_REQUEST mais c'est chaud :
| This command can be used to execute arbitrary requests on the
| control pipe. This is DANGEROUS and should be used with great
| care since it can destroy the bus integrity.

--
Benoit Izac