Konfigurieren von USB-Endpunkten in einem USB-Hostcontrollertreiber
UCX verwaltet die Erstellung von Endpunktobjekten und benachrichtigt den Hostcontroller, Endpunkte im USB-Hostcontroller zu programmieren oder zu deprogrammieren.
Während ein Endpunkt programmiert ist, wird er auch von UCX verwaltet. Der Status eines Endpunkts ändert sich, wenn Geräte mit dem Bus verbunden sind und die Verbindung vom Bus trennen, Energieereignisse wie Anhalten und Zurücksetzen auftreten und neue Endpunkte erstellt werden, z. B. Änderungen alternativer Einstellungen.
Endpunktkonfiguration
UCX ruft Rückruffunktionen auf, die vom Hostcontrollertreiber implementiert werden, um den Treiber zu benachrichtigen, wenn Endpunkte in den USB-Hostcontroller programmiert oder freigegeben werden müssen. Wenn EVT_UCX_USBDEVICE_ENABLE aufgerufen wird, bereitet der Treiber den Controller für die Übertragung an den Standardendpunkt des Geräts vor. Zum Vorbereiten des Controllers gehört die Programmierung des Standardendpunkts. Wenn EVT_UCX_USBDEVICE_DISABLE aufgerufen wird, entprogrammiert der Treiber den Standardendpunkt und gibt andere Controllerressourcen frei, die dem Gerät zugeordnet sind. Wenn EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE aufgerufen wird, erhält der Treiber eine Liste nicht standardmäßiger Endpunkte, die in den Controller programmieren sollen, und eine weitere Liste mit nicht standardmäßigen Endpunkten, die aus dem Controller entfernt werden sollen. Der Hostcontrollertreiber programmiert dann die angegebenen nicht standardmäßigen Endpunkte in den Controller und entfernt auch die nicht standardmäßigen Endpunkte (in der anderen Liste angegeben) aus dem Controller.
Warteschlangenstatusverwaltung
UCX ruft Rückruffunktionen auf, die vom Hostcontrollertreiber implementiert werden, um Änderungen am Endpunktwarteschlangenstatus durchzuführen. Der Treiber führt dann die entsprechende Aktion für die Endpunktwarteschlange aus, die UCX zugewiesen wurde, und für alle Warteschlangen der zweiten Ebene, die innerhalb des Treibers verwaltet werden. Endpunktwarteschlangen werden in diesen Szenarien abgebrochen oder gelöscht:
- Der USB-Geräteclienttreiber sendet eine URB_FUNCTION_ABORT_PIPE Anforderung.
- Während des Anhaltens.
- Wenn der Hub, an den ein Gerät angeschlossen ist, eine Gerätetrennung erkennt.
- Während einer Einstellungsanforderung für die Auswahlschnittstelle.
Um den Hostcontrollertreiber über einen Abbruch oder eine Löschung der Warteschlange zu benachrichtigen, ruft UCX EVT_UCX_ENDPOINT_ABORT oder EVT_UCX_ENDPOINT_PURGE auf. Wenn zu einem späteren Zeitpunkt die Endpunktwarteschlange von UCX benötigt wird, ruft UCX den EVT_UCX_ENDPOINT_START Rückruf auf, um den Treiber zu benachrichtigen, die Warteschlange zu starten.
Abbruch der Übertragung
Für jeden Controller, für den der Hostcontrollertreiber GUID_USB_CAPABILITY_CLEAR_TT_BUFFER_ON_ASYNC_TRANSFER_CANCEL deklariert, muss der Treiber UcxEndpointNeedToCancelTransfers aufrufen und EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS implementieren, um asynchrone USB-Übertragungen (Bulk oder Control) an ein USB-Gerät mit voller oder niedriger Geschwindigkeit abzubrechen, das sich hinter einem Tt-Hub (Transaction Translator) befindet. In allen anderen Fällen kann der Treiber optional UcxEndpointNeedToCancelTransfers aufrufen, um eine EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS Benachrichtigung zu erhalten, die angibt, dass das Abbrechen von Übertragungen für diesen Endpunkt zulässig ist und der Treiber die Übertragungen abbrechen kann. Alternativ kann der Treiber Übertragungen direkt abbrechen, ohne UcxEndpointNeedToCancelTransfers aufzurufen.
Wenn der Hostcontrollertreiber die Anforderung für diese GUID immer fehlschlägt, kann er diese beiden Funktionsaufrufe vollständig ignorieren.
Wenn der Treiber nie UcxEndpointNeedToCancelTransfers aufruft, wird der EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS Rückruf des Treibers nicht aufgerufen und kann während der Rückrufregistrierung NULL sein.
Wenn der Treiber UcxEndpointNeedToCancelTransfers verwenden möchte, muss der Treiber die Methode aufrufen, wenn eine Übertragung in den Controller programmiert und dann abgebrochen wurde, und wartet dann auf EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS , bevor er sie abgeschlossen hat.