Partager via


Configurer des points de terminaison USB dans un pilote de contrôleur hôte USB

UCX gère la création d’objets de point de terminaison et avertit le contrôleur hôte de programmer ou de déprogrammer les points de terminaison dans le contrôleur hôte USB.

Bien qu’un point de terminaison soit programmé, il est également géré par UCX. L’état d’un point de terminaison change à mesure que les appareils sont connectés et déconnectés du bus, qu’ils subissent des événements d’alimentation tels que la suspension et la réinitialisation, et qu’ils subissent la création d’un nouveau point de terminaison, comme d’autres modifications de paramètres.

Configuration du point de terminaison

UCX appelle des fonctions de rappel implémentées par le pilote du contrôleur hôte pour informer le pilote quand des points de terminaison doivent être programmés dans le contrôleur hôte USB ou libérés. Lorsque EVT_UCX_USBDEVICE_ENABLE est appelé, le pilote prépare le contrôleur à effectuer des transferts vers le point de terminaison par défaut de l’appareil. La préparation du contrôleur inclut la programmation du point de terminaison par défaut. Lorsque EVT_UCX_USBDEVICE_DISABLE est appelé, le pilote déprogrammente le point de terminaison par défaut et libère d’autres ressources de contrôleur associées à l’appareil. Quand EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE est appelé, le pilote reçoit une liste de points de terminaison autres que les points de terminaison par défaut à programmer dans le contrôleur, et reçoit une autre liste de points de terminaison autres que les points de terminaison par défaut à supprimer du contrôleur. Le pilote du contrôleur hôte programme ensuite les points de terminaison non par défaut spécifiés dans le contrôleur, et supprime également les points de terminaison non par défaut (spécifiés dans l’autre liste) du contrôleur.

Gestion de l’état de la file d’attente

UCX appelle des fonctions de rappel implémentées par le pilote du contrôleur hôte pour modifier l’état de la file d’attente du point de terminaison. Le pilote effectue ensuite l’action correspondante sur la file d’attente de point de terminaison donnée à UCX, et sur toutes les files d’attente de deuxième niveau gérées dans le pilote. Les files d’attente de points de terminaison sont abandonnées ou vidées dans ces scénarios :

  • Le pilote client du périphérique USB envoie une demande de URB_FUNCTION_ABORT_PIPE.
  • Pendant la suspension.
  • Lorsque le hub auquel un appareil est attaché, détecte une déconnexion d’appareil.
  • Lors d’une demande de paramètre d’interface de sélection.

Pour informer le pilote du contrôleur hôte d’un abandon ou d’un vidage de la file d’attente, UCX appelle EVT_UCX_ENDPOINT_ABORT ou EVT_UCX_ENDPOINT_PURGE. Si, ultérieurement, la file d’attente de point de terminaison est nécessaire par UCX, UCX appelle le rappel EVT_UCX_ENDPOINT_START pour avertir le pilote de démarrer la file d’attente.

Annulation du transfert

Pour tous les contrôleurs pour lesquels le pilote du contrôleur hôte déclare GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL, le pilote doit appeler UcxEndpointNeedToCancelTransfers et implémenter des EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS pour annuler les transferts USB asynchrones (en bloc ou contrôle) vers un périphérique USB plein ou bas débit situé derrière un hub Transaction Translator (TT). Dans tous les autres cas, le pilote peut éventuellement appeler UcxEndpointNeedToCancelTransfers pour obtenir une notification EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS qui indique que l’annulation des transferts est autorisée sur ce point de terminaison et que le pilote peut procéder à l’annulation des transferts. Le pilote peut également annuler les transferts directement sans appeler UcxEndpointNeedToCancelTransfers.

Si le pilote du contrôleur hôte échoue toujours à la demande pour ce GUID, il peut ignorer entièrement ces deux appels de fonction.

Si le pilote n’appelle jamais UcxEndpointNeedToCancelTransfers, le rappel EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS du pilote n’est pas appelé et peut être NULL lors de l’inscription du rappel.

Si le pilote a l’intention d’utiliser UcxEndpointNeedToCancelTransfers, il doit appeler la méthode lorsqu’un transfert a été programmé dans le contrôleur, puis annulé, puis attendre EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS avant de le terminer.