Pilote USB
Le pilote d’image fixe en mode noyau pour les bus USB prend en charge un point de terminaison de contrôle unique, ainsi que plusieurs points de terminaison d’interruption, d’IN en bloc et de sortie en bloc. Les points de terminaison de contrôle et d’interruption sont accessibles à l’aide des codes de contrôle d’E/ S et de DeviceIoControl. Les points de terminaison en bloc sont accessibles à l’aide de ReadFile et WriteFile.
Avant d’appeler DeviceIoControl, ReadFile ou WriteFile, vous devez appeler CreateFile (tous décrits dans la documentation Microsoft Windows SDK) pour obtenir un handle d’appareil. Pour les appareils qui ne prennent pas en charge plusieurs de chaque type de point de terminaison (contrôle, interruption, ENTRÉE en bloc, OUT en bloc), un seul appel à CreateFile ouvre des canaux de transfert vers chaque point de terminaison.
Pour les appareils qui prennent en charge plusieurs points de terminaison d’interruption ou en bloc, un seul appel à CreateFile ouvre des canaux de transfert vers le point de terminaison le plus numéroté de chaque type. Si vous souhaitez utiliser un autre point de terminaison, vous devez effectuer les opérations suivantes :
Appelez DeviceIoControl, en spécifiant un code de contrôle d’E/S de IOCTL_GET_PIPE_CONFIGURATION, pour déterminer les numéros d’index du point de terminaison d’un port (c’est-à-dire les index dans le tableau de structure USBSCAN_PIPE_INFORMATION retourné). Notez que ces numéros d’index ne sont pas les numéros de point de terminaison décrits dans la spécification du bus série universel.
Ajoutez une barre oblique inverse et le numéro d’index du point de terminaison au nom de port retourné par IStiDeviceControl ::GetMyDevicePortName lors de l’appel de CreateFile.
Par exemple, supposons qu’un appareil (dont le nom de port est « usbscan0 ») possède deux points de terminaison de chaque type (interruption, entrée en bloc, sortie en bloc), avec les numéros d’index comme suit :
Index | Type | Terminaison# |
---|---|---|
0 | Interruption | 0x01 |
1 | Entrée en bloc | 0x82 |
2 | Entrée en bloc | 0x83 |
3 | Out en bloc | 0x04 |
4 | Out en bloc | 0x05 |
5 | Interruption | 0x06 |
Si vous appelez CreateFile avec un nom de port « usbscan0 », la fonction ouvre les canaux de transfert vers les points de terminaison avec des valeurs d’index de 2, 4 et 5, ainsi que le point de terminaison de contrôle.
Si vous appelez CreateFile avec un nom de port « usbscan0\1 », la fonction ouvre des canaux de transfert vers les points de terminaison avec des valeurs d’index de 1, 4 et 5, ainsi que le point de terminaison de contrôle.
Pour cet appareil, si vous souhaitez utiliser le point de terminaison d’interruption 0, le point de terminaison IN en bloc 1 et le point de terminaison OUT en bloc 3, appelez CreateFile trois fois, en spécifiant les noms de port « usbscan0\0 », « usbscan0\1 » et « usbscan0\3 ». Cela crée trois handles d’appareil. Chaque fois qu’un appel ultérieur à DeviceIoControl, ReadFile ou WriteFile est effectué, le handle d’appareil associé au canal souhaité doit être spécifié.
Étant donné qu’un seul point de terminaison de contrôle est pris en charge, si vous spécifiez un code de contrôle qui utilise le canal de contrôle, le pilote utilise le point de terminaison approprié, quel que soit le point de terminaison (le cas échéant) qui a été spécifié dans CreateFile.
Pour obtenir une description de tous les codes de contrôle d’E/S, consultez Codes de contrôle d’E/S d’image fixe USB.
Le pilote USB en mode noyau n’implémente pas de package ou de protocole de message. Les opérations de lecture ne nécessitent pas d’alignement de paquets particulier, mais de meilleures performances peuvent être obtenues si les demandes de lecture sont alignées sur les limites de taille de paquet maximale. La taille maximale des paquets peut être obtenue à l’aide du code de contrôle d’E /S IOCTL_GET_CHANNEL_ALIGN_RQST.