Настройка конечных точек 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 для отмены асинхронной (массовой или контрольной) передачи USB на USB-устройство с полной или низкой скоростью, которое находится за концентратором Переводчик транзакций (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 перед завершением.