Controlador de dispositivo de adaptador de sistema principal ampliable
Finalidad
Da soporte a la especificación Universal Serial Bus (USB) 3.0 Extensible Host Controller Interface (xHCI) para controladores de dispositivo de adaptador.
Sintaxis
#include <sys/hcdi.h>
#include <sys/usbdi.h>
#include <sys/usb.h>Descripción
Los archivos especiales /dev/usbhcn proporcionan interfaces que permiten el acceso a los dispositivos de adaptador de controlador de host USB. Estos archivos gestionan los recursos del adaptador para que varios controladores de cliente USB y el sistema USB (o el controlador de protocolo) puedan acceder a los dispositivos USB en el mismo adaptador de controlador de host USB simultáneamente.
El sistema operativo AIX® soporta los controladores de host USB con varias arquitecturas de interfaz, como por ejemplo Open Host Controller Interface (OHCI) y Enhanced Host Controller Interface (EHCI). La interfaz binaria para los adaptadores USB 3.0 se denomina Interfaz de controlador de host ampliable (xHCI). El sistema operativo AIX soporta actualmente las versiones 0.96 y 1.0 de la especificación xHCI . La especificación xHCI define una nueva arquitectura de controlador de host que sustituye a la especificación OHCI o EHCI existente y también se amplía a nuevas especificaciones, por ejemplo, USB Versión 3.0o posterior.
El controlador de dispositivo /usr/lib/drivers/pci/xhcidd maneja los adaptadores xHCI y el controlador de dispositivo /usr/lib/methods/cfgxhci es el método de configuración AIX correspondiente.
El atributo max_slots Object Data Manager (ODM) para el controlador de adaptador especifica el número máximo de dispositivos USB soportados por un adaptador xHCI . El valor predeterminado del atributo es 8. Puede modificar este valor a un valor máximo de 32 para dar soporte a más dispositivos.
max_slots se establecen en 8 y si conecta más de 8 dispositivos USB al adaptador USB, el adaptador sólo configura 8 dispositivos. La configuración del dispositivo restante falla.Subrutinas de punto de entrada del controlador de dispositivo
El controlador de dispositivo del adaptador USB sólo da soporte a los puntos de entrada open, close, ioctly config . Los puntos de entrada read y write no están soportados.
abrir y cerrar subrutinas
La subrutina open asocia el número de dispositivo, que se especifica como parámetro para la llamada al sistema open , con la estructura de dispositivo del adaptador interno. Si la subrutina open encuentra una estructura de adaptador, verifica que el dispositivo de adaptador correspondiente está configurado y no está marcado como inactivo. Si la subrutina open no encuentra una estructura de adaptador, devuelve un error. Si la característica Enhanced Error Handling (EEH) está habilitada, la subrutina open impide el acceso al dispositivo cuando se está procesando un suceso EEH.
subrutina ioctl
ioctl :| Operación | Descripción |
|---|---|
| HCD_REGISTER_HC | Registra los vectores de llamada entre el sistema USB (o el controlador de protocolo) y el controlador de controlador de host. Una vez registrados los vectores de llamada, todos los vectores de comunicación entre el sistema USB (o el controlador de protocolo) y el controlador del controlador de host. |
Resumen de las condiciones de error devueltas por el controlador de dispositivo del adaptador xHCI
El xHCI devuelve los siguientes códigos de estado de finalización de bloque de solicitud de transferencia (TRB) durante la actualización de estado si se detecta la condición de error asociada. Los valores de estado de TRB se especifican en la especificación xHCI . Estos códigos de terminación a su vez se correlacionan con los siguientes valores de USBstatus :
| Estado de TRB | Valor de USBstatus | Descripción |
|---|---|---|
| XHCI_TRB_STATUS_BAB_DET_ERR | USBD_STALL | Balbucear durante la transacción |
| XHCI_TRB_STATUS_BW_ERR | USBD_ERROR | Ancho de banda no disponible para conexión de punto final periódica |
| XHCI_TRB_STATUS_BW_OVERRUN_ERR | USBD_ERROR | El descriptor de transferencia isocronous (TD) ha excedido el ancho de banda de los puntos finales |
| XHCI_TRB_STATUS_CMDRING_ABORT_ERR | USBD_ERROR | Operación de cancelación de mandatos |
| XHCI_TRB_STATUS_CMDRING_STOP_ERR | USBD_ERROR | Anillo de mandatos detenido |
| XHCI_TRB_STATUS_CTXT_STATE_ERR | USBD_ERROR | Mandato de cambio de estado contextual no válido |
| XHCI_TRB_STATUS_DATA_BUF_ERR | USBD_ERROR | Rebasamiento o infrautilización |
| XHCI_TRB_STATUS_EP_NE_ERR | USBD_ERROR | El punto final está en un estado inhabilitado |
| XHCI_TRB_STATUS_EVENT_LOST_ERR | USBD_ERROR | Desbordamiento del evento interno |
| XHCI_TRB_STATUS_EVTRING_FULL_ERR | USBD_ERROR | El anillo de eventos está lleno |
| XHCI_TRB_STATUS_INCOMPAT_DEV_ERR | USBD_ERROR | Dispositivo incompatible |
| XHCI_TRB_STATUS_INVÁLIDO | USBD_ERROR | Error de actualización de finalización |
| XHCI_TRB_STATUS_INVALID_SID_ERR | USBD_ERROR | ID de corriente no válido |
| XHCI_TRB_STATUS_INVALID_STR_TYP_ERR | USBD_ERROR | Corriente no válida de tipo de contexto (Ctxt) |
| XHCI_TRB_STATUS_ISOCH_BUF_OVR_ERR | USBD_ERROR | Desbordamiento del búfer isocrono |
| XHCI_TRB_STATUS_MAXEL_LARGE_ERR | USBD_ERROR | La latencia de salida máxima es demasiado grande |
| XHCI_TRB_STATUS_MIS_SERV_ERR | USBD_ERROR | No se da servicio al punto final isocrono |
| XHCI_TRB_STATUS_NOPING_RESP_ERR | USBD_ERROR | No hay respuesta ping dentro del tiempo de intervalo de servicio de punto final (ESIT) |
| XHCI_TRB_STATUS_NOSLOTS_ERR | USBD_ERROR | Ranuras máximas excedidas |
| XHCI_TRB_STATUS_PARAM_ERR | USBD_ERROR | El parámetro contextual no es válido |
| XHCI_TRB_STATUS_RESOURCE_ERR | USBD_ERROR | No hay recursos adecuados |
| XHCI_TRB_STATUS_RING_OVERRUN_ERR | USBD_ERROR | Anillas |
| XHCI_TRB_STATUS_RING_UNDERRUN_ERR | USBD_ERROR | Banda inferior |
| XHCI_TRB_STATUS_SEC_BW_ERR | USBD_ERROR | Error de ancho de banda |
| XHCI_TRB_STATUS_SHORT_PKT_ERR | USBD_SUCCESS | El tamaño del paquete es menor que el tamaño del descriptor de transferencia en la solicitud de transferencia. |
| XHCI_TRB_STATUS_SLOT_DISABLED_ERR | USBD_ERROR | La ranura está en un estado inhabilitado |
| XHCI_TRB_STATUS_SPLIT_TR_ERR | USBD_ERROR | Error de transacción dividida |
| XHCI_TRB_STATUS_STALL_ERR | USBD_STALL | Retraso detectado en TRB |
| XHCI_TRB_STATUS_STOP_LEN_ERR | USBD_ERROR | La longitud del suceso de transferencia no es |
| XHCI_TRB_STATUS_STOPPED_ERR | USBD_ERROR | Se ha recibido el mandato Detener punto final |
| XHCI_TRB_STATUS_SUCCESS | USBD_SUCCESS | Éxito del mandato |
| XHCI_TRB_STATUS_TRB_ERR | USBD_ERROR | Error de parámetro de TRB |
| XHCI_TRB_STATUS_UNDEFINED_ERR | USBD_ERROR | Condición de error no definida |
| XHCI_TRB_STATUS_USB_TSX_ERR | USBD_ERROR | No hay respuesta válida del dispositivo |
| XHCI_TRB_STATUS_VF_EVTRING_FULL_ERR | USBD_ERROR | El anillo de sucesos de función virtual (VF) está lleno |
Vectores de llamada
Siempre que se ejecuta el método de configuración USB, abre el archivo especial del controlador del sistema USB (USBD) de /dev/usb0 e intenta registrar cada controlador de host USB detectado y disponible con el USBD utilizando una operación de USBD_REGISTER_HC ioctl . Cuando se procesa la operación de USBD_REGISTER_HC ioctl , el USBD abre el controlador de host y solicita el registro de los vectores de llamada almacenados en el controlador de host utilizando una operación de HCD_REGISTER_HC ioctl . Después de que los vectores de llamada se registren con el USBD, toda la comunicación adicional entre el USBD y el controlador de controlador de host es manejada por los vectores de llamada. El resumen de los vectores de llamadas sigue:
| Vector de llamada | Descripción |
|---|---|
| hcdConfigPipes | Este vector de llamada lo proporciona USBD durante la enumeración del dispositivo lógico USB. Este vector de llamada da soporte a xHCD con USBD, pero no da soporte a controladores EHCI u OHCI. Emite un mandato de configuración de punto final al dispositivo USB para que los puntos finales de no control en el dispositivo sean operativos. El USBD llama a este vector de llamada después de que la selección de configuración se haya completado en el dispositivo USB. |
| hcdDevAlloc | Detecta la conexión de un dispositivo lógico USB. Este vector de llamada es proporcionado por la USBD. Este vector de llamada da soporte al controlador de controlador de host ampliable (xHCD) con USBD, sin embargo, no da soporte a controladores EHCI u OHCI. Habilita la ranura, establece la dirección de dispositivo USB y asigna los recursos de controlador HCD para utilizar el dispositivo USB. Devuelve el valor de dirección USB a USBD. Después de esta llamada, el punto final de control predeterminado del dispositivo USB está habilitado para consultar los datos específicos del protocolo USB. |
| hcdDevFree | Detecta la eliminación de un dispositivo lógico USB. Este vector de llamada es proporcionado por la USBD. Este vector de llamada da soporte a xHCD con USBD, pero no da soporte a controladores EHCI u OHCI. Inhabilita la ranura y también desasigna los recursos asignados por el vector de llamada |
| hcdGetFrame | Obtiene el número de trama actual del controlador de host conectado. Este vector de llamada es proporcionado por la USBD. |
| hcdPipeAbort | Cancela el proceso de un almacenamiento intermedio de E/S. El conducto especificado por el almacenamiento intermedio de E/S ya está detenido antes de que se llame al vector de llamada hcdPipeAbort . Este vector de llamada es proporcionado por la USBD. |
| hcdPipeAddIOB | Aumenta el número máximo de almacenamientos intermedios de E/S pendientes. Este vector de llamada es proporcionado por la USBD. |
| hcdPipeClear | Borra, desdetiene y reinicia las operaciones de E/S en un punto final específico. Cuando se llama a este vector de llamada, la función comprueba si el anillo está en estado detenido. |
| hcdPipeConnect | Crea una conexión de conducto con un punto final en un dispositivo USB específico. |
| hcdPipeDisconnect | Elimina la conexión de conducto previamente establecida con el punto final en un dispositivo USB específico. |
| hcdPipeHalt | Detiene un conducto desde la perspectiva del controlador de host. Todas las operaciones de E/S pendientes permanecen en un estado pendiente. Este vector de llamada es proporcionado por la USBD. |
| hcdPipeIO | Realiza las operaciones de E/S en el dispositivo USB. Las operaciones de E/S pueden ser de los siguientes tipos de transferencia: control, graneles, isocronos e interrupciones. |
| hcdPipeResetToggle | Restablece el bit de conmutación de sincronización de datos a DATA0. Este vector de llamada es proporcionado por la USBD. |
| hcdPipeStatus | Obtiene el estado del conducto desde la perspectiva de host. Este vector de llamada es proporcionado por la USBD. |
| hcdShutdownComplete | Informa al controlador de controlador de host de que la solicitud usbdReqHCshutdown se ha completado. Este vector de llamada es proporcionado por la USBD. |
| hcdUnconfigPipes | Detecta que un dispositivo se ha eliminado del sistema. Este vector de llamada es proporcionado por la USBD. Este vector de llamada da soporte a xHCD con USBD, pero no da soporte a controladores EHCI u OHCI. Emite un mandato de configuración de punto final con el bit |
| hcdUnregisterHC | Desregistra un controlador de host de USBD. |
| usbdBusMap | Correlaciona la memoria para la masterización de bus. Este vector de llamada lo proporciona xHCD. |
| usbdPostIOB | Retira un almacenamiento intermedio de E/S. Este vector de llamada lo proporciona el controlador del adaptador. |
| usbdReqHCrestart | Esta llamada se proporciona cuando se detecta un error con el adaptador y la recuperación del controlador de adaptador de este error requiere que reinicie el adaptador. |
| usbdReqHCshutdown | Este vector de llamada se proporciona durante la eliminación del controlador de host. |
| usbdReqHCunregister | La función CFG TERM del controlador de adaptador solicita al USBD que anule el registro del controlador de host. Este vector de llamada se proporciona durante la eliminación del controlador de host. |