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:
- Criando um objeto de dispositivo USB
- Configurando um dispositivo USB
- Obtendo informações do dispositivo
- Obtendo descritores USB
- Enviando uma transferência de controle
- Redefinindo e Power-Cycling porta de um dispositivo
- Enviar um URB para um dispositivo
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:
- Como selecionar uma configuração para um dispositivo USB
- Como selecionar uma configuração alternativa em uma interface USB
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.