Partilhar via


Trabalhando com dispositivos USB

Este tópico descreve as operações que um driver KMDF (Kernel-Mode Driver Framework) ou um driver da UMDF (User-Mode Driver Framework) a partir da versão 2 pode executar usando os métodos de objeto de dispositivo USB fornecidos pelo WDF (Windows Driver Frameworks).

Ele contém as seções a seguir:

Para obter instruções passo a passo sobre como escrever um driver de cliente USB baseado em KMDF simples, consulte Como escrever seu primeiro driver de cliente USB (KMDF).

Criando um objeto de dispositivo USB

Para usar os objetos de destino de E/S USB da estrutura (WDFUSBDEVICE, WDFUSBINTERFACE e WDFUSBPIPE), o driver cliente deve primeiro chamar WdfUsbTargetDeviceCreateWithParameters para criar um objeto de dispositivo USB. Normalmente, um driver chama WdfUsbTargetDeviceCreateWithParameters de sua função de retorno de chamada EvtDevicePrepareHardware .

Quando o driver chama WdfUsbTargetDeviceCreateWithParameters, a estrutura cria um objeto WDFUSBDEVICE e o associa ao FDO que representa o dispositivo USB. O método retorna um identificador para o novo objeto de dispositivo USB de estrutura que o driver cliente USB pode usar para se comunicar com o dispositivo físico.

Depois de chamar WdfUsbTargetDeviceCreateWithParameters, o driver pode chamar WdfUsbTargetDeviceGetDeviceDescriptor e WdfUsbTargetDeviceRetrieveConfigDescriptor para obter descritores USB do dispositivo. Esses descritores contêm informações sobre a primeira configuração do dispositivo, suas configurações de interface e seus pontos de extremidade definidos. (Os descritores USB são definidos na especificação usb oficial.)

Configurando um dispositivo USB

O método WdfUsbTargetDeviceCreateWithParameters também cria um objeto de interface USB de estrutura para cada interface USB que a primeira configuração do dispositivo contém.

Depois de chamar WdfUsbTargetDeviceCreateWithParameters, o driver cliente deve chamar WdfUsbTargetDeviceSelectConfig para selecionar uma configuração. Esse método cria objetos de interface de estrutura para cada configuração alternativa da interface na configuração selecionada.

O método também cria objetos de pipe que representam pontos de extremidade definidos em cada configuração alternativa de cada interface da configuração selecionada.

Depois de selecionar uma configuração, você pode alterar as configurações alternativas para as interfaces da configuração, se necessário.

Você também pode chamar WdfUsbTargetDeviceSelectConfig para desconfigrar um dispositivo.

Para obter informações relacionadas. consulte:

Obtendo informações do dispositivo

Depois de configurar um dispositivo, o driver cliente pode chamar os seguintes métodos para obter informações sobre um dispositivo USB:

WdfUsbTargetDeviceQueryUsbCapability
Determina se o controlador de host e a pilha de driver USB dão suporte a uma funcionalidade específica. Antes de chamar WdfUsbTargetDeviceQueryUsbCapability, um driver deve chamar WdfUsbTargetDeviceCreateWithParameters.

WdfUsbTargetDeviceGetIoTarget
Retorna um identificador para o objeto de destino de E/S associado a um dispositivo USB. O driver pode passar esse identificador para WdfRequestSend ou WdfIoTargetStop.

WdfUsbTargetDeviceRetrieveInformation
Recupera informações de versão e funcionalidade associadas a um dispositivo USB.

WdfUsbTargetDeviceIsConnectedSynchronous (somente KMDF)
Determina se o dispositivo está conectado.

WdfUsbTargetDeviceRetrieveCurrentFrameNumber (somente KMDF)
Recupera o número do quadro USB atual.

Obtendo descritores USB

Para obter as cadeias de caracteres Unicode contidas nos descritores de um dispositivo USB, o driver pode chamar qualquer um dos seguintes métodos:

WdfUsbTargetDeviceGetDeviceDescriptor
Obtém o descritor de dispositivo USB de um dispositivo.

WdfUsbTargetDeviceRetrieveConfigDescriptor
Obtém o descritor de configuração USB de um dispositivo, descritores de interface e descritores de ponto de extremidade.

WdfUsbTargetDeviceQueryString
Copia uma cadeia de caracteres Unicode para um buffer fornecido pelo driver.

WdfUsbTargetDeviceAllocAndQueryString
Copia uma cadeia de caracteres Unicode para um buffer fornecido pela estrutura.

WdfUsbTargetDeviceFormatRequestForString
Formata uma solicitação para uma cadeia de caracteres Unicode. O driver pode chamar WdfRequestSend para enviar a solicitação de forma síncrona ou assíncrona.

Enviando uma transferência de controle

Seu driver pode chamar os métodos a seguir para enviar uma solicitação de E/S que descreve uma transferência de controle USB padrão, específica da classe de dispositivo ou específica do fornecedor.

WdfUsbTargetDeviceSendControlTransferSynchronously
Envia de forma síncrona uma solicitação de transferência de controle USB.

WdfUsbTargetDeviceFormatRequestForControlTransfer
Formata uma solicitação para uma transferência de controle USB. O driver pode chamar WdfRequestSend para enviar a solicitação de forma síncrona ou assíncrona.

Para obter informações relacionadas, consulte Como enviar uma transferência de controle USB.

Redefinindo e Power-Cycling porta de um dispositivo

O driver pode chamar os seguintes métodos para redefinir ou fazer o ciclo de energia da porta USB à qual um dispositivo está conectado:

WdfUsbTargetDeviceResetPortSynchronously
Envia de forma síncrona uma solicitação para redefinir a porta USB de um dispositivo.

WdfUsbTargetDeviceCyclePortSynchronously (somente KMDF)
Envia de forma síncrona uma solicitação para o ciclo de energia da porta USB de um dispositivo.

WdfUsbTargetDeviceFormatRequestForCyclePort (somente KMDF)
Formata uma solicitação para o ciclo de energia da porta USB de um dispositivo. O driver deve chamar WdfRequestSend para enviar a solicitação de forma síncrona ou assíncrona.

Para obter informações relacionadas, consulte Como se recuperar de erros de pipe USB.

Enviar um URB para um dispositivo

Se o driver KMDF se comunicar com seu dispositivo USB enviando solicitações de E/S que contenham URBs, o driver poderá chamar os seguintes métodos:

WdfUsbTargetDeviceCreateUrb (somente KMDF)
Aloca um URB (bloco de solicitação USB). Antes de chamar WdfUsbTargetDeviceCreateUrb, um driver deve chamar WdfUsbTargetDeviceCreateWithParameters.

WdfUsbTargetDeviceCreateIsochUrb (somente KMDF)
Aloca um URB (bloco de solicitação USB) isócrono. Antes de chamar WdfUsbTargetDeviceCreateIsochUrb, um driver deve chamar WdfUsbTargetDeviceCreateWithParameters.

WdfUsbTargetDeviceSendUrbSynchronously (somente KMDF)
Envia de forma síncrona uma solicitação de E/S que contém um URB.

WdfUsbTargetDeviceFormatRequestForUrb (somente KMDF)
Formata uma solicitação de E/S que contém um URB. O driver deve chamar WdfRequestSend para enviar a solicitação de forma síncrona ou assíncrona.

WdfUsbTargetDeviceWdmGetConfigurationHandle (somente KMDF)
Retorna o identificador de configuração USBD de um dispositivo. Alguns URBs exigem esse identificador.

Para obter informações gerais conceituais sobre URBs, consulte Alocando e criando URBs.