Condividi tramite


Driver USB

Il driver di immagine in modalità kernel per gli autobus USB supporta un singolo endpoint di controllo, insieme a più interruzioni, bulk IN e endpoint OUT bulk. Gli endpoint di controllo e di interruzione sono accessibili usando i codici di controllo I/O e DeviceIoControl. Gli endpoint bulk sono accessibili usando ReadFile e WriteFile.

Prima di chiamare DeviceIoControl, ReadFile o WriteFile, è necessario chiamare CreateFile (tutto descritto nella documentazione di Microsoft Windows SDK) per ottenere un handle del dispositivo. Per i dispositivi che supportano non più di un tipo di endpoint (controllo, interruzione, blocco IN, bulk OUT), una singola chiamata a CreateFile apre i pipe di trasferimento a ogni endpoint.

Per i dispositivi che supportano più endpoint di interruzione o bulk, una singola chiamata a CreateFile apre i pipe di trasferimento all'endpoint numerato più alto di ogni tipo. Se si vuole usare un endpoint diverso, è necessario eseguire le operazioni seguenti:

  1. Chiamare DeviceIoControl, specificando un codice di controllo I/O di IOCTL_GET_PIPE_CONFIGURATION, per determinare i numeri di indice dell'endpoint di una porta, ovvero indici nella matrice di struttura USBSCAN_PIPE_INFORMATION restituita. Si noti che questi numeri di indice non sono i numeri di endpoint descritti nella specifica del bus seriale universale.

  2. Aggiungere una barra rovesciata e il numero di indice dell'endpoint al nome della porta restituito da IStiDeviceControl::GetMyDevicePortName quando si chiama CreateFile.

Si supponga, ad esempio, che un dispositivo (con un nome di porta "usbscan0") abbia due endpoint di ogni tipo (interrupt, bulk IN, bulk OUT), con numeri di indice come indicato di seguito:

Indice Tipo Endpoint#
0 Interrompere 0x01
1 Bulk IN 0x82
2 Bulk IN 0x83
3 Bulk OUT 0x04
4 Bulk OUT 0x05
5 Interrompere 0x06

Se si chiama CreateFile con un nome di porta "usbscan0", la funzione apre i pipe di trasferimento agli endpoint con valori di indice pari a 2, 4 e 5, nonché all'endpoint di controllo.

Se si chiama CreateFile con un nome di porta "usbscan0\1", la funzione apre i pipe di trasferimento agli endpoint con valori di indice pari a 1, 4 e 5, nonché all'endpoint di controllo.

Per questo dispositivo, se si vuole usare l'endpoint di interruzione 0, l'endpoint IN blocco 1 e l'endpoint OUT bulk 3, chiamare CreateFile tre volte, specificando i nomi delle porte "usbscan0\0", "usbscan0\1" e "usbscan0\3". In questo modo vengono creati tre handle di dispositivo. Ogni volta che viene effettuata una chiamata successiva a DeviceIoControl, ReadFile o WriteFile, è necessario specificare l'handle del dispositivo associato alla pipe desiderata.

Poiché è supportato un solo endpoint di controllo, specificando qualsiasi codice di controllo di I/O che usa la pipe di controllo causa l'uso dell'endpoint appropriato, indipendentemente dall'endpoint (se presente) specificato in CreateFile.

Per le descrizioni di tutti i codici di controllo di I /O, vedere Codici di controllo I/O dell'immagine continua USB.

Il driver USB in modalità kernel non implementa un pacchetto o un protocollo di messaggio. Le operazioni di lettura non richiedono un particolare allineamento dei pacchetti, ma è possibile ottenere prestazioni migliori se le richieste di lettura sono allineate ai limiti massimi delle dimensioni dei pacchetti. È possibile ottenere le dimensioni massime dei pacchetti usando il codice di controllo di I /O IOCTL_GET_CHANNEL_ALIGN_RQST.