|
Cette page a été réalisée, en avril 2003, par 3 élèves de 2ème année de
SUPÉLEC Campus de Rennes dans le cadre de leur projet :
|
Remarque préliminaire :
La spécification HID (Human Interface Device) est une couche d'abstraction
plus élevée que le protocole USB. Il est recommandé
de bien comprendre le fonctionnement du bus
USB avant de se lancer dans l'HID !!
Le bus USB définit une architecture de communication qui permet à un ordinateur de se connecter à des périphériques simplement en utilisant 4 fils. Précisément, l'USB établit une communication série sur 2 fils à un débit de 1.5 ou 12 Mbits/s (USB 1.1). L'USB peut également configurer les périphériques au démarrage ou à leur connexion. Ces périphériques sont divisés en plusieurs classes. Chaque classe définit un comportement commun et des protocoles pour les périphériques qui utilisent les mêmes fonctionnalités. Quelques exemples de classes de périphériques USB sont indiqués ci-dessous :
Classe |
Exemple |
Display |
Ecran |
Communication |
Modem |
Audio |
Hauts-parleurs |
Mass storage |
Disques durs |
Human Interface |
Souris, claviers, … |
Cette page a pour but de décrire la classe HID et fonctionnement
dans l'architecture USB.
La classe HID consiste à la base en un ensemble
de périphériques utilisés par les humains pour contrôler
des systèmes informatiques. Des exemples typiques de périphériques
de cette classe sont :
- les claviers et les dispositifs de pointage ( souris, trackballs, joysticks,
…),
- les boutons,
- les contrôles que l'on peut trouver sur des périphériques
tels que les téléphones, les dispositifs de simulation comme
les volants, les pédales, …
Dans ce document, nous essaierons d'apporter les informations nécessaires
à la réalisation de périphériques USB, compatibles
HID.
Nous avons vus dans la partie consacrée à l'USB, et notamment sur la page de Bernard Acquier, la liste des descripteurs que le périphérique expédie à l'hôte pour s'identifier. Notamment, au niveau des descripteurs d'interface, il existe un champ nommé « bInterfaceClasse » qui spécifie le type de classe à laquelle appartient le périphérique. C'est à ce niveau que l'on peut définir un périphérique comme appartenant à la classe HID.
Cependant, il faut également rajouter un paragraphe
de descripteurs de périphérique HID, dans lequel toutes
les informations sur cette classe seront exposées.
Notamment, ce paragraphe identifie quels autres descripteurs de classe
HID sont présents, et précise leur taille. Parmi ces descripteurs,
il existe principalement un Report Descriptor et un «
Physical Descriptor.
Un Report Descriptor décrit le format des données
contenues dans les paquets échangés.
Par exemple, il définit des champs qui décrivent une position
ou l'état d'un bouton. Ces champs sont utilisés
pour permettre à un logiciel de faire la correspondance entre l'action
sur le périphérique et le déclenchement d'une
action logicielle.
Voici pour information, le contenu du descripteur de
périphérique HID
| Partie | Offset/Taille | Description |
| bLength | 0/1 | Taille totale du descripteur HID |
| bDescriptorType | 1/1 | Nom spécifiant le type du descripteur HID |
| bcdHID | 2/2 | Version de la spécification HID utilisée |
| bCountryCode | 4/1 | Numéro du pays |
| bNumDescriptors | 5/1 | Nombre de descripteurs de classe |
| bDescriptorType | 6/1 | Nom du type du descripteur de classe |
| wDescriptorLength | 7/2 | Taille totale du Report Descriptor |
| [bDescriptorType] | 9/1 | Nom du type du descripteur de classe optionnel |
[wDescriptorLength] |
10/2 | Taille totale du descripteur optionnel |
La classe HID n'utilise pas la notion de sous-classe, originellement
créée pour différencier les protocoles différents
des périphériques HID. En effet, à la vue du grande
nombre de ces périphérique, il est vite devenu impossible
de tous en répertorier les protocoles de communication.
Ainsi, l'idée est venue d'un descripteur décrivant
la façon dont les données transitent entre l'hôte
et le périphérique HID. Ainsi, chaque périphérique
peut définir son propre protocole de transfert. C'est au
driver générique HID du système d'exploitation
de formater les données du paquet reçu selon le Report Descriptor.
Un Report Descriptor est composé de plusieurs blocs d'informations diverses, appelées Items. On peut donc voir le Report Descriptor comme un agglomérat d'Items. Cette suite d'Items est envoyée dès la connection du périphérique au bus USB, avec les autres descripteurs.
Au niveau du driver générique HID, une
analyse linéaire est effectuée sur ce Report Descriptor
pour permettre à l'application de mettre en correspondance les
données reçues avec l'action réalisée par
l'utilisateur sur le périphérique.
Du point de vue de l'analyseur, un périphérique de
classe HID ressemble à l'organigramme suivant (les termes
sont en anglais, et seront explicités par la suite).
Même si ce système de Report ne paraît pas évident (et il ne l'est pas !), c'est là que réside toute la force de la classe HID. En effet, il est possible pour une application de dialoguer avec n'importe quel périphérique HID, sans nécessairement en connaître la nature, juste en analysant son Report. Par exemple, pour notre projet utilisant un microcontrôleur PIC de Microchip, nous avons créé notre propre format de données avec l'ordinateur.
C'est avec l'exemple d'une souris que nous allons illustrer le concept de Report .
Un Report Descriptor se présente sous la forme d'une liste de paramètres regroupés, comme indiqué sur le shéma précédent, en Reports et en Collections. Un Report représente un transfert sur le Bus USB. Il existe en fait 3 types de Reports :
- Ceux qui permettent de recevoir des données du périphérique (de type Input),
- Ceux qui permettent d'envoyer des données au périphérique (de type Output),
- Ceux qui permettent d'envoyer et de recevoir des informations de configuration entre l'hôte et le périphérique (de type Feature).
Les Collections permettent de regrouper plusieurs éléments du Report Descriptor ensemble.
Les Usages permettent de mettre en relation un champ ou un ensemble de champs du Report Descriptor avec une ou plusieurs interactions physiques sur le périphérique.
Il existe des Usages et des Collections déjà définies dans la spécification HID. Pour s'en convaincre, il s'agit de regarder dans la liste des identificateurs USB!
Nous allons commencer par la souris, plus simple et surtout plus répandue
!
Voici donc un Report de souris :
Usage Page (Generic Desktop)
Usage (Mouse)
Collection (Application)
.........Usage (Pointer)
.........Collection (Physical)
.................Usage Page (Buttons)
.................Usage Minimum (01)
.................Usage Maximum (03)
.................Logical Minimum (0)
.................Logical Maximum (1)
.................Report Count (3)
.................Report Size (1)
.................Input (Data, Variable, Absolute)
.................Report Count (1)
.................Report Size (5)
.................Input (Constant)
.................Usage Page (Generic Desktop)
.................Usage (X)
.................Usage (Y)
.................Logical Minimum (-127)
.................Logical Maximum (127)
.................Report Count (2)
.................Report Size (8)
.................Input (Data, Variable, Relative)
.........End Collection
End Collection
Ainsi, comme nous pouvons le voir, une collection est définie dans un usage de type "Pointer". Cette collection possède 1 Report Input composé de 3 champs, définissant le format de données comme suit :
Etat du bouton gauche: 1 bit
Etat du bouton central : 1 bit
Etat du bouton droit : 1 bit
5 bits de remplissage (Zero Padding)
Valeur relative du déplacement sur X : 8 bits
Valeur relative du déplacement sur Y: 8 bits
Les 5 bits de remplissage sont simplement placés ici pour terminer l'octet commencé par l'état des 3 boutons.
En ce qui concerne le Report Descriptor que nous avons écrit pour le PIC 16C765, il est disponible à cette page. Il met en oeuvre des reports de type Input et Feature. Il est plus complexe, mais aussi beaucoup plus instructif.
Il est à noter que dans le cas de plusieurs Reports de même type, déclarés dans des Usages différents, il est indispensable de rajouter une identifaction (Report ID en anglais) pour permettre à l'analyseur du driver HID générique de s'y retrouver. Pour plus de détails sur ce point assez complexe, il convient de se reporter à la spécification HID.
La spécification HID : l'incontournable