在 USB 主控制器驱动程序中配置 USB 终结点

UCX 管理终结点对象的创建,并通知主机控制器将终结点编程或反编程到 USB 主控制器。

在对终结点进行编程时,它也由 UCX 管理。 当设备连接到总线并断开连接时,终结点的状态会更改,遇到电源事件(例如挂起和重置),并经历新的终结点创建(例如备用设置更改)。

终结点配置

UCX 调用由主控制器驱动程序实现的回调函数,以在终结点必须编程到 USB 主控制器或释放终结点时通知驱动程序。 调用 EVT_UCX_USBDEVICE_ENABLE 时,驱动程序将准备控制器以执行到设备的默认终结点的传输。 准备控制器包括对默认终结点进行编程。 调用 EVT_UCX_USBDEVICE_DISABLE 时,驱动程序会取消对默认终结点进行编程,并释放与设备关联的其他控制器资源。 调用 EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE 时,会为驱动程序提供要编程到控制器中的非默认终结点列表,并为其提供要从控制器中删除的另一个非默认终结点列表。 然后,主控制器驱动程序将指定的非默认终结点程序化到控制器中,并从控制器中删除其他列表中) 指定的非默认终结点 (。

队列状态管理

UCX 调用由主机控制器驱动程序实现的回调函数,以执行对终结点队列状态的更改。 然后,驱动程序对提供给 UCX 的终结点队列以及驱动程序中维护的任何二级队列执行相应的操作。 在以下情况下,终结点队列会中止或清除:

  • USB 设备客户端驱动程序发送URB_FUNCTION_ABORT_PIPE请求。
  • 暂停期间。
  • 当设备连接到中心时,检测到设备断开连接。
  • 在选择接口设置请求期间。

若要通知主机控制器驱动程序队列中止或清除,UCX 调用 EVT_UCX_ENDPOINT_ABORTEVT_UCX_ENDPOINT_PURGE。 如果以后某个时候 UCX 需要终结点队列,则 UCX 会调用 EVT_UCX_ENDPOINT_START 回调来通知驱动程序启动队列。

转移取消

对于主机控制器驱动程序声明GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL的任何控制器,驱动程序必须调用 UcxEndpointNeedToCancelTransfers 并实现 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS ,以取消异步 (批量或控制) USB 传输到位于事务转换器 (TT) 集线器后面的 USB 全速或低速设备。 在所有其他情况下,驱动程序可以选择调用 UcxEndpointNeedToCancelTransfers 以获取 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS 通知,指示允许在此终结点上取消传输,并且驱动程序可以继续取消传输。 或者,驱动程序可以直接取消传输,而无需调用 UcxEndpointNeedToCancelTransfers

如果主控制器驱动程序始终对此 GUID 的请求失败,它可以完全忽略这两个函数调用。

如果驱动程序从未调用 UcxEndpointNeedToCancelTransfers,则不会调用驱动程序 的EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS 回调,并且可以在回调注册期间为 NULL。

如果驱动程序打算使用 UcxEndpointNeedToCancelTransfers,则在传输已编程到控制器中并取消时,驱动程序必须调用 方法,然后等待 EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS 才能完成。