Partilhar via


Drivers USB do lado do host no Windows

Este artigo fornece uma visão geral da arquitetura da pilha de drivers USB (Universal Serial Bus).

A figura a seguir mostra o diagrama de blocos arquitetônicos da pilha de drivers USB para Windows. O diagrama mostra camadas de drivers USB separadas para USB 2.0 e USB 3.0. O sistema Windows carrega a pilha de controladores USB 3.0 quando um dispositivo é ligado a um controlador xHCI.

Diagrama de blocos arquitetônicos para pilhas de drivers USB 2.0 e 3.0.

O Windows carrega a pilha de drivers USB 2.0 para dispositivos conectados aos controladores eHCI, oHCI ou uHCI. A pilha de drivers USB 2.0 vem incluída no Windows XP com o Service Pack 1 (SP1) e versões posteriores do sistema operativo 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 host USB 3.0 (Usbxhci.sys)

O driver xHCI é o driver do controlador host USB 3.0. As responsabilidades do driver xHCI incluem inicializar os registos MMIO e as estruturas de dados baseadas na memória do host para o hardware do controlador xHCI, mapear as solicitações de transferência dos drivers de camada superior para os Blocos de Solicitação de Transferência e submeter as solicitações ao hardware. Depois de concluir uma transferência, o driver lida com eventos de conclusão de transferência do hardware e propaga os eventos pela stack de drivers. Ele também controla os slots de dispositivos do controlador xHCI e os contextos de endpoint.

O sistema operativo Windows carrega o controlador de dispositivo xHCI como o objecto de dispositivo funcional (FDO) na pilha de dispositivos para o controlador anfitrião.

Extensão do controlador host USB (Ucx01000.sys)

O driver de extensão do controlador host USB (uma extensão para KMDF) é a nova extensão para o driver de controlador de host específico da classe subjacente, como o driver xHCI. O novo driver é extensível e foi projetado para suportar outros tipos de drivers de controlador host que devem ser desenvolvidos no futuro. A extensão para o controlador host USB serve como uma interface abstrata comum para o driver do hub, fornece um mecanismo genérico para gerir filas de solicitações para o driver do controlador host e substitui algumas funções específicas. Todas as solicitações de E/S iniciadas por drivers superiores chegam ao driver de extensão do controlador anfitrião antes do driver xHCI. Ao receber uma solicitação de E/S, a extensão do controlador host valida a solicitação e, em seguida, encaminha a solicitação para a fila KMDF adequada 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 host USB são:

  • Fornece objetos específicos de USB para o driver xHCI.
  • Fornece rotinas de retorno de chamada de eventos KMDF para o driver xHCI.
  • Gerencia e controla as operações do hub raiz associado ao controlador host.
  • Implementa recursos que são configuráveis pelo driver do cliente, como MDLs encadeadas, fluxos e assim por diante.

Driver de hub USB (Usbhub3.sys)

O novo driver de hub, na pilha de drivers 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 objetos de dispositivo físico (PDOs) para os dispositivos enumerados e hubs.

O Windows carrega o driver de hub como o FDO na pilha de dispositivos de 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 do hub depende do KMDF para a gestão de energia e funções PnP. Além do gerenciamento do hub, o driver do hub também realiza verificações preliminares e processamento de determinadas solicitações enviadas pela camada de driver do cliente USB. Por exemplo, o driver de hub interpreta um pedido de configuração de seleção para determinar quais endpoints serão configurados pelo pedido. Depois de analisar as informações, o driver do hub envia a solicitação para a extensão do controlador anfitrião USB para processamento adicional.

Pilha de drivers USB 2.0

O Windows carrega a pilha de drivers 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. O stack de drivers USB 2.0 foi projetado para suportar dispositivos USB de alta velocidade conforme definido na especificação USB 2.0.

Na parte inferior da pilha de drivers USB está o driver do controlador host. Ele consiste no driver de porta, Usbport.syse um ou mais de três drivers de miniporta que são executados simultaneamente. Quando o sistema deteta o hardware do controlador host, ele carrega um desses drivers de miniporta. O driver de miniporta, depois de carregado, carrega o driver de porta, Usbport.sys. O driver de porta lida com os aspectos das tarefas do driver do controlador host que são independentes do protocolo específico.

O driver de miniporta Usbuhci.sys (interface de controlador de host universal) substitui o driver de miniclasse Uhcd.sys fornecido com o Windows 2000. O driver de miniporta Usbohci.sys (Open Host Controller Interface) substitui Openhci.sys. O driver de miniporta Usbehci.sys suporta 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 host USB 1.1 e USB 2.0 simultaneamente. Sempre que o sistema operacional deteta que ambos os tipos de controlador estão presentes, ele cria dois nós de dispositivo separados, um para cada controlador host. Subsequentemente, o Windows carrega o driver de miniporta Usbehci.sys para o hardware do controlador 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 de barramento USB, Usbhub.sys, também conhecido como driver de hub. Este é o driver de dispositivo para cada hub no sistema.

Driver genérico pai de classe comum USB (Usbccgp.sys)

O controlador genérico padrão para USB é o controlador 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 de dispositivo. O driver do hub gera o 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 num dispositivo composto e cria um PDO para cada uma. Faz com que a classe apropriada ou o driver de cliente seja carregado para cada função no dispositivo. Cada controlador de função (PDO filho) envia solicitações para o controlador pai, que as envia para o controlador de 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 USB Generic Parent Driver (Usbccgp.sys).

WinUSB (Winusb.sys)

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 de modo de usuário (Winusb.dll). Para dispositivos que não exigem um driver de função personalizado, Winusb.sys pode ser instalado na stack no modo kernel do dispositivo como o driver de função. Os processos de modo de usuário podem então se comunicar com Winusb.sys usando um conjunto de solicitações de controle de E/S do dispositivo ou chamando WinUsb_Xxx funções. Para obter mais informações, consulte Introdução ao WinUSB para desenvolvedores.

No Windows 8, o arquivo de informações fornecidas pela Microsoft (INF) para WinUSB, Winusb.inf, contém USB\MS_COMP_WINUSB como uma cadeia de caracteres de identificador de dispositivo. Isso permite que Winusb.sys seja carregado automaticamente como o driver de função para os dispositivos que têm um ID compatível com WinUSB correspondente no descritor MS OS. 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 de cliente USB

Cada dispositivo USB, composto ou não composto, é gerenciado por um driver de cliente. Um controlador cliente USB é uma classe ou controlador de dispositivo que é cliente da pilha de controladores USB. Esses drivers incluem drivers de classe e de dispositivo específicos, fornecidos pela Microsoft ou por um fornecedor de terceiros. Para ver uma lista de drivers de classe fornecidos pela Microsoft, consulte Drivers para as classes de dispositivo USB suportadas. Um controlador de cliente cria solicitações para se comunicar com o dispositivo chamando interfaces públicas expostas pelo controlador USB.

Um driver de cliente para um dispositivo composto não é diferente de um driver de cliente para um dispositivo não composto, exceto por sua localização na pilha de drivers.

Um driver de 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, o Windows carrega o driver pai genérico USB (Usbccgp.sys) entre o driver de hub e a camada de driver do cliente. O driver pai cria um PDO separado para cada função de um dispositivo composto. Os controladores para clientes (FDOs para funções) são carregados por cima do controlador pai genérico. Os fornecedores podem optar por fornecer um driver de cliente separado para cada função.

Um driver de 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 controladores do cliente

A Microsoft fornece as seguintes bibliotecas auxiliares para ajudar os drivers e aplicativos de modo kernel a se comunicarem com a pilha de drivers USB:

  • Usbd.sys

    A Microsoft fornece a biblioteca de Usbd.sys que exporta rotinas para drivers de cliente USB. As rotinas auxiliares simplificam as tarefas operacionais de um motorista cliente. Por exemplo, usando as rotinas auxiliares, um driver de cliente USB pode criar blocos de solicitação USB (URBs) para determinadas operações específicas, como selecionar uma configuração, e enviar esses URBs para a pilha de drivers USB.

  • Usbdex.lib

    Esta biblioteca auxiliar é nova para o Windows 8. A biblioteca exporta rotinas principalmente para a alocação e construção de URBs. Essas rotinas substituem algumas das rotinas legadas exportadas por Usbd.sys. As novas rotinas exigem que o driver do cliente se registe na pilha de drivers USB, que mantém o identificador para o registo. Esse identificador é usado para chamadas para outras rotinas Usbdex.lib. Alguns URBs alocados pelas novas rotinas possuem um contexto de URB que o driver USB utiliza para melhorar o rastreamento e o processamento. Para obter mais informações, consulte Alocação e construção de URBs.

  • Winusb.dll

    Winusb.dll é uma DLL de modo utilizador que expõe funções WinUSB para comunicação com Winusb.sys, que é carregado como driver de função de um dispositivo no modo núcleo. 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.