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_ABORT 或 EVT_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,以取消针对位于事务转换器(TT)集线器后面的USB全速或低速设备的异步(批量或控制)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 才能完成。