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.
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
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 |
| 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 |
| 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. |