Pilotes côté hôte USB dans Windows
Cet article fournit une vue d’ensemble de l’architecture de pile de pilotes Usb (Universal Serial Bus).
La figure suivante montre le diagramme de blocs architecturaux de la pile de pilotes USB pour Windows. Le diagramme montre des piles de pilotes USB distinctes pour USB 2.0 et USB 3.0. Windows charge la pile de pilotes USB 3.0 lorsqu’un appareil est attaché à un contrôleur xHCI.
Windows charge la pile de pilotes USB 2.0 pour les périphériques attachés à des contrôleurs eHCI, oHCI ou uHCI. La pile de pilotes USB 2.0 est fournie dans Windows XP avec Service Pack 1 (SP1) et versions ultérieures du système d’exploitation Windows.
Pile de pilotes USB 3.0
Microsoft a créé les pilotes USB 3.0 à l’aide des interfaces KMDF (Kernel Mode Driver Framework). Le modèle de pilote KMDF réduit la complexité et améliore la stabilité.
Pilote du contrôleur hôte USB 3.0 (Usbxhci.sys)
Le pilote xHCI est le pilote du contrôleur hôte USB 3.0. Les responsabilités du pilote xHCI incluent l’initialisation des registres MMIO et l’hôte des structures de données basées sur la mémoire pour le matériel du contrôleur xHCI, le mappage des demandes de transfert des pilotes de couche supérieure aux blocs de requête de transfert et l’envoi des demandes au matériel. Après avoir effectué un transfert, le pilote gère les événements de transfert de saisie semi-automatique à partir du matériel et propage les événements dans la pile des pilotes. Il contrôle également les emplacements de périphérique de contrôleur xHCI et les contextes de point de terminaison.
Windows charge le pilote xHCI en tant qu’objet de périphérique de fonction (FDO) dans la pile d’appareils du contrôleur hôte.
Extension du contrôleur hôte USB (Ucx01000.sys)
Le pilote d’extension du contrôleur hôte USB (une extension à KMDF) est la nouvelle extension du pilote de contrôleur hôte spécifique à la classe sous-jacente, telle que le pilote xHCI. Le nouveau pilote est extensible et est conçu pour prendre en charge d’autres types de pilotes de contrôleur hôte qui devraient être développés à l’avenir. L’extension du contrôleur hôte USB sert d’interface abstraite commune au pilote hub, fournit un mécanisme générique pour la mise en file d’attente des demandes au pilote du contrôleur hôte et remplace certaines fonctions sélectionnées. Toutes les demandes d’E/S initiées par les pilotes supérieurs atteignent le pilote d’extension du contrôleur hôte avant le pilote xHCI. Lors de la réception d’une demande d’E/S, l’extension du contrôleur hôte valide la demande, puis transfère la demande à la file d’attente KMDF appropriée associée au point de terminaison cible. Le pilote xHCI, lorsqu’il est prêt pour le traitement, récupère la requête à partir de la file d’attente. Les responsabilités du pilote d’extension du contrôleur hôte USB sont les suivantes :
- Fournit des objets spécifiques à USB au pilote xHCI.
- Fournit des routines de rappel d’événements KMDF au pilote xHCI.
- Gère et contrôle les opérations du hub racine associé au contrôleur hôte.
- Implémente des fonctionnalités configurables par le pilote client, comme les MDL chaînés, les flux, et ainsi de suite.
Pilote du hub USB (Usbhub3.sys)
Le nouveau pilote hub, dans la pile de pilotes USB pour les appareils 3.0, utilise le modèle de pilote KMDF. Le pilote hub effectue principalement ces tâches :
- Gère les hubs USB et leurs ports.
- Énumère les appareils et d’autres hubs attachés à leurs ports en aval.
- Crée des objets d’appareil physique pour les appareils et hubs énumérés.
Windows charge le pilote hub en tant que FDO dans la pile d’appareils hub. L’énumération des appareils et la gestion du hub dans le nouveau pilote sont implémentées via un ensemble de machines d’état. Le pilote hub s’appuie sur KMDF pour la gestion de l’alimentation et les fonctions PnP. Outre la gestion du hub, le pilote hub effectue également des vérifications préliminaires et le traitement de certaines demandes envoyées par la couche de pilote client USB. Par exemple, le pilote hub analyse une demande de configuration de sélection pour déterminer quels points de terminaison seront configurés par la requête. Après avoir analysé les informations, le pilote hub envoie la demande à l’extension du contrôleur hôte USB ou à un traitement ultérieur.
Pile de pilotes USB 2.0
Windows charge la pile de pilotes USB 2.0 pour les périphériques attachés à des contrôleurs eHCI, oHCI ou uHCI. Les pilotes de la pile de pilotes USB 2.0 sont fournis dans Windows XP avec SP1 et versions ultérieures du système d’exploitation Windows. La pile de pilotes USB 2.0 est conçue pour faciliter les périphériques USB haute vitesse tels que définis dans la spécification USB 2.0.
En bas de la pile des pilotes USB, il s’agit du pilote du contrôleur hôte. Il se compose du pilote de port, Usbport.sys et d’un ou plusieurs de trois pilotes miniport qui s’exécutent simultanément. Lorsque le système détecte le matériel du contrôleur hôte, il charge l’un de ces pilotes miniport. Le pilote miniport, une fois chargé, charge le pilote de port, Usbport.sys. Le pilote de port gère ces aspects des tâches du pilote du contrôleur hôte qui sont indépendantes du protocole spécifique.
Le pilote miniport Usbuhci.sys (interface du contrôleur d’hôte universel) remplace le pilote Uhcd.sys miniclasse fourni par Windows 2000. Le pilote miniport Usbohci.sys (interface du contrôleur hôte ouvert) remplace Openhci.sys. Le pilote miniport Usbehci.sys prend en charge les périphériques USB haute vitesse et a été introduit dans Windows XP avec SP1 et versions ultérieures et windows Server 2003 et versions ultérieures.
Dans toutes les versions de Windows qui prennent en charge USB 2.0, le système d’exploitation est capable de gérer simultanément les contrôleurs hôtes USB 1.1 et USB 2.0. Chaque fois que le système d’exploitation détecte que les deux types de contrôleur sont présents, il crée deux nœuds d’appareil distincts, un pour chaque contrôleur hôte. Windows charge par la suite le pilote miniport Usbehci.sys pour le matériel du contrôleur hôte compatible USB 2.0 et Usbohci.sys ou Openhci.sys pour le matériel compatible USB 1.1, en fonction de la configuration du système.
Au-dessus du pilote de port est le pilote de bus USB, Usbhub.sys, également appelé pilote hub. Il s’agit du pilote de périphérique pour chaque hub sur le système.
Pilote parent générique de classe USB (Usbccgp.sys)
Le pilote parent générique de classe USB est le pilote parent fourni par Microsoft pour les périphériques composites. Le pilote hub énumère et charge le pilote composite parent si deviceClass est 0 ou 0xef et numInterfaces est supérieur à 1 dans le descripteur de l’appareil. Le pilote hub génère l’ID compatible pour le pilote composite parent en tant que « USB\COMPOSITE ». Usbccgp.sys utilise des routines de modèle de pilote Windows (WDM).
Le pilote composite parent énumère toutes les fonctions d’un appareil composite et crée un PDO pour chacun d’eux. Cela entraîne le chargement de la classe ou du pilote client approprié pour chaque fonction de l’appareil. Chaque pilote de fonction (PDO enfant) envoie des demandes au pilote parent, qui les envoie au pilote du hub USB.
Usbccgp.sys est inclus avec Windows XP avec SP1 et versions ultérieures du système d’exploitation Windows. Dans Windows 8, le pilote a été mis à jour pour implémenter des fonctionnalités de suspension de fonction et de mise en éveil à distance, comme défini dans la spécification USB 3.0.
Pour plus d’informations, consultez Pilote parent générique USB (Usbccgp.sys).
WinUSB (Winusb.sys)
Windows USB (WinUSB) est un pilote générique fourni par Microsoft pour les périphériques USB. L’architecture WinUSB se compose d’un pilote en mode noyau (Winusb.sys) et d’une bibliothèque de liens dynamiques en mode utilisateur (Winusb.dll). Pour les appareils qui ne nécessitent pas de pilote de fonction personnalisé, Winusb.sys peut être installé dans la pile en mode noyau de l'appareil en tant que pilote de fonction. Les processus en mode utilisateur peuvent ensuite communiquer avec Winusb.sys à l’aide d’un ensemble de demandes de contrôle d’E/S d’appareil ou en appelant des fonctions WinUsb_Xxx . Pour plus d’informations, consultez Présentation de WinUSB pour les développeurs.
Dans Windows 8, le fichier d’informations fournies par Microsoft (INF) pour WinUSB, Winusb.inf, contient USB\MS_COMP_WINUSB en tant que chaîne d’identificateur d’appareil. Cela permet Winusb.sys de se charger automatiquement en tant que pilote de fonction pour ces appareils qui ont un ID compatible WinUSB correspondant dans le descripteur du système d’exploitation MS. Ces appareils sont appelés appareils WinUSB. Les fabricants de matériel ne sont pas tenus de distribuer un fichier INF pour leur appareil WinUSB, ce qui simplifie le processus d’installation du pilote pour l’utilisateur final. Pour plus d’informations, consultez Appareil WinUSB.
Pilote client USB
Chaque périphérique USB, composite ou non composite, est géré par un pilote client. Un pilote client USB est une classe ou un pilote de périphérique qui est un client de la pile de pilotes USB. Ces pilotes incluent des pilotes spécifiques aux classes et aux appareils de Microsoft ou d’un fournisseur tiers. Pour afficher la liste des pilotes de classe fournis par Microsoft, consultez Pilotes pour les classes de périphériques USB prises en charge. Un pilote client crée des requêtes pour communiquer avec l’appareil en appelant des interfaces publiques exposées par la pile de pilotes USB.
Un pilote client pour un périphérique composite n’est pas différent d’un pilote client pour un périphérique non composite, à l’exception de son emplacement dans la pile des pilotes.
Un pilote client pour un périphérique non composite est superposé directement au-dessus du pilote hub.
Pour un périphérique USB composite qui expose plusieurs fonctions et n’a pas de pilote de classe parent, Windows charge le pilote parent générique USB (Usbccgp.sys) entre le pilote hub et la couche de pilote client. Le pilote parent crée une fonction PDO distincte pour chaque fonction d’un périphérique composite. Les pilotes clients (FDO for functions) sont chargés au-dessus du pilote parent générique. Les fournisseurs peuvent choisir de fournir un pilote client distinct pour chaque fonction.
Un pilote client USB peut s’exécuter en mode utilisateur ou en mode noyau, en fonction des exigences du pilote. Les pilotes clients USB peuvent être écrits à l’aide de routines KMDF, UMDF ou WDM.
Bibliothèques d’assistance pour les pilotes clients
Microsoft fournit les bibliothèques d’assistance suivantes pour aider les pilotes et les applications en mode noyau à communiquer avec la pile des pilotes USB :
Usbd.sys
Microsoft fournit la bibliothèque Usbd.sys qui exporte des routines pour les pilotes clients USB. Les routines d’assistance simplifient les tâches opérationnelles d’un pilote client. Par exemple, à l’aide des routines d’assistance, un pilote client USB peut générer des blocs de requête USB (URB) pour certaines opérations spécifiques, telles que la sélection d’une configuration et l’envoi de ces URB à la pile de pilotes USB.
Usbdex.lib
Cette bibliothèque d’assistance est nouvelle pour Windows 8. La bibliothèque exporte principalement les routines pour l’allocation et la création d’URB. Ces routines remplacent certaines des routines héritées exportées par Usbd.sys. Les nouvelles routines nécessitent que le pilote client s’inscrive auprès de la pile de pilotes USB, qui gère le handle pour l’inscription. Ce handle est utilisé pour les appels à d’autres routines Usbdex.lib. Certaines URB allouées par les nouvelles routines ont un contexte URB que le pilote USB utilise pour un meilleur suivi et traitement. Pour plus d’informations, consultez Allocation et génération d’URB.
Winusb.dll
Winusb.dll est une DLL en mode utilisateur qui expose les fonctions WinUSB pour communiquer avec Winusb.sys, qui est chargée en tant que pilote de fonction d’un appareil en mode noyau. Les applications utilisent ces fonctions pour configurer l’appareil, récupérer des informations sur l’appareil et effectuer des opérations d’E/S. Pour plus d’informations sur l’utilisation de ces fonctions, consultez Comment accéder à un périphérique USB à l’aide de fonctions WinUSB.