Gérer les demandes d’E/S dans un pilote de contrôleur hôte USB

Meilleures pratiques pour un pilote de contrôleur hôte pour la gestion des demandes d’E/S envoyées par UCX.

UCX effectue le suivi de tous les points de terminaison qui ont été créés par le pilote du contrôleur hôte pour les appareils sur le bus USB. Toutes les demandes de transfert de données envoyées par le pilote hub, ou par un autre pilote qui se trouve plus haut dans la pile de périphériques USB, sont d’abord gérées par UCX. UCX est responsable du transfert de l’objet de demande d’infrastructure vers la file d’attente de point de terminaison appropriée. Le bloc de requête USB (URB) contenu dans la demande peut spécifier un handle de point de terminaison. Si un handle de point de terminaison est spécifié, UCX recherche le point de terminaison correspondant parmi les points de terminaison présents pour l’appareil. Si le handle de point de terminaison spécifié est présent, la demande est transférée à la file d’attente du point de terminaison. Si le handle de point de terminaison spécifié est introuvable, la demande échoue. Si aucun handle n’est spécifié, la demande concerne le point de terminaison par défaut et UCX transfère la demande à la file d’attente de points de terminaison par défaut du pilote du contrôleur hôte pour cet appareil.

Pour garantir la compatibilité avec les pilotes USB existants, le contrôleur hôte doit respecter les exigences suivantes lors de l’exécution de la demande URB :

  • WdfRequestComplete doit être appelé au DISPATCH_LEVEL.
  • Si l’URB a été remis à sa file d’attente d’infrastructure et que le pilote a commencé à le traiter de manière synchrone sur le thread ou le DPC du pilote appelant, la demande ne doit pas non plus être effectuée de manière synchrone. La demande doit être effectuée sur un DPC distinct, qui peut être planifié avec un appel à WdfDpcEnqueue.
  • Comme pour l’exigence précédente, lors de la réception d’EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE ou de EVT_WDF_REQUEST_CANCEL, le pilote du contrôleur hôte doit effectuer la requête URB sur un DPC distinct du thread ou du DPC appelant. Par défaut, WDF effectue les demandes annulées sur la file d’attente de manière synchrone. Ce comportement peut entraîner des problèmes pour les requêtes URB. Pour cette raison, le pilote doit fournir un rappel EvtIoCanceledOnQueue pour ses files d’attente URB.

L’objet de demande d’infrastructure pour un IOCTL_INTERNAL_USB_SUBMIT_URB contient un URB situé dans Parameters.Others.Arg1 de la requête. Une fois la demande terminée, le status URB doit être défini sur USBD_STATUS_SUCCESS ou sur un status d’échec qui indique la nature de l’échec. Les valeurs de status d’échec sont définies dans le fichier d’en-tête usb.h.