Drivers do lado do host USB no Windows

Este artigo fornece uma visão geral da arquitetura da pilha de driver do Barramento Serial Universal (USB).

A figura a seguir mostra o diagrama de bloco de arquitetura da pilha de driver USB para Windows. O diagrama mostra pilhas de driver USB separadas para USB 2.0 e USB 3.0. O Windows carrega a pilha de driver USB 3.0 quando um dispositivo é anexado a um controlador xHCI.

Diagrama de bloco de arquitetura para pilhas de driver USB 2.0 e 3.0.

O Windows carrega a pilha de driver USB 2.0 para dispositivos anexados a controladores eHCI, oHCI ou uHCI. A pilha de driver USB 2.0 é fornecida no Windows XP com o Service Pack 1 (SP1) e versões posteriores do sistema operacional Windows.

Pilha de driver 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 hospedar estruturas de dados baseadas em memória para hardware do controlador xHCI, mapear solicitações de transferência de drivers de camada superior para Transferir Blocos de Solicitação e enviar as solicitações para o 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 do driver. Ele também controla os slots de dispositivo do controlador xHCI e os contextos de ponto de extremidade.

O Windows carrega o driver xHCI como o FDO (objeto do dispositivo de função) na pilha do dispositivo 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 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 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 abstraída comum para o driver do hub, fornece um mecanismo genérico para enfileirar solicitações para o driver do controlador host e substitui determinadas funções selecionadas. Todas as solicitações de E/S iniciadas por drivers superiores atingem 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 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 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 do 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 do hub executa principalmente estas tarefas:

  • Gerencia hubs USB e suas portas.
  • Enumera dispositivos e outros hubs anexados às portas downstream.
  • Cria PDOs (objetos de dispositivo físico) para os dispositivos e hubs enumerados.

O Windows carrega o driver do hub como o FDO na pilha de dispositivos do hub. A enumeração do dispositivo e o gerenciamento de hub no novo driver são implementados por meio de um conjunto de computadores de estado. O driver do hub depende do KMDF para o gerenciamento de energia e funções PnP. Além do gerenciamento de hub, o driver do hub também executa verificações preliminares e processamento de determinadas solicitações enviadas pela camada de driver do cliente USB. Por exemplo, o driver do hub analisa uma solicitação de configuração de seleção 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 driver USB 2.0

O Windows carrega a pilha de driver USB 2.0 para dispositivos anexados a controladores eHCI, oHCI ou uHCI. Os drivers na pilha de driver USB 2.0 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 do driver USB está o driver do controlador de host. Ele consiste no driver de porta, Usbport.sys e um ou mais dos três miniportores 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 miniporte, depois de carregado, carrega o driver de porta, Usbport.sys. O driver de porta lida com esses aspectos das tarefas do driver do controlador de host que são independentes do protocolo específico.

O driver de miniporte Usbuhci.sys (interface do controlador de host universal) substitui o driver de miniclasse Uhcd.sys fornecido pelo Windows 2000. O driver de miniporte Usbohci.sys (interface do controlador de host aberto) substitui Openhci.sys. O driver de miniporto Usbehci.sys dá suporte a dispositivos USB de alta velocidade e foi introduzido no Windows XP com SP1 e posterior e windows server 2003 e sistemas operacionais posteriores.

Em todas as versões do Windows que dão suporte ao 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 miniporte 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 de porta está o motorista do ônibus USB, Usbhub.sys, também conhecido como o driver do hub. Esse é 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 do 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 (Modelo de Driver do Windows).

O driver composto pai enumera todas as funções em um dispositivo composto e cria um PDO para cada uma delas. Isso faz com que a classe apropriada ou o driver do cliente sejam carregados para cada função no dispositivo. Cada PDO (driver de função filho) envia solicitações para o 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. Em Windows 8, o driver foi atualizado para implementar recursos de suspensão de função e de 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 do WinUSB consiste em um driver no modo kernel (Winusb.sys) e uma biblioteca de links dinâmicos 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 do modo kernel do dispositivo como o driver de função. Os processos de 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 WinUSB.

Em 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 de cliente USB

Cada dispositivo USB, composto ou não composto, é gerenciado por um driver cliente. Um driver de cliente USB é um driver de classe ou 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 for the Supported USB Device Classes. Um driver cliente cria solicitações para se comunicar com o dispositivo chamando interfaces públicas expostas pela pilha de driver 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 driver.

Um driver de cliente para um dispositivo não composto está 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 do hub e a camada do driver do cliente. O driver pai cria um PDO separado para cada função de um dispositivo composto. Os FDOs (drivers de cliente 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 de cliente

A Microsoft fornece as seguintes bibliotecas auxiliares para ajudar os drivers e aplicativos do modo kernel a se comunicarem com a pilha de driver 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 de 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 Windows 8. A biblioteca exporta rotinas principalmente para alocar e criar URBs. Essas rotinas substituem algumas das rotinas herdadas exportadas por 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 acompanhamento 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 do WinUSB para se comunicar com Winusb.sys, que é carregada 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.