Comment fonctionne la reconnaissance des périphériques USB?

16

Je suis curieux de savoir comment fonctionne la reconnaissance des périphériques USB sous Windows. J'imagine que c'est quelque chose comme ça:

  • Lorsque vous branchez un appareil, il indique à Windows "voici mon ID d'appareil pour vous dire ce que je suis"
  • Windows cherche à voir si des pilotes ont été installés qui correspondent à cet ID de périphérique. Le pilote indique probablement à Windows comment le périphérique doit être appelé - comme "BlackBerry Curve" ou "Canon Printer"
  • Si oui, il associe en quelque sorte ce périphérique à ce pilote
  • Sinon, il recherche un pilote correspondant en ligne (si vous le laissez)

Ai-je raison? Si c'est le cas, cela laisse encore des questions.

  • Lorsque vous installez des pilotes, où vont-ils? S'agit-il de fichiers dans un dossier ou sont-ils ajoutés au registre?
  • Que fait Windows lorsqu'il reconnaît pour la première fois l'appareil, réfléchit et dit finalement "votre nouvel appareil est installé et prêt à l'emploi?"
  • Où Windows recherche-t-il les pilotes manquants? Est-ce dans leur propre base de données? Les fabricants de périphériques soumettent-ils des pilotes à Microsoft pour y être inclus?

Quelqu'un peut-il expliquer comment ce processus fonctionne vraiment? En outre, les autres systèmes d'exploitation font-ils différemment?

Nathan Long
la source

Réponses:

24

Le bus USB est physiquement conçu de sorte que l'acte d'insérer (et de retirer) une prise puisse être reconnu par le contrôleur hôte. Lorsque cet événement "plug" se produit, le contrôleur hôte informe son pilote de périphérique qui scanne le bus et demande à chaque périphérique de s'identifier.

Tous les périphériques USB contiennent une collection d'informations sur le périphérique, appelées descripteurs. Les descripteurs de périphériques sont récupérés sur tous les périphériques avec la même commande. Cela permet à un pilote de périphérique pour le bus USB lui-même de demander efficacement à un périphérique nouvellement connecté ce qu'il est et de s'attendre à obtenir une réponse raisonnable.

De tous les descripteurs, seuls quelques-uns sont directement utilisés pour faire correspondre les pilotes à la plupart des périphériques. Cela est dû au fait que l'USB définit des classes de périphériques, et généralement le pilote système pour chaque classe de périphérique est suffisant pour gérer tous les périphériques qui prétendent appartenir à cette classe.

Tous les claviers prétendent appartenir à la classe HID (Human Interface), tout comme les souris, les tablettes et les contrôleurs de jeu, par exemple. La classe HID a plusieurs sous-classes (claviers, souris, etc.), donc chacune est gérée de la manière attendue.

La plupart des périphériques de type disque prétendent appartenir à la classe de stockage de masse, et le pilote système ne fonctionne que pour ceux-ci également.

Outre la classe et la sous-classe, les descripteurs incluent également un ID de fournisseur (VID), un ID de produit (PID) et une révision. Les identifiants des fournisseurs sont attribués par le comité des normes (principalement par ordre d'émission, mais certaines entreprises ont reçu des demandes spéciales: Intel est 0x8086, par exemple). Les ID de produit sont attribués par chaque fournisseur et la combinaison de VID et PID doit être unique pour chaque produit commercialisé.

Lorsqu'un périphérique est installé pour la première fois, le VID, le PID, la révision, la classe et la sous-classe sont utilisés de manière prévisible pour choisir le pilote de périphérique qui est chargé. Le fait d'avoir des noms spécifiques de fournisseur et de produit permet à un fournisseur de personnaliser un périphérique qui pourrait autrement être géré (presque) correctement par le pilote du système de stock.

Un autre descripteur important est le numéro de série de l'appareil. Si un appareil possède un numéro de série, il peut être reconnu et traité de la même manière lorsqu'il est branché à nouveau, même si un port USB physique différent est utilisé. Ceci est important pour les périphériques de stockage afin qu'ils reçoivent la même lettre de lecteur et pour les périphériques tels que les adaptateurs de port série et les modems afin qu'ils reçoivent la même désignation de port COM.

L'ensemble de ce processus est documenté sur MSDN , mais les détails sont répartis sur une variété d'endroits.

RBerteig
la source
Merci pour l'explication méthodique. Très intéressant!
Nathan Long
3
Les heures que j'ai passées à glaner ces détails dans la documentation et les exemples étaient une tâche inattendue lorsque j'ai écrit mon premier pilote de périphérique pour Windows. Je suis heureux de partager les résultats de cela ...
RBerteig
7

Des questions :

  • Répertoires: les pilotes sont installés dans 2 répertoires. La partie en cours d'exécution est (dans la plupart des cas) installée dans% RootDir% \ system32, la partie d'informations sur le périphérique est installée dans% RootDir% \ inf. Sous le répertoire inf, pour un pilote installé / enregistré, un fichier oem * .inf est créé. (* est un nombre). Sous Vista, le pilote est copié dans le répertoire% RootDir% \ system32 \ driverstore comme référence lors de l'installation de périphériques non encore rencontrés.
  • Registre: un pilote est installé en tant que service en mode noyau. Pour cela, certaines clés de registre sont créées pour le service de pilote. Il y a un autre endroit sous le pilote de bus, où les périphériques correspondants obtiennent une clé d'instance de périphérique individuelle. Dans cette clé, le périphérique a une référence au pilote actuellement utilisé pour ce périphérique.
  • `` Arrivée '' du périphérique: lorsque le pilote de bus trouve un nouveau périphérique sur son bus, il crée un registre de clés sous sa propre clé qui correspond à un identifiant d'instance de périphérique unique, qui peut être utilisé pour identifier de manière unique un périphérique sur le système. Si cette clé existe déjà, le pilote de bus essaie de charger le périphérique référencé par ce nœud. Lorsque ce nœud n'existe pas ou que le pilote ne se charge pas, le système essaie de trouver un pilote compatible pour le périphérique, en analysant les pilotes de périphérique enregistrés sous% RootDir% \ inf. Les pilotes qui se qualifient pour cet appareil sont énumérés et triés. Le meilleur pilote est ensuite sélectionné et chargé pour le périphérique.
  • Recherche de pilotes : les pilotes sont d'abord recherchés dans le répertoire inf. Lorsqu'aucun pilote n'est trouvé, Windows demande à l'utilisateur s'il peut fournir des pilotes ou s'il doit regarder sur le serveur Microsoft. Les fabricants de pilotes peuvent soumettre leurs pilotes pour inclusion sur le serveur de pilotes de périphériques Microsoft.

Lunatik a la première partie de la réponse, comment le soi-disant chauffeur de bus trouve l'appareil.

Christophe
la source
3

Je voudrais recommander un bon livre sur l'USB:

  • USB Complete par Jan Axelson

Je sais que vous ne l'avez pas demandé, mais il est bon d'en savoir un peu plus sur les périphériques USB qui sont censés se connecter.

Johan
la source