Pilote de périphérique d'adaptateur de contrôleur d'hôte extensible

Objectif

Prend en charge la spécification Universal Serial Bus (USB) 3.0 Extensible Host Controller Interface (xHCI) pour les pilotes de périphérique d'adaptateur.

Syntaxe

#include <sys/hcdi.h>
#include <sys/usbdi.h>
#include <sys/usb.h>

Descriptif

Les fichiers spéciaux /dev/usbhcn fournissent des interfaces qui permettent d'accéder aux unités d'adaptateur de contrôleur hôte USB. Ces fichiers gèrent les ressources de l'adaptateur de sorte que plusieurs pilotes de client USB et le système USB (ou le pilote de protocole) puissent accéder simultanément aux périphériques USB sur le même adaptateur de contrôleur hôte USB.

Le système d'exploitation AIX® prend en charge les contrôleurs hôte USB avec diverses architectures d'interface, telles que l'interface OHCI (Open Host Controller Interface) et l'interface EHCI (Enhanced Host Controller Interface). L'interface binaire des adaptateurs USB 3.0 est appelée interface du contrôleur hôte extensible (xHCI). Le système d'exploitation AIX prend actuellement en charge les versions 0.96 et 1.0 de la spécification xHCI . La spécification xHCI définit une nouvelle architecture de contrôleur hôte qui remplace la spécification OHCI ou EHCI existante et s'étend également à de nouvelles spécifications, par exemple USB version 3.0ou ultérieure.

Le pilote de périphérique /usr/lib/drivers/pci/xhcidd gère les adaptateurs xHCI et le pilote de périphérique /usr/lib/methods/cfgxhci est la méthode de configuration AIX correspondante.

L'attribut max_slots Object Data Manager (ODM) du pilote de l'adaptateur spécifie le nombre maximal de périphériques USB pris en charge par un adaptateur xHCI . La valeur par défaut de l'attribut est 8. Vous pouvez modifier cette valeur à une valeur maximale de 32 pour prendre en charge d'autres unités.

Remarque: Si la valeur max_slots est définie sur 8 et si vous connectez plus de 8 périphériques USB à l'adaptateur USB, l'adaptateur ne configure que 8 périphériques. La configuration de l'unité restante échoue.

Sous-routines du point d'entrée du pilote de périphérique de l'adaptateur

Le pilote de périphérique de l'adaptateur USB prend en charge uniquement les points d'entrée open, close, ioctlet config . Les points d'entrée read et write ne sont pas pris en charge.

Sous-routines ouvertes et proches

La sous-routine open associe le numéro d'unité, qui est spécifié en tant que paramètre à l'appel système open , à la structure d'unité de l'adaptateur interne. Si la sous-routine open trouve une structure d'adaptateur, elle vérifie que l'unité d'adaptateur correspondante est configurée et qu'elle n'est pas marquée comme inactive. Si la sous-routine open ne trouve pas de structure d'adaptateur, elle renvoie une erreur. Si la fonction Enhanced Error Handling (EEH) est activée, la sous-routine open empêche l'accès au périphérique lorsqu'un événement EEH est en cours de traitement.

Sous-routine ioctl

Le pilote de périphérique de l'adaptateur xHCI prend en charge la sous-opération ioctl suivante:
Opération Descriptif
HCD_REGISTER_HC Enregistre les vecteurs d'appel entre le système USB (ou le pilote de protocole) et le pilote du contrôleur hôte. Une fois que les vecteurs d'appel sont enregistrés, toutes les autres communications entre le système USB (ou le pilote de protocole) et le pilote du contrôleur hôte sont traitées par ces vecteurs.

Récapitulatif des conditions d'erreur renvoyées par le pilote de périphérique de l'adaptateur xHCI

Les codes d'état d'achèvement TRB (Transfer Request Block) suivants sont renvoyés par xHCI lors de la mise à jour du statut si la condition d'erreur associée est détectée. Les valeurs de statut TRB sont spécifiées dans la spécification xHCI . Ces codes d'achèvement sont à leur tour mappés avec les valeurs Etat USBstatus suivantes:

Statut TRB Valeur Etat USBstatus Descriptif
XHCI_TRB_STATUS_BAB_DET_ERR D_STABD_USAGE_UTILISATEUR Babbling lors de la transaction
XHCI_TRB_BW_ERR ERREUR D'UTILISATION La bande passante n'est pas disponible pour la connexion de noeud final périodique
XHCI_TRB_STATUS_BW_OVERRUN_ERR ERREUR D'UTILISATION Le descripteur de transfert isochrone (TD) a dépassé la bande passante des noeuds finaux
XHCI_TRB_STATUS_CMDRING_ABORT_ERR ERREUR D'UTILISATION Opération d'abandon de commande
XHCI_TRB_STATUS_CMDRING_STOP_ERR ERREUR D'UTILISATION Anneau de commande arrêté
XHCI_TRB_STATUS_CTXT_STATE_ERR ERREUR D'UTILISATION Commande de changement d'état de contexte non valide
XHCI_TRB_STATUS_DATA_BUF_ERR ERREUR D'UTILISATION Dépasseur ou sous-exécution
XHCI_TRB_STATUS_EP_NE_ERR ERREUR D'UTILISATION Le noeud final est à l'état désactivé
XHCI_TRB_STATUS_EVENT_LOST_ERR ERREUR D'UTILISATION Dépassement de l'événement interne
XHCI_TRB_STATUS_EVTRING_FULL_ERR ERREUR D'UTILISATION L'anneau d'événement est saturé
XHCI_TRB_STATUS_INCOMPAT_DEV_ERR ERREUR D'UTILISATION Unité incompatible
XHCI_TRB_STATUS_INCORRECT ERREUR D'UTILISATION Erreur de mise à jour
XHCI_TRB_STATUS_INVALID_SID_ERR ERREUR D'UTILISATION ID de flux non valide
XHCI_TRB_STATUS_INVALID_STR_TYP_ERR ERREUR D'UTILISATION Flux de type de contexte (Ctxt) non valide
XHCI_TRB_STATUS_ISOCH_BUF_OVR_ERR ERREUR D'UTILISATION Dépassement de mémoire tampon isochrone
XHCI_TRB_STATUS_MAXEL_LARGE_ERR ERREUR D'UTILISATION Le temps d'attente maximal de sortie est trop important
XHCI_TRB_STATUS_MIS_SERV_ERR ERREUR D'UTILISATION Le noeud final isochrone n'est pas traité
XHCI_TRB_STATUS_NOPING_RESP_ERR ERREUR D'UTILISATION Pas de réponse ping dans l'intervalle de temps de service du noeud final (ESIT)
XHCI_TRB_STATUS_NOSLOTS_ERR ERREUR D'UTILISATION Nombre maximal d'emplacements
XHCI_TRB_STATUS_PARAM_ERR ERREUR D'UTILISATION Le paramètre de contexte n'est pas valide
XHCI_TRB_STATUS_RESOURCE_ERR ERREUR D'UTILISATION Aucune ressource adéquate
XHCI_TRB_STATUS_RING_OVERRUN_ERR ERREUR D'UTILISATION Rappel de l'anneau
XHCI_TRB_STATUS_RING_UNDERRUN_ERR ERREUR D'UTILISATION Anneau en cours d'exécution
XHCI_TRB_STATUS_SEC_BW_ERR ERREUR D'UTILISATION Erreur de bande passante secondaire
XHCI_TRB_STATUS_SHORT_PKT_ERR USBD_SUCCESSS La taille du paquet est inférieure à la taille du descripteur de transfert dans la demande de transfert.
XHCI_TRB_STATUS_SLOT_DISABLED_ERR ERREUR D'UTILISATION L'emplacement est à l'état désactivé
XHCI_TRB_STATUS_SPLIT_TR_ERR ERREUR D'UTILISATION Erreur de fractionnement de transaction
XHCI_TRB_STATUS_STALL_ERR D_STABD_USAGE_UTILISATEUR Retard détecté sur TRB
XHCI_TRB_STATUS_STOP_LEN_ERR ERREUR D'UTILISATION La longueur d'événement de transfert n'est pas valide
XHCI_TRB_STATUS_STOPPED_ERR ERREUR D'UTILISATION La commande d'arrêt du noeud final est reçue
XHCI_TRB_STATUS_SUCCESS _RÉUSSITE USBD_SUCCÈS Le succès du commandement
XHCI_TRB_STATUS_TRB_ERR ERREUR D'UTILISATION Erreur de paramètre TRB
XHCI_TRB_STATUS_UNDEFINED_ERR ERREUR D'UTILISATION Condition d'erreur non définie
XHCI_TRB_STATUS_USB_TSX_ERR ERREUR D'UTILISATION Aucune réponse valide de l'unité
XHCI_TRB_STATUS_VF_EVTRING_FULL_ERR ERREUR D'UTILISATION L'anneau d'événement Virtual Function (VF) est saturé

Vecteurs d'appel

Chaque fois que la méthode de configuration USB est exécutée, elle ouvre le fichier spécial du pilote système USB /dev/usb0 (USBD) et tente d'enregistrer chaque contrôleur hôte USB détecté et disponible auprès de l'USBD à l'aide d'une opération USBD_REGISTER_HC ioctl . Lorsque l'opération USBD_REGISTER_HC ioctl est traitée, USBD ouvre le pilote de contrôleur d'hôte et demande l'enregistrement des vecteurs d'appel stockés dans le pilote de contrôleur d'hôte à l'aide d'une opération HCD_REGISTER_HC ioctl . Une fois que les vecteurs d'appel sont enregistrés auprès de l'USBD, toutes les autres communications entre le USBD et le pilote du contrôleur hôte sont traitées par les vecteurs d'appel. Voici le récapitulatif des vecteurs d'appel:

Vecteur d'appel Descriptif
hcdConfigPipes Ce vecteur d'appel est fourni par le USBD lors de l'énumération de l'unité logique USB.

Ce vecteur d'appel prend en charge xHCD avec USBD, mais il ne prend pas en charge les pilotes EHCI ou OHCI. Il émet une commande de configuration de noeud final sur le périphérique USB pour que les noeuds finaux non-contrôle sur le périphérique sont opérationnels. Ce vecteur d'appel est appelé par le USBD une fois que la sélection de configuration est terminée sur le périphérique USB.

hcdDevAlloc Détecte la connexion d'un périphérique logique USB. Ce vecteur d'appel est fourni par le USBD.

Ce vecteur d'appel prend en charge le pilote de contrôleur d'hôte extensible (xHCD) avec USBD, mais il ne prend pas en charge les pilotes EHCI ou OHCI. Il active l'emplacement, définit l'adresse de l'unité USB et alloue les ressources du pilote HCD pour utiliser le périphérique USB. Elle renvoie la valeur d'adresse USB à l'USBD. Après cet appel, le noeud final de contrôle par défaut sur le périphérique USB est activé pour interroger les données spécifiques au protocole USB.

hcdDevFree Détecte la suppression d'un périphérique logique USB. Ce vecteur d'appel est fourni par le USBD.

Ce vecteur d'appel prend en charge xHCD avec USBD, mais il ne prend pas en charge les pilotes EHCI ou OHCI. Il désactive l'attribut et libère également les ressources allouées par le vecteur d'appel hcdDevAlloc .

hcdGetFrame Obtient le numéro de châssis actuel du contrôleur hôte connecté. Ce vecteur d'appel est fourni par le USBD.
hcdPipeAbort Annule le traitement d'une mémoire tampon d'E-S. Le canal de communication spécifié par la mémoire tampon d'E-S est déjà arrêté avant l'appel du vecteur d'appel hcdPipeAbort . Ce vecteur d'appel est fourni par le USBD.
hcdPipeAddIOB Augmente le nombre maximal de mémoires tampon d'E-S en attente. Ce vecteur d'appel est fourni par le USBD.
hcdPipeClear Efface, arrête et redémarre les opérations d'E-S sur un noeud final spécifique. Lorsque ce vecteur d'appel est appelé, la fonction vérifie si l'anneau est à l'état arrêté.
hcdPipeConnect Crée une connexion de canal de communication avec un noeud final sur un périphérique USB spécifique.
hcdPipeDisconnect Supprime la connexion de canal précédemment établie avec le noeud final sur un périphérique USB spécifique.
hcdPipeHalt Halte un tube du point de vue du contrôleur hôte. Toutes les opérations d'E-S en attente restent à l'état en attente. Ce vecteur d'appel est fourni par le USBD.
hcdPipeIO Effectua les opérations d'E-S sur le périphérique USB. Les opérations d'E-S peuvent être des types de transfert suivants: contrôle, volume, isochrone et interruption.
hcdPipeResetToggle Réinitialise le bit de basculement de la synchronisation de données sur DATA0. Ce vecteur d'appel est fourni par le USBD.
hcdPipeStatus Obtient le statut du tube du point de vue de l'hôte. Ce vecteur d'appel est fourni par le USBD.
hcdShutdownComplete Informe le pilote du contrôleur d'hôte que la demande usbdReqHCshutdown est terminée. Ce vecteur d'appel est fourni par le USBD.
hcdUnconfigPipes Détecte qu'une unité est retirée du système. Ce vecteur d'appel est fourni par le USBD.

Ce vecteur d'appel prend en charge xHCD avec USBD, mais il ne prend pas en charge les pilotes EHCI ou OHCI. Il émet une commande de configuration de noeud final avec le bit Unconfig défini pour désactiver tous les noeuds finaux sans contrôle sur le périphérique USB et désallouer les ressources allouées par le vecteur d'appel hcdConfigPipes .

hcdUnregisterHC Désenregistre un contrôleur hôte de l'USBD.
usbdBusMap Mappe la mémoire pour le mastering de bus. Ce vecteur d'appel est fourni par xHCD.
usbdPostIOB Retraite une mémoire tampon d'entrée-sortie. Ce vecteur d'appel est fourni par le pilote de l'adaptateur.
usbdReqHCrestart Cet appel est fourni lorsqu'une erreur est détectée avec l'adaptateur et que la récupération du pilote de l'adaptateur à partir de cette erreur nécessite le redémarrage de l'adaptateur.
usbdReqHCshutdown Ce vecteur d'appel est fourni lors de la suppression du contrôleur hôte.
usbdReqHCunregister La fonction CFG TERM du pilote de l'adaptateur demande à l'USBD de désenregistrer le contrôleur hôte. Ce vecteur d'appel est fourni lors de la suppression du contrôleur hôte.