Настройка конечных точек 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_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 для отмены асинхронной (Bulk или управляющей) передачи USB на USB-устройство полной или низкой скорости, которое расположено за концентратором Transaction Translator (TT). Во всех других случаях драйвер может при необходимости вызвать 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 , прежде чем завершить его.