可扩展主机控制器适配器设备驱动程序

用途

支持适配器设备驱动程序的通用串行总线 (USB) 3.0 可扩展主机控制器接口 (xHCI) 规范。

语法

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

描述

/dev/usbhcn 特殊文件提供了允许访问 USB 主机控制器适配器设备的接口。 这些文件用于管理适配器资源,以便多个 USB 客户机驱动程序和 USB 系统 (或协议驱动程序) 可以同时访问同一 USB 主机控制器适配器上的 USB 设备。

AIX® 操作系统支持具有各种接口体系结构的 USB 主机控制器,例如开放式主机控制器接口 (OHCI) 和增强型主机控制器接口 (EHCI)。 USB 3.0 适配器的二进制接口称为可扩展主机控制器接口 (xHCI)。 AIX 操作系统当前支持 xHCI 规范的 0.96 和 1.0 版本。 xHCI 规范定义新的主机控制器体系结构,该体系结构将替换现有的 OHCI 或 EHCI 规范,并且还扩展至新的规范,例如 USB V 3.0或更高版本。

/usr/lib/drivers/pci/xhcidd 设备驱动程序处理 xHCI 适配器,而 /usr/lib/methods/cfgxhci 设备驱动程序是相应的 AIX 配置方法。

适配器驱动程序的 max_slots 对象数据管理器 (ODM) 属性指定 xHCI 适配器支持的最大 USB 设备数。 8 属性的缺省值为 8。 您可以将此值修改为最大值 32 ,以支持更多设备。

注: 如果 max_slots 值设置为 8 ,并且您将多个 8 USB 设备连接到 USB 适配器,那么适配器仅配置 8 设备。 其余设备的配置发生故障。

适配器设备驱动程序入口点子例程

USB 适配器设备驱动程序仅支持 opencloseioctlconfig 入口点。 不支持 readwrite 入口点。

打开和关闭子例程

open 子例程将指定为 open 系统调用的参数的设备号与内部适配器设备结构相关联。 如果 open 子例程找到适配器结构,那么它将验证是否配置了相应的适配器设备并且未将其标记为不活动。 如果 open 子例程找不到适配器结构,那么会返回错误。 如果启用了增强型错误处理 (EEH) 功能,那么在处理 EEH 事件时, open 子例程将阻止访问设备。

ioctl 子例程

xHCI 适配器设备驱动程序支持以下 ioctl 子操作:
操作 描述
HCD_REGISTER_HC 注册 USB 系统 (或协议驱动程序) 与主机控制器驱动程序之间的调用向量。 在注册呼叫向量后, USB 系统 (或协议驱动程序) 与主机控制器驱动程序之间的所有进一步通信都由这些向量处理。

xHCI 适配器设备驱动程序返回的错误情况摘要

如果检测到关联的错误情况,那么 xHCI 将在状态更新期间返回以下传输请求块 (TRB) 完成状态码。 在 xHCI 规范中指定 TRB 状态值。 这些完成代码将依次映射到以下 USBstatus 值:

TRB 状态 USBstatus 描述
XHCI_TRB_STATUS_BAB_DET_ERR USBD_STALL 事务期间的 babbling
XHCI_TRB_STATUS_ERR USBD_ERROR 带宽对于定期端点连接不可用
XHCI_TRB_STATUS_OVERRUN_ERR USBD_ERROR 同步传输描述符 (TD) 超过了端点的带宽
XHCI_TRB_STATUS_CMDRING_ABORT_ERR USBD_ERROR 命令中止操作
XHCI_TRB_STATUS_CMDRING_STOP_ERR USBD_ERROR 命令环已停止
XHCI_TRB_STATUS_CTXT_STATE_ERR USBD_ERROR 上下文状态更改命令无效
XHCI_TRB_STATUS_DATA_BUF_ERR USBD_ERROR 过速或过速
XHCI_TRB_STATUS_EP_NE_ERR USBD_ERROR 端点处于已禁用状态
XHCI_TRB_STATUS_EVENT_LOST_ERR USBD_ERROR 内部事件过速
XHCI_TRB_STATUS_EVTRING_FULL_ERR USBD_ERROR 事件环已满
XHCI_TRB_STATUS_INCOMPAT_DEV_ERR USBD_ERROR 设备不兼容
XHCI_TRB_STATUS_INVALID USBD_ERROR 完成更新错误
XHCI_TRB_STATUS_INVALID_SID_ERR USBD_ERROR 流标识无效
XHCI_TRB_STATUS_INVALID_STR_TYP_ERR USBD_ERROR 上下文 (Ctxt) 类型的流无效
XHCI_TRB_STATUS_ISOCH_BUF_OVR_ERR USBD_ERROR 同步缓冲区过速
XHCI_TRB_STATUS_MAXEL_LARGE_ERR USBD_ERROR 最大出口等待时间太大
XHCI_TRB_STATUS_MIS_SERV_ERR USBD_ERROR 同步端点未提供服务
XHCI_TRB_STATUS_NOPING_RESP_ERR USBD_ERROR 端点服务时间间隔 (ESIT) 内没有 ping 响应
XHCI_TRB_STATUS_NOSLOTS_ERR USBD_ERROR 超过最大插槽数
XHCI_TRB_STATUS_PARAM_ERR USBD_ERROR 上下文参数无效
XHCI_TRB_STATUS_RESOURCE_ERR USBD_ERROR 没有足够的资源
XHCI_TRB_STATUS_RING_OVERRUN_ERR USBD_ERROR 环过速
XHCI_TRB_STATUS_RING_UNDERRUN_ERR USBD_ERROR 环欠运行
XHCI_TRB_STATUS_SEC_ERR USBD_ERROR 辅助带宽错误
XHCI_TRB_STATUS_SHORT_PKT_ERR USBD_SUCCESSS 在传输请求中,包大小小于传输描述符大小。
XHCI_TRB_STATUS_SLOT_DISABLED_ERR USBD_ERROR 插槽处于已禁用状态
XHCI_TRB_STATUS_SPLIT_TR_ERR USBD_ERROR 拆分事务错误
XHCI_TRB_STATUS_STALL_ERR USBD_STALL 在 TRB 上检测到延迟
XHCI_TRB_STATUS_STOP_LEN_ERR USBD_ERROR 传输事件长度无效
XHCI_TRB_STATUS_STOPPED_ERR USBD_ERROR 接收到停止端点命令
XHCI_TRB_STATUS_SUCCESS USBD_SUCCESS 命令成功
XHCI_TRB_STATUS_TRB_ERR USBD_ERROR TRB 参数错误
XHCI_TRB_STATUS_UNDEFINED_ERR USBD_ERROR 未定义错误条件
XHCI_TRB_STATUS_USB_TSX_ERR USBD_ERROR 没有来自设备的有效响应
XHCI_TRB_STATUS_VF_EVTRING_FULL_ERR USBD_ERROR 虚函数 (VF) 事件环已满

调用向量

每当 USB 配置方法运行时,它都会打开 /dev/usb0 USB 系统驱动程序 (USBD) 特殊文件,并尝试使用 USBD_REGISTER_HC ioctl 操作向 USBD 注册每个检测到的可用 USB 主机控制器。 处理 USBD_REGISTER_HC ioctl 操作时, USBD 会打开主机控制器驱动程序,并使用 HCD_REGISTER_HC ioctl 操作请求注册存储在主机控制器驱动程序中的调用向量。 所述呼叫向量向所述 USBD 注册后,所述呼叫向量处理所述 USBD 与所述主机控制器驱动程序之间的所有进一步通信。 调用向量的摘要如下:

调用向量 描述
hcdConfigPipes 在 USB 逻辑设备枚举期间,此调用向量由 USBD 提供。

此调用向量支持具有 USBD 的 xHCD ,但是它不支持 EHCI 或 OHCI 驱动程序。 它向 USB 设备发出 "配置端点" 命令,以使设备上的非控制端点可操作。 在 USB 设备上完成配置选择后, USBD 将调用此呼叫向量。

hcdDevAlloc 检测是否连接了 USB 逻辑设备。 此呼叫矢量由 USBD 提供。

此调用向量支持具有 USBD 的可扩展主机控制器驱动程序 (xHCD) ,但是它不支持 EHCI 或 OHCI 驱动程序。 它启用该插槽,设置 USB 设备地址,并分配 HCD 驱动程序资源以使用 USB 设备。 它将 USB 地址值返回给 USBD。 在此调用后,将启用 USB 设备上的缺省控制端点以查询特定于 USB 协议的数据。

hcdDevFree 检测是否已卸下 USB 逻辑设备。 此呼叫矢量由 USBD 提供。

此调用向量支持具有 USBD 的 xHCD ,但是它不支持 EHCI 或 OHCI 驱动程序。 它会禁用插槽,并且还会取消分配由 hcdDevAlloc 调用向量分配的资源。

hcdGetFrame 从连接的主机控制器获取当前帧号。 此呼叫矢量由 USBD 提供。
hcdPipeAbort 取消对 I/O 缓冲区的处理。 在调用 hcdPipeAbort 调用向量之前, I/O 缓冲区指定的管道已停止。 此呼叫矢量由 USBD 提供。
hcdPipeAddIOB 增加未完成 I/O 缓冲区的最大数目。 此呼叫矢量由 USBD 提供。
hcdPipeClear 在特定端点上清除,取消停止并重新启动 I/O 操作。 当调用此调用向量时,该函数会检查环是否处于已停止状态。
hcdPipeConnect 创建到特定 USB 设备上的端点的管道连接。
hcdPipeDisconnect 除去先前与特定 USB 设备上的端点建立的管道连接。
hcdPipeHalt 从主机控制器的角度停止一个管道。 所有暂挂 I/O 操作仍处于暂挂状态。 此呼叫矢量由 USBD 提供。
hcdPipeIO 在 USB 设备上执行 I/O 操作。 I/O 操作可以是以下类型的传输: 控制,批量,同步和中断。
hcdPipeResetToggle 将数据同步切换位重置为 DATA0。 此呼叫矢量由 USBD 提供。
hcdPipeStatus 从主机透视图中获取管道的状态。 此呼叫矢量由 USBD 提供。
hcdShutdownComplete 通知主机控制器驱动程序 usbdReqHCshutdown 请求已完成。 此呼叫矢量由 USBD 提供。
hcdUnconfigPipes 检测到设备已从系统中移除。 此呼叫矢量由 USBD 提供。

此调用向量支持具有 USBD 的 xHCD ,但是它不支持 EHCI 或 OHCI 驱动程序。 它发出配置端点命令,其中设置了 Unconfig 位以禁用 USB 设备上的所有非控制端点,并取消分配由 hcdConfigPipes 调用向量分配的资源。

hcdUnregisterHC 从 USBD 取消注册主机控制器。
usbdBusMap 映射内存以进行总线控制。 此调用向量由 xHCD提供。
usbdPostIOB 重新创建 I/O 缓冲区。 此调用向量是由适配器驱动程序提供的。
usbdReqHCrestart 如果在适配器上检测到错误,并且从该错误恢复适配器驱动程序需要您重新启动适配器,那么会提供此调用。
usbdReqHCshutdown 此调用向量是在除去主机控制器期间提供的。
usbdReqHCunregister 适配器驱动程序的 CFG TERM 功能请求 USBD 注销主机控制器。 此调用向量是在除去主机控制器期间提供的。