La spécification HID

1) Introduction
2) Compléments sur les descripteurs de périphériques
3) Report Descriptor
Les liens utiles

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 :
  • Fabien CHEVALIER
  • Sylvain RICHERIOUX
  • Nicolas SINÈGRE
  •  

    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 !!

     

    1) Introduction

    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.


    2) Compléments sur les descripteurs de périphériques

    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

     

    3) Report Descriptor


    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.

     

    Les liens utiles

    La spécification HID : l'incontournable

     

    Retour vers la page de la documentation USB-HID Retour vers les autres docs