Compartir a través de


Controlador USB

El controlador de imagen de modo kernel para buses USB admite un único punto de conexión de control, junto con varios puntos de conexión de interrupción, entrada masiva y salida masiva. Los puntos de conexión de control e interrupción son accesibles mediante códigos de control de E/S y DeviceIoControl. Los puntos de conexión masivos son accesibles mediante ReadFile y WriteFile.

Antes de llamar a DeviceIoControl, ReadFile o WriteFile, debe llamar a CreateFile (todo lo descrito en la documentación de Microsoft Windows SDK) para obtener un identificador de dispositivo. En el caso de los dispositivos que no admiten más de uno de cada tipo de punto de conexión (control, interrupción, entrada masiva, salida masiva), una sola llamada a CreateFile abre canalizaciones de transferencia a cada punto de conexión.

En el caso de los dispositivos que admiten varias interrupciones o puntos de conexión masivos, una sola llamada a CreateFile abre canalizaciones de transferencia al punto de conexión con el número más alto de cada tipo. Si desea usar un punto de conexión diferente, debe hacer lo siguiente:

  1. Llame a DeviceIoControl, especificando un código de control de E/S de IOCTL_GET_PIPE_CONFIGURATION, para determinar los números de índice de punto de conexión de un puerto (es decir, los índices en la matriz de estructura de USBSCAN_PIPE_INFORMATION devuelta). Tenga en cuenta que estos números de índice no son los números de punto de conexión descritos en la Especificación de bus serie universal.

  2. Anexe una barra diagonal inversa y el número de índice del punto de conexión al nombre de puerto devuelto por IStiDeviceControl::GetMyDevicePortName al llamar a CreateFile.

Por ejemplo, supongamos que un dispositivo (con un nombre de puerto "usbscan0") tiene dos puntos de conexión de cada tipo (interrupción, ENTRADA masiva, SALIDA masiva), con números de índice como se indica a continuación:

Índice Tipo Extremo#
0 Interrupción 0x01
1 IN masiva 0x82
2 IN masiva 0x83
3 Salida masiva 0x04
4 Salida masiva 0x05
5 Interrupción 0x06

Si llama a CreateFile con un nombre de puerto de "usbscan0", la función abre canalizaciones de transferencia a puntos de conexión con valores de índice de 2, 4 y 5, así como el punto de conexión de control.

Si llama a CreateFile con un nombre de puerto de "usbscan0\1", la función abre canalizaciones de transferencia a puntos de conexión con valores de índice de 1, 4 y 5, así como el punto de conexión de control.

Para este dispositivo, si desea usar el punto de conexión de interrupción 0, el punto de conexión IN masivo 1 y el punto de conexión OUT masivo 3, llame a CreateFile tres veces, especificando nombres de puerto de "usbscan0\0", "usbscan0\1" y "usbscan0\3". Esto crea tres identificadores de dispositivo. Cada vez que se realiza una llamada posterior a DeviceIoControl, ReadFile o WriteFile , se debe especificar el identificador de dispositivo asociado a la canalización deseada.

Dado que solo se admite un punto de conexión de control, especificar cualquier código de control de E/S que use la canalización de control hace que el controlador use el punto de conexión adecuado, independientemente del punto de conexión (si existe) especificado en CreateFile.

Para obtener descripciones de todos los códigos de control de E/S, consulte Códigos de control de E /S de imagen fija USB.

El controlador USB en modo kernel no implementa un paquete ni un protocolo de mensaje. Las operaciones de lectura no requieren ninguna alineación de paquetes determinada, pero se puede lograr un mejor rendimiento si las solicitudes de lectura están alineadas con los límites máximos de tamaño de paquete. El tamaño máximo del paquete se puede obtener mediante el código de control de E/S de IOCTL_GET_CHANNEL_ALIGN_RQST .