可扩展主机控制器适配器设备驱动程序
用途
支持适配器设备驱动程序的通用串行总线 (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 适配器设备驱动程序仅支持 open, close, ioctl和 config 入口点。 不支持 read 和 write 入口点。
打开和关闭子例程
open 子例程将指定为 open 系统调用的参数的设备号与内部适配器设备结构相关联。 如果 open 子例程找到适配器结构,那么它将验证是否配置了相应的适配器设备并且未将其标记为不活动。 如果 open 子例程找不到适配器结构,那么会返回错误。 如果启用了增强型错误处理 (EEH) 功能,那么在处理 EEH 事件时, open 子例程将阻止访问设备。
ioctl 子例程
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 驱动程序。 它会禁用插槽,并且还会取消分配由 |
| 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 驱动程序。 它发出配置端点命令,其中设置了 |
| hcdUnregisterHC | 从 USBD 取消注册主机控制器。 |
| usbdBusMap | 映射内存以进行总线控制。 此调用向量由 xHCD提供。 |
| usbdPostIOB | 重新创建 I/O 缓冲区。 此调用向量是由适配器驱动程序提供的。 |
| usbdReqHCrestart | 如果在适配器上检测到错误,并且从该错误恢复适配器驱动程序需要您重新启动适配器,那么会提供此调用。 |
| usbdReqHCshutdown | 此调用向量是在除去主机控制器期间提供的。 |
| usbdReqHCunregister | 适配器驱动程序的 CFG TERM 功能请求 USBD 注销主机控制器。 此调用向量是在除去主机控制器期间提供的。 |