USB-Treiber
Der Kernelmodus-Standbildtreiber für USB-Busse unterstützt einen einzelnen Steuerungsendpunkt zusammen mit mehreren Interrupt-, Bulk-IN- und Bulk OUT-Endpunkten. Auf die Steuerungs- und Interruptendpunkte kann über E/A-Steuerungscodes und DeviceIoControl zugegriffen werden. Auf die Massenendpunkte kann mithilfe von ReadFile und WriteFile zugegriffen werden.
Vor dem Aufrufen von DeviceIoControl, ReadFile oder WriteFile müssen Sie CreateFile aufrufen (alles in der Microsoft Windows SDK-Dokumentation beschrieben), um ein Gerätehandle abzurufen. Für Geräte, die nicht mehr als einen einzelnen Endpunkttyp (Control, Interrupt, Bulk IN, Bulk OUT) unterstützen, öffnet ein einzelner Aufruf von CreateFile Übertragungspipes an jeden Endpunkt.
Für Geräte, die mehrere Interrupt- oder Massenendpunkte unterstützen, öffnet ein einzelner Aufruf von CreateFile Übertragungspipes an den Endpunkt mit der höchsten Nummer jedes Typs. Wenn Sie einen anderen Endpunkt verwenden möchten, müssen Sie die folgenden Schritte ausführen:
Rufen Sie DeviceIoControl auf, und geben Sie einen E/A-Steuerungscode von IOCTL_GET_PIPE_CONFIGURATION an, um die Endpunktindexnummern eines Ports zu bestimmen (d. h. Indizes in das zurückgegebene USBSCAN_PIPE_INFORMATION Strukturarray). Beachten Sie, dass diese Indexnummern nicht die Endpunktnummern sind, die in der Spezifikation für den universellen seriellen Bus beschrieben werden.
Fügen Sie einen umgekehrten Schrägstrich und die Indexnummer des Endpunkts an den Portnamen an, der vom IStiDeviceControl::GetMyDevicePortName beim Aufrufen von CreateFile zurückgegeben wird.
Angenommen, ein Gerät (mit dem Portnamen "usbscan0") verfügt über zwei Endpunkte jedes Typs (Interrupt, Bulk IN, Bulk OUT), mit Indexnummern wie folgt:
Index | type | Endpunkt# |
---|---|---|
0 | Interrupt | 0x01 |
1 | Massen-IN | 0x82 |
2 | Massen-IN | 0x83 |
3 | Massenout | 0x04 |
4 | Massenout | 0x05 |
5 | Interrupt | 0x06 |
Wenn Sie CreateFile mit dem Portnamen "usbscan0" aufrufen, öffnet die Funktion Übertragungspipes an Endpunkte mit den Indexwerten 2, 4 und 5 sowie den Steuerungsendpunkt.
Wenn Sie CreateFile mit dem Portnamen "usbscan0\1" aufrufen, öffnet die Funktion Übertragungspipes an Endpunkte mit den Indexwerten 1, 4 und 5 sowie den Steuerungsendpunkt.
Wenn Sie für dieses Gerät Interrupt-Endpunkt 0, Massen-IN-Endpunkt 1 und BulkOUT-Endpunkt 3 verwenden möchten, rufen Sie CreateFile dreimal auf, und geben Sie die Portnamen "usbscan0\0", "usbscan0\1" und "usbscan0\3" an. Dadurch werden drei Gerätehandles erstellt. Bei jedem nachfolgenden Aufruf von DeviceIoControl, ReadFile oder WriteFile sollte das der gewünschten Pipe zugeordnete Gerätehandle angegeben werden.
Da nur ein Steuerelementendpunkt unterstützt wird, bewirkt die Angabe von E/A-Steuerungscode, der die Steuerpipe verwendet, dass der Treiber den richtigen Endpunkt verwendet, unabhängig davon, welcher Endpunkt (falls vorhanden) für CreateFile angegeben wurde.
Beschreibungen aller E/A-Steuercodes finden Sie unter USB-E/A-Steuerungscodes.
Der USB-Treiber im Kernelmodus implementiert kein Paket- oder Nachrichtenprotokoll. Lesevorgänge erfordern keine bestimmte Paketausrichtung, aber eine bessere Leistung kann erzielt werden, wenn Leseanforderungen an die maximalen Paketgrößengrenzen ausgerichtet sind. Die maximale Paketgröße kann mithilfe des IOCTL_GET_CHANNEL_ALIGN_RQST E/A-Steuerungscodes abgerufen werden.