Arquitetura: extensão do controlador de host USB (UCX)
Esta seção apresenta conceitos e tarefas de alto nível para o desenvolvimento do driver de host. A seção se aplica a você se você estiver escrevendo um novo driver de controlador de host que se comunica com o driver de extensão do controlador de host USB fornecido pela Microsoft (Ucx01000.sys).
Aqui está uma versão modificada de um diagrama mostrado em drivers usb do lado do host no Windows. Essa versão oculta os detalhes da camada de driver do cliente USB, que não são relevantes para o desenvolvimento do driver do controlador de host.
Na imagem anterior,
- O driver de hub USB (Usbhub3.sys) é um driver KMDF. O driver de hub é responsável por gerenciar hubs USB e suas portas, enumeração e criar PDOs (objetos de dispositivo físico) de dispositivos USB e outros hubs que podem ser anexados às portas downstream.
- A extensão do controlador de host USB (Ucx01000.sys) é uma camada de abstração para o driver de hub acima na pilha e fornece um mecanismo genérico para enfileirar solicitações para o driver do controlador de host subjacente.
- O driver do controlador de host USB gerencia o hardware. Usbxhci.sys é um desses drivers fornecidos pela Microsoft, que tem como alvo o hardware do controlador USB compatível com especificações xHCI, em particular. Pode ser necessário que os desenvolvedores de hardware independentes escrevam seu próprio driver de controlador de host, em vez de usar a caixa de entrada Usbxhci.sys. Por exemplo, para um hardware XHCI que não está totalmente em conformidade com a especificação e, portanto, não pode usar Usbxhci.sys ou para hardware não XHCI, como USB por conexão TCP.
A comunicação bidirecional que ocorre entre o UCX e o driver do controlador de host ocorre usando interfaces de programação UCX (extensão do controlador de host USB). Cada driver vincula estaticamente aos pontos de entrada na biblioteca stub fornecida pela Microsoft (Ucx01000.lib) quando o driver é compilado.
Aqui estão as pilhas de dispositivos carregadas para o driver do controlador de host: