Drivers USB do lado do host no Windows
Este artigo fornece uma visão geral da arquitetura de pilha de driver USB (Universal Serial Bus).
A figura a seguir mostra o diagrama de blocos de arquitetura da pilha de drivers USB para Windows. O diagrama mostra pilhas de driver USB separadas para USB 2.0 e USB 3.0. Windows carrega a pilha de driver USB 3.0 quando um dispositivo é anexado a um controlador xHCI.
Windows carrega a pilha de driver USB 2.0 para dispositivos conectados a controladores eHCI, oHCI ou uHCI. A pilha de drivers USB 2.0 é fornecida no Windows XP com Service Pack 1 (SP1) e versões posteriores do sistema operacional Windows.
Pilha de drivers USB 3.0
A Microsoft criou os drivers USB 3.0 usando interfaces KMDF (Kernel Mode Driver Framework). O modelo de driver KMDF reduz a complexidade e melhora a estabilidade.
Driver do controlador de host USB 3.0 (Usbxhci.sys)
O driver xHCI é o driver do controlador de host USB 3.0. As responsabilidades do driver xHCI incluem inicializar registros MMIO e estruturas de dados baseadas em memória de host para hardware do controlador xHCI, mapear solicitações de transferência de drivers de camada superior para Blocos de Solicitação de Transferência e enviar as solicitações ao hardware. Depois de concluir uma transferência, o driver manipula eventos de conclusão de transferência do hardware e propaga os eventos para cima na pilha de driver. Ele também controla os slots de dispositivo do controlador xHCI e os contextos de ponto de extremidade.
Windows carrega o driver xHCI como o FDO (objeto de dispositivo de função) na pilha de dispositivos para o controlador de host.
Extensão do controlador de host USB (Ucx01000.sys)
O driver de extensão do controlador de host USB (uma extensão do KMDF) é a nova extensão para o driver do controlador de host específico da classe subjacente, como o driver xHCI. O novo driver é extensível e foi projetado para dar suporte a outros tipos de drivers de controlador de host que devem ser desenvolvidos no futuro. A extensão do controlador de host USB serve como uma interface abstrata comum para o driver do hub, fornece um mecanismo genérico para enfileirar solicitações para o driver do controlador de host e substitui determinadas funções selecionadas. Todas as solicitações de E/S iniciadas por drivers superiores alcançam o driver de extensão do controlador de host antes do driver xHCI. Ao receber uma solicitação de E/S, a extensão do controlador de host valida a solicitação e, em seguida, encaminha a solicitação para a fila KMDF apropriada associada ao ponto de extremidade de destino. O driver xHCI, quando pronto para processamento, recupera a solicitação da fila. As responsabilidades do driver de extensão do controlador de host USB são:
- Fornece objetos específicos de USB para o driver xHCI.
- Fornece rotinas de retorno de chamada de evento KMDF para o driver xHCI.
- Gerencia e controla as operações do hub raiz associado ao controlador de host.
- Implementa recursos configuráveis pelo driver cliente, como MDLs encadeados, fluxos e assim por diante.
Driver do hub USB (Usbhub3.sys)
O novo driver de hub, na pilha de driver USB para dispositivos 3.0, usa o modelo de driver KMDF. O driver de hub executa principalmente estas tarefas:
- Gerencia hubs USB e suas portas.
- Enumera dispositivos e outros hubs conectados às suas portas downstream.
- Cria PDOs (objetos de dispositivo físico) para os dispositivos e hubs enumerados.
Windows carrega o driver do hub como o FDO na pilha de dispositivos do hub. A enumeração de dispositivos e o gerenciamento de hub no novo driver são implementados por meio de um conjunto de máquinas de estado. O driver de hub depende do KMDF para gerenciamento de energia e funções PnP. Além do gerenciamento de hub, o driver de hub também executa verificações preliminares e processamento de determinadas solicitações enviadas pela camada de driver cliente USB. Por exemplo, o driver de hub analisa uma solicitação select-configuration para determinar quais pontos de extremidade serão configurados pela solicitação. Depois de analisar as informações, o driver do hub envia a solicitação para a extensão do controlador de host USB ou processamento adicional.
Pilha de drivers USB 2.0
Windows carrega a pilha de driver USB 2.0 para dispositivos conectados a controladores eHCI, oHCI ou uHCI. Os drivers na pilha de drivers USB 2.0 são fornecidos no Windows XP com SP1 e versões posteriores do sistema operacional Windows. A pilha de driver USB 2.0 foi projetada para facilitar dispositivos USB de alta velocidade, conforme definido na especificação USB 2.0.
Na parte inferior da pilha de driver USB está o driver do controlador de host. Ele consiste no driver de porta, Usbport.sys e um ou mais dos três drivers de miniporta que são executados simultaneamente. Quando o sistema detecta o hardware do controlador de host, ele carrega um desses drivers de miniport. O driver de miniport, depois de carregado, carrega o driver de porta Usbport.sys. O driver de porta lida com os aspectos das funções do driver do controlador de host que são independentes do protocolo específico.
O driver de miniporta Usbuhci.sys (interface universal do controlador de host) substitui o driver de miniclasse Uhcd.sys fornecido com o Windows 2000. O driver de miniporto Usbohci.sys (interface do controlador de host aberto) substitui Openhci.sys. O driver de miniporte Usbehci.sys dá suporte a dispositivos USB de alta velocidade e foi introduzido no Windows XP com SP1 e posterior e no Windows Server 2003 e sistemas operacionais posteriores.
Em todas as versões do Windows que suportam USB 2.0, o sistema operacional é capaz de gerenciar controladores de host USB 1.1 e USB 2.0 simultaneamente. Sempre que o sistema operacional detecta que ambos os tipos de controlador estão presentes, ele cria dois nós de dispositivo separados, um para cada controlador de host. Posteriormente, o Windows carrega o driver de miniporta Usbehci.sys para o hardware do controlador de host compatível com USB 2.0 e Usbohci.sys ou Openhci.sys para o hardware compatível com USB 1.1, dependendo da configuração do sistema.
Acima do driver da porta está o driver do barramento USB, Usbhub.sys, também conhecido como driver do hub. Este é o driver de dispositivo para cada hub no sistema.
Driver pai genérico de classe comum USB (Usbccgp.sys)
O driver pai genérico de classe comum USB é o driver pai fornecido pela Microsoft para dispositivos compostos. O driver de hub enumera e carrega o driver composto pai se deviceClass for 0 ou 0xef e numInterfaces for maior que 1 no descritor do dispositivo. O driver do hub gera a ID compatível para o driver composto pai como "USB\COMPOSITE". Usbccgp.sys usa rotinas WDM (Windows Driver Model).
O driver composto pai enumera todas as funções em um dispositivo composto e cria um PDO para cada uma. Isso faz com que a classe apropriada ou o driver cliente seja carregado para cada função no dispositivo. Cada driver de função (PDO filho) envia solicitações ao driver pai, que as envia ao driver do hub USB.
Usbccgp.sys está incluído no Windows XP com SP1 e versões posteriores do sistema operacional Windows. No Windows 8, o driver foi atualizado para implementar recursos de suspensão de função e ativação remota, conforme definido na especificação USB 3.0.
Para obter mais informações, consulte Driver pai genérico USB (Usbccgp.sys).
WinUSB (Winusb.sys)
O Windows USB (WinUSB) é um driver genérico fornecido pela Microsoft para dispositivos USB. A arquitetura WinUSB consiste em um driver de modo kernel (Winusb.sys) e uma biblioteca de vínculo dinâmico no modo de usuário (Winusb.dll). Para dispositivos que não exigem um driver de função personalizado, Winusb.sys pode ser instalado na pilha de modo kernel do dispositivo como o driver de função. Os processos do modo de usuário podem se comunicar com Winusb.sys usando um conjunto de solicitações de controle de E/S do dispositivo ou chamando funções WinUsb_Xxx . Para obter mais informações, consulte Introdução ao WinUSB para desenvolvedores.
No Windows 8, o arquivo INF (informações fornecidas pela Microsoft) para WinUSB, Winusb.inf, contém USB\MS_COMP_WINUSB como uma cadeia de caracteres de identificador de dispositivo. Isso permite que Winusb.sys sejam carregados automaticamente como o driver de função para os dispositivos que têm uma ID compatível com WinUSB correspondente no descritor do sistema operacional MS. Esses dispositivos são chamados de dispositivos WinUSB. Os fabricantes de hardware não são obrigados a distribuir um arquivo INF para seu dispositivo WinUSB, tornando o processo de instalação do driver mais simples para o usuário final. Para obter mais informações, consulte Dispositivo WinUSB.
Driver do cliente USB
Cada dispositivo USB, composto ou não composto, é gerenciado por um driver cliente. Um driver de cliente USB é uma classe ou driver de dispositivo que é um cliente da pilha de driver USB. Esses drivers incluem drivers específicos de classe e dispositivo da Microsoft ou de um fornecedor de terceiros. Para ver uma lista de drivers de classe fornecidos pela Microsoft, consulte Drivers para as classes de dispositivo USB com suporte. Um driver cliente cria solicitações para se comunicar com o dispositivo chamando interfaces públicas expostas pela pilha de driver USB.
Um driver cliente para um dispositivo composto não é diferente de um driver cliente para um dispositivo não composto, exceto por sua localização na pilha de driver.
Um driver cliente para um dispositivo não composto é colocado em camadas diretamente acima do driver do hub.
Para um dispositivo USB composto que expõe várias funções e não tem um driver de classe pai, Windows carrega o driver pai genérico USB (Usbccgp.sys) entre o driver de hub e a camada de driver cliente. O driver pai cria um PDO separado para cada função de um dispositivo composto. Os drivers de cliente (FDOs para funções) são carregados acima do driver pai genérico. Os fornecedores podem optar por fornecer um driver de cliente separado para cada função.
Um driver cliente USB pode ser executado no modo de usuário ou no modo kernel, dependendo dos requisitos do driver. Os drivers de cliente USB podem ser gravados usando rotinas KMDF, UMDF ou WDM.
Bibliotecas auxiliares para drivers cliente
A Microsoft fornece as seguintes bibliotecas auxiliares para ajudar os drivers e aplicativos do modo kernel a se comunicarem com a pilha de drivers USB:
Usbd.sys
A Microsoft fornece a biblioteca Usbd.sys que exporta rotinas para drivers de cliente USB. As rotinas auxiliares simplificam as tarefas operacionais de um driver cliente. Por exemplo, usando as rotinas auxiliares, um driver cliente USB pode criar URBs (Blocos de Solicitação USB) para determinadas operações específicas, como selecionar uma configuração, e enviar esses URBs para a pilha de driver USB.
Usbdex.lib
Essa biblioteca auxiliar é nova para o Windows 8. A biblioteca exporta rotinas principalmente para alocar e construir URBs. Essas rotinas substituem algumas das rotinas herdadas exportadas pelo Usbd.sys. As novas rotinas exigem que o driver cliente se registre na pilha de driver USB, que mantém o identificador para registro. Esse identificador é usado para chamadas para outras rotinas Usbdex.lib. Determinados URBs alocados pelas novas rotinas têm um contexto URB que o driver USB usa para melhor rastreamento e processamento. Para obter mais informações, consulte Alocando e criando URBs.
Winusb.dll
Winusb.dll é uma DLL no modo de usuário que expõe funções WinUSB para comunicação com Winusb.sys, que é carregado como o driver de função de um dispositivo no modo kernel. Os aplicativos usam essas funções para configurar o dispositivo, recuperar informações sobre o dispositivo e executar operações de E/S. Para obter informações sobre como usar essas funções, consulte Como acessar um dispositivo USB usando funções WinUSB.