Compartilhar via


Driver USB

O driver de imagem ainda no modo kernel para barramentos USB dá suporte a um único ponto de extremidade de controle, juntamente com vários pontos de extremidade de interrupção, BULK IN e BULK OUT. Os pontos de extremidade de controle e interrupção são acessíveis usando códigos de controle de E/S e DeviceIoControl. Os pontos de extremidade em massa são acessíveis usando ReadFile e WriteFile.

Antes de chamar DeviceIoControl, ReadFile ou WriteFile, você deve chamar CreateFile (tudo descrito na documentação do SDK do Microsoft Windows) para obter um identificador de dispositivo. Para dispositivos que dão suporte a não mais de um de cada tipo de ponto de extremidade (controle, interrupção, bulk IN, bulk OUT), uma única chamada para CreateFile abre pipes de transferência para cada ponto de extremidade.

Para dispositivos que dão suporte a vários pontos de extremidade de interrupção ou em massa, uma única chamada para CreateFile abre os pipes de transferência para o ponto de extremidade com maior número de cada tipo. Se você quiser usar um ponto de extremidade diferente, deverá fazer o seguinte:

  1. Chame DeviceIoControl, especificando um código de controle de E/S de IOCTL_GET_PIPE_CONFIGURATION, para determinar os números de índice do ponto de extremidade de uma porta (ou seja, índices na matriz de estrutura USBSCAN_PIPE_INFORMATION retornada). Observe que esses números de índice não são os números de ponto de extremidade descritos na Especificação universal do barramento serial.

  2. Acrescente uma barra invertida e o número de índice do ponto de extremidade ao nome da porta retornado por IStiDeviceControl::GetMyDevicePortName ao chamar CreateFile.

Por exemplo, suponha que um dispositivo (com um nome de porta de "usbscan0") tenha dois pontos de extremidade de cada tipo (interrupção, bulk IN, bulk OUT), com números de índice da seguinte maneira:

Índice Type Extremidade#
0 Interrupção 0x01
1 Bulk IN 0x82
2 Bulk IN 0x83
3 Bulk OUT 0x04
4 Bulk OUT 0x05
5 Interrupção 0x06

Se você chamar CreateFile com um nome de porta de "usbscan0", a função abrirá pipes de transferência para pontos de extremidade com valores de índice de 2, 4 e 5, bem como o ponto de extremidade de controle.

Se você chamar CreateFile com um nome de porta de "usbscan0\1", a função abrirá pipes de transferência para pontos de extremidade com valores de índice de 1, 4 e 5, bem como o ponto de extremidade de controle.

Para este dispositivo, se você quiser usar o ponto de extremidade de interrupção 0, o ponto de extremidade bulk IN 1 e o ponto de extremidade bulk OUT 3, chame CreateFile três vezes, especificando nomes de porta de "usbscan0\0", "usbscan0\1" e "usbscan0\3". Isso cria três identificadores de dispositivo. Sempre que uma chamada subsequente para DeviceIoControl, ReadFile ou WriteFile for feita, o identificador do dispositivo associado ao pipe desejado deverá ser especificado.

Como há suporte apenas para um ponto de extremidade de controle, especificar qualquer código de controle de E/S que use o pipe de controle faz com que o driver use o ponto de extremidade adequado, independentemente de qual ponto de extremidade (se houver) foi especificado para CreateFile.

Para obter descrições de todos os códigos de controle de E/S, consulte Códigos de controle de E/S de Imagem Ainda USB.

O driver USB no modo kernel não implementa um pacote ou protocolo de mensagem. As operações de leitura não exigem nenhum alinhamento de pacote específico, mas um melhor desempenho pode ser obtido se as solicitações de leitura estiverem alinhadas aos limites máximos de tamanho do pacote. O tamanho máximo do pacote pode ser obtido usando o código de controle de E/ S IOCTL_GET_CHANNEL_ALIGN_RQST .