Schreiben eines USB-Typ-C-Anschlusstreibers

In diesen Szenarien müssen Sie einen USB-Typ-C-Anschlusstreiber schreiben:

  • Wenn Ihre USB Typ-C-Hardware über die Möglichkeit verfügt, den PD-Zustandscomputer (Power Delivery) zu verarbeiten. Andernfalls sollten Sie einen USB-Typ-C-Anschlusscontrollertreiber schreiben. Weitere Informationen finden Sie unter Schreiben eines USB-Typ-C-Port-Controllertreibers.

  • Wenn Ihre Hardware keinen eingebetteten Controller hat. Laden Sie andernfalls den im Lieferumfang von Microsoft bereitgestellten Treiber UcmUcsi.sys. (Siehe UCSI-Treiber) für ACPI-Transporte oder Schreiben eines UCSI-Clienttreibers für Nicht-ACPI-Transporte.

Zusammenfassung

  • UCM-Objekt, das von der Klassenerweiterung und dem Clienttreiber verwendet wird
  • Von der UCM-Klassenerweiterung bereitgestellte Dienste
  • Erwartetes Verhalten des Clienttreibers

Offizielle Spezifikationen

Gilt für:

  • Windows 10

WDF-Version

  • KMDF Version 1.15
  • UMDF Version 2.15

Wichtige APIs

Beschreibt den USB-Connector-Manager (UCM), der einen USB-Typ-C-Anschluss verwaltet, und das erwartete Verhalten eines Connectortreibers.

UCM wird mithilfe des WDF-Klassenerweiterungs-Clienttreibermodells entwickelt. Die Klassenerweiterung (UcmCx) ist ein von Microsoft bereitgestellter WDF-Treiber, der Schnittstellen bereitstellt, die der Clienttreiber aufrufen kann, um Informationen zum Connector zu melden. Der UCM-Clienttreiber verwendet die Hardwareschnittstellen des Connectors und hält die Klassenerweiterung auf Ereignisse aufmerksam, die auf dem Connector auftreten. Umgekehrt ruft die Klassenerweiterung Rückruffunktionen auf, die vom Clienttreiber als Reaktion auf Betriebssystemereignisse implementiert werden.

Um einen USB Typ-C-Anschluss auf einem System zu aktivieren, müssen Sie den Clienttreiber schreiben.

USB-Connector-Manager.

Voraussetzungen

  • Installieren Sie das neueste Windows Driver Kit (WDK) auf Ihrem Entwicklungscomputer. Das Kit verfügt über die erforderlichen Headerdateien und Bibliotheken zum Schreiben eines UCM-Clienttreibers, insbesondere benötigen Sie Folgendes:

    • Die Stubbibliothek (UcmCxstub.lib). Die Bibliothek übersetzt Aufrufe des Clienttreibers und übergibt sie an UcmCx.

    • Die Headerdatei UcmCx.h.

      Sie können einen UCM-Clienttreiber schreiben, der im Benutzermodus oder Kernelmodus ausgeführt wird. Für den Benutzermodus wird es an die UMDF 2.x-Bibliothek gebunden. für den Kernelmodus ist es KMDF 1.15. Programmierschnittstellen sind für beide Modi identisch.

      Visual Studio-Konfiguration für ucm.

  • Entscheiden Sie, ob Ihr Clienttreiber erweiterte Funktionen des USB-Typ-C-Anschlusses und der USB Power Delivery unterstützt.

    Mit dieser Unterstützung können Sie Windows-Geräte mit USB-Typ-C-Anschlüssen, USB Type-C-Docks und Zubehör sowie USB Typ-C-Ladegeräten erstellen. Der Clienttreiber meldet Connectorereignisse, die es dem Betriebssystem ermöglichen, Richtlinien für USB und Den Stromverbrauch im System zu implementieren.

  • Installieren Sie Windows 10 für Desktopeditionen (Home, Pro, Enterprise und Education) auf Ihrem Zielcomputer oder Windows 10 Mobile mit einem USB-Typ-C-Anschluss.

  • Machen Sie sich mit UCM vertraut und machen Sie sich mit der Interaktion mit anderen Windows-Treibern vertraut. Weitere Informationen finden Sie unter Architektur: USB-Typ-C-Entwurf für ein Windows-System.

  • Machen Sie sich mit Windows Driver Foundation (WDF) vertraut. Empfohlene Lektüre: Entwickeln von Treibern mit Windows Driver Foundation, geschrieben von Penny Orwick und Guy Smith.

Zusammenfassung der von der UCM-Klassenerweiterung bereitgestellten Dienste

Die UCM-Klassenerweiterung informiert das Betriebssystem über die Änderungen der Daten- und Leistungsrolle, der Ladestufen und des ausgehandelten PD-Vertrags. Während der Clienttreiber mit der Hardware interagiert, muss er die Klassenerweiterung benachrichtigen, wenn diese Änderungen auftreten. Die Klassenerweiterung stellt eine Reihe von Methoden bereit, die der Clienttreiber zum Senden der Benachrichtigungen verwenden kann (in diesem Thema erläutert). Hier sind die bereitgestellten Dienste:

Konfiguration der Datenrolle

Bei USB Type-C-Systemen hängt die Datenrolle (Host oder Funktion) von der status der CC-Pins des Connectors ab. Ihr Clienttreiber liest die CC-Leitung (siehe Architektur: USB-Typ-C-Design für ein Windows-System) status von Ihrem Portcontroller, um zu ermitteln, ob der Port in einen Upstream Facing Port (UFP) oder downstream Facing Port (UFP) aufgelöst wurde. Sie meldet diese Informationen an die Klassenerweiterung, damit sie die aktuelle Rolle an USB-Rollenwechseltreiber melden kann.

Hinweis

USB-Rollenschaltertreiber werden auf Windows 10 Mobile Systemen verwendet. Auf Windows 10 für Desktopeditionssysteme ist die Kommunikation zwischen der Klassenerweiterung und den Rollenwechseltreibern optional. Solche Systeme verwenden möglicherweise keinen Controller mit zwei Rollen, in diesem Fall werden die Rollenwechseltreiber nicht verwendet.

Energierolle und Aufladen

Ihr Clienttreiber liest die aktuelle USB-Typ-C-Werbung oder verhandelt einen PD-Stromvertrag mit dem Partnerconnector.

  • Auf einem Windows 10 Mobile System ist die Entscheidung, das entsprechende Ladegerät auszuwählen, softwareseitig unterstützt. Der Clienttreiber meldet die Vertragsinformationen an die Klassenerweiterung, sodass er die Ladestufen an den Ladeschiedstreiber (CAD.sys) senden kann. CAD wählt die aktuelle zu verwendende Ebene aus und leitet die Informationen zum Ladestand an das Batteriesubsystem weiter.
  • Auf einem Windows 10 für Desktopeditionen wird das entsprechende Ladegerät von der Hardware ausgewählt. Der Clienttreiber kann diese Informationen abrufen und an die Klassenerweiterung weiterleiten. Alternativ kann diese Logik von einem anderen Treiber implementiert werden.

Daten- und Energierollenänderungen

Nachdem ein PD-Vertrag ausgehandelt wurde, können sich Daten- und Powerrollen ändern. Diese Änderung kann von Ihrem Clienttreiber oder dem Partnerconnector initiiert werden. Der Clienttreiber meldet diese Informationen an die Klassenerweiterung, sodass die Elemente entsprechend neu konfiguriert werden können.

Daten- und/oder Energierollenupdate

Das Betriebssystem entscheidet möglicherweise, dass die aktuelle Datenrolle nicht richtig ist. In diesem Fall ruft die Klassenerweiterung die Rückruffunktion Ihres Treibers auf, um die erforderlichen Rollentauschvorgänge auszuführen.

Der von Microsoft bereitgestellte USB-Typ-C-Richtlinien-Manager überwacht die Aktivitäten von USB-Typ-C-Anschlüssen. Windows, Version 1809, führt eine Reihe von Programmierschnittstellen ein, mit denen Sie einen Clienttreiber in Policy Manager schreiben können. Der Clienttreiber kann an den Richtlinienentscheidungen für USB-Typ-C-Connectors teilnehmen. Mit diesem Satz können Sie einen Kernelmodus-Exporttreiber oder einen Benutzermodustreiber schreiben. Weitere Informationen finden Sie unter Schreiben eines USB Typ-C Policy Manager-Clienttreibers.

Erwartetes Verhalten des Clienttreibers

Ihr Clienttreiber ist für die folgenden Aufgaben verantwortlich:

  • Erkennen Sie Änderungen an der CC-Zeile, und bestimmen Sie den Typ des Partners, z. B. UFP, DFP und andere. Dazu muss der Treiber den vollständigen Typ-C-Zustandscomputer implementieren, der in der USB Type-C-Spezifikation definiert ist.
  • Konfigurieren Sie Ihren Mux basierend auf der in der CC-Linie erkannten Ausrichtung. Dies umfasst das Aktivieren Ihres PD-Senders/Empfängers sowie die Behandlung und Reaktion auf PD-Nachrichten. Dazu muss der Treiber die vollständigen PD-Empfänger- und Transmitterzustandscomputer implementieren, wie in der USB Power Delivery 2.0-Spezifikation definiert.
  • Treffen Sie PD-Richtlinienentscheidungen, z. B. das Aushandeln eines Vertrags (als Quelle oder Senke), Rollentausch und andere. Der Clienttreiber ist für die Bestimmung des am besten geeigneten Vertrags verantwortlich.
  • Bewerben und Aushandeln alternativer Modi und konfigurieren Sie den Mux, wenn ein alternativer Modus erkannt wird. Der Clienttreiber ist für die Entscheidung über den alternativen Modus verantwortlich, der ausgehandelt werden soll.
  • Steuern von VBus/VConn über den Connector.

1. Initialisieren des UCM-Connectorobjekts (UCMCONNECTOR)

Das UCM-Connectorobjekt (UCMCONNECTOR) stellt den USB-Typ-C-Anschluss dar und ist das Standard Handle zwischen der UCM-Klassenerweiterung und dem Clienttreiber. Das Objekt verfolgt die Betriebsmodi und Power Sourcing-Funktionen des Connectors nach.

Hier ist die Zusammenfassung der Sequenz, in der der Clienttreiber ein UCMCONNECTOR-Handle für den Connector abruft. Führen Sie diese Aufgaben in Ihrem Treiber aus.

  1. Rufen Sie UcmInitializeDevice auf, indem Sie den Verweis auf eine UCM_MANAGER_CONFIG-Struktur übergeben. Der Treiber muss diese Methode in der EVT_WDF_DRIVER_DEVICE_ADD Rückruffunktion aufrufen , bevor WdfDeviceCreate aufgerufen wird.

  2. Geben Sie die Initialisierungsparameter für den USB-Typ-C-Anschluss in einer UCM_CONNECTOR_TYPEC_CONFIG-Struktur an. Dies schließt den Betriebsmodus des Connectors ein, unabhängig davon, ob es sich um einen nachgeschalteten Port, Upstream Port handelt oder zwei Rollen fähig ist. Es gibt auch die USB-Typ-C-Strompegel an, wenn es sich beim Anschluss um eine Stromquelle handelt. Ein USB-Typ-C-Anschluss kann so konzipiert werden, dass er eine 3,5-mm-Audiobuchse agieren kann. Wenn die Hardware das Feature unterstützt, muss das Connectorobjekt entsprechend initialisiert werden.

    In der Struktur müssen Sie auch die Rückruffunktion des Clienttreibers für die Verarbeitung von Datenrollen registrieren.

    Diese Rückruffunktion ist dem Connectorobjekt zugeordnet, das von der UCM-Klassenerweiterung aufgerufen wird. Diese Funktion muss vom Clienttreiber implementiert werden.

    EVT_UCM_CONNECTOR_SET_DATA_ROLE Wechselt die Datenrolle des Connectors an die angegebene Rolle, wenn sie an einen Partnerconnector angefügt wird.

  3. Wenn Ihr Clienttreiber PD-fähig sein möchte, d. h. die Power Delivery 2.0-Hardwareimplementierung des Connectors behandeln möchte, müssen Sie auch eine UCM_CONNECTOR_PD_CONFIG-Struktur initialisieren, die die PD-Initialisierungsparameter angibt. Dies schließt den Stromfluss ein, unabhängig davon, ob es sich beim Stecker um eine Stromsenke oder eine Quelle handelt.

    In der Struktur müssen Sie auch die Rückruffunktion des Clienttreibers für die Behandlung von Powerrollen registrieren.

    Diese Rückruffunktion ist dem Connectorobjekt zugeordnet, das von der UCM-Klassenerweiterung aufgerufen wird. Diese Funktion muss vom Clienttreiber implementiert werden.

    EVT_UCM_CONNECTOR_SET_POWER_ROLE Legt die Energierolle des Connectors auf die angegebene Rolle fest, wenn sie an einen Partnerconnector angefügt wird.

  4. Rufen Sie UcmConnectorCreate auf, und rufen Sie ein UCMCONNECTOR-Handle für den Connector ab. Stellen Sie sicher, dass Sie diese Methode aufrufen, nachdem der Clienttreiber das Framework-Geräteobjekt erstellt hat, indem Sie WdfDeviceCreate aufrufen. Ein geeigneter Ort für diesen Anruf kann im EVT_WDF_DEVICE_PREPARE_HARDWARE oder EVT_WDF_DEVICE_D0_ENTRY des Fahrers sein.

EVT_UCM_CONNECTOR_SET_DATA_ROLE     EvtSetDataRole;

NTSTATUS
EvtDevicePrepareHardware(
    WDFDEVICE Device,
    WDFCMRESLIST ResourcesRaw,
    WDFCMRESLIST ResourcesTranslated
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    PDEVICE_CONTEXT devCtx;
    UCM_MANAGER_CONFIG ucmCfg;
    UCM_CONNECTOR_CONFIG connCfg;
    UCM_CONNECTOR_TYPEC_CONFIG typeCConfig;
    UCM_CONNECTOR_PD_CONFIG pdConfig;
    WDF_OBJECT_ATTRIBUTES attr;
    PCONNECTOR_CONTEXT connCtx;

    UNREFERENCED_PARAMETER(ResourcesRaw);
    UNREFERENCED_PARAMETER(ResourcesTranslated);

    TRACE_FUNC_ENTRY();

    devCtx = GetDeviceContext(Device);

    if (devCtx->Connector)
    {
        goto Exit;
    }

    //
    // Initialize UCM Manager
    //
    UCM_MANAGER_CONFIG_INIT(&ucmCfg);

    status = UcmInitializeDevice(Device, &ucmCfg);
    if (!NT_SUCCESS(status))
    {
        TRACE_ERROR(
            "UcmInitializeDevice failed with %!STATUS!.",
            status);
        goto Exit;
    }

    TRACE_INFO("UcmInitializeDevice() succeeded.");

    //
    // Create a USB Type-C connector #0 with PD
    //
    UCM_CONNECTOR_CONFIG_INIT(&connCfg, 0);

    UCM_CONNECTOR_TYPEC_CONFIG_INIT(
        &typeCConfig,
        UcmTypeCOperatingModeDrp,
        UcmTypeCCurrentDefaultUsb | UcmTypeCCurrent1500mA | UcmTypeCCurrent3000mA);

    typeCConfig.EvtSetDataRole = EvtSetDataRole;

    UCM_CONNECTOR_PD_CONFIG_INIT(&pdConfig, UcmPowerRoleSink | UcmPowerRoleSource);

    connCfg.TypeCConfig = &typeCConfig;
    connCfg.PdConfig = &pdConfig;

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attr, CONNECTOR_CONTEXT);

    status = UcmConnectorCreate(Device, &connCfg, &attr, &devCtx->Connector);
    if (!NT_SUCCESS(status))
    {
        TRACE_ERROR(
            "UcmConnectorCreate failed with %!STATUS!.",
            status);
        goto Exit;
    }

    connCtx = GetConnectorContext(devCtx->Connector);

    UcmEventInitialize(&connCtx->EventSetDataRole);

    TRACE_INFO("UcmConnectorCreate() succeeded.");

Exit:

    TRACE_FUNC_EXIT();
    return status;
}

2. Melden des Partnerconnectors-Anfügungsereignisses

Der Clienttreiber muss UcmConnectorTypeCAttach aufrufen, wenn eine Verbindung mit einem Partnerconnector erkannt wird. Dieser Aufruf benachrichtigt die UCM-Klassenerweiterung, die das Betriebssystem weiter benachrichtigt. An diesem Punkt kann das System mit dem Aufladen auf USB-Typ-C-Ebenen beginnen.

Die UCM-Klassenerweiterung benachrichtigt auch die USB-Rollenschaltertreiber (URS). Basierend auf dem Typ des Partners konfiguriert URS den Controller in der Host- oder Funktionsrolle. Stellen Sie vor dem Aufrufen dieser Methode sicher, dass die Mux auf Ihrem System ordnungsgemäß konfiguriert ist. Andernfalls stellt das System, wenn es die Funktionsrolle hat, eine Verbindung mit einer falschen Geschwindigkeit her (High-Speed anstelle von SuperSpeed).

        UCM_CONNECTOR_TYPEC_ATTACH_PARAMS attachParams;

        UCM_CONNECTOR_TYPEC_ATTACH_PARAMS_INIT(
            &attachParams,
            UcmTypeCPortStateDfp);
        attachParams.CurrentAdvertisement = UcmTypeCCurrent1500mA;

        status = UcmConnectorTypeCAttach(
                    Connector,
                    &attachParams);
        if (!NT_SUCCESS(status))
        {
            TRACE_ERROR(
                "UcmConnectorTypeCAttach() failed with %!STATUS!.",
                status);
            goto Exit;
        }

        TRACE_INFO("UcmConnectorTypeCAttach() succeeded.");

3. Melden von Änderungen an USB-Typ-C-Ankündigungen

Im anfänglichen Anfügungsereignis sendet der Partnerconnector eine aktuelle Ankündigung. Wenn die Ankündigung die aktuelle Ebene des Partnerconnectors angibt, wenn partner ein nachgeschalteter USB-Typ-C-Anschluss ist. Andernfalls gibt die Ankündigung die aktuelle Ebene des lokalen Connectors an, die durch das UCMCONNECTOR-Handle (lokaler Connector) dargestellt wird. Diese anfängliche Ankündigung kann sich während der Lebensdauer der Verbindung ändern. Diese Änderungen müssen vom Clienttreiber überwacht werden.

Wenn der lokale Connector der Stromsenke ist und sich die aktuelle Ankündigung ändert, muss der Clienttreiber Änderungen in der aktuellen Ankündigung erkennen und sie der Klassenerweiterung melden. Auf Windows 10 Mobile Systemen werden diese Informationen von CAD.sys und dem Batteriesubsystem verwendet, um die Strommenge anzupassen, die von der Quelle abgerufen wird. Um die Änderung der aktuellen Ebene an die Klassenerweiterung zu melden, muss der Clienttreiber UcmConnectorTypeCCurrentAdChanged aufrufen.

4. Bericht über den neu ausgehandelten PD-Vertrag

Wenn Ihr Connector PD unterstützt, werden nach dem anfänglichen Anfügungsereignis PD-Nachrichten zwischen dem Connector und seinem Partnerconnector übertragen. Zwischen beiden Partnern wird ein PD-Vertrag ausgehandelt, der die aktuellen Ebenen festlegt, die der Connector zeichnen oder zeichnen kann. Bei jeder Änderung des PD-Vertrags muss der Clienttreiber diese Methoden aufrufen, um die Änderung an die Klassenerweiterung zu melden.

  • Der Clienttreiber muss diese Methoden immer dann aufrufen, wenn er eine (nicht angeforderte oder andere) Quellfunktionenankündigung vom Partner erhält. Der lokale Connector (Senke) erhält nur dann eine unerwünschte Ankündigung vom Partner, wenn der Partner die Quelle ist. Außerdem kann der lokale Connector explizit Quellfunktionen vom Partner anfordern, die die Quelle sein können (auch wenn der Partner derzeit die Senke ist). Dieser Austausch erfolgt durch Senden einer Get_Source_Caps Nachricht an den Partner.
  • Umgekehrt muss der Clienttreiber diese Methoden jedes Mal aufrufen, wenn der lokale Connector (Quelle) dem Partner Quellfunktionen ankündigen. Wenn der lokale Connector außerdem eine Get_Source_Caps Nachricht vom Partner empfängt, muss er mit den Quellfunktionen des lokalen Connectors reagieren.

5. Melden sie status

Der Clienttreiber kann die UCM-Klassenerweiterung benachrichtigen, wenn der Ladestand nicht ausreichend ist. Die Klassenerweiterung meldet diese Informationen an das Betriebssystem. Das System verwendet diese Informationen, um eine Benutzerbenachrichtigung anzuzeigen, dass das Ladegerät das System nicht optimal lädt. Die lade status kann mit den folgenden Methoden gemeldet werden:

Diese Methoden geben den Ladezustand an. Wenn die gemeldeten Ebenen UcmChargingStateSlowCharging oder UcmChargingStateTrickleCharging sind (siehe UCM_CHARGING_STATE), zeigt das Betriebssystem die Benutzerbenachrichtigung an.

6. Melden PR_Swap/DR_Swap Ereignisse

Wenn der Connector vom Partner eine Auslagerungsnachricht für die Energierolle (PR_Swap) oder die Datenrolle (DR_Swap) empfängt, muss der Clienttreiber die UCM-Klassenerweiterung benachrichtigen.

  • UcmConnectorDataDirectionChanged

    Rufen Sie diese Methode auf, nachdem eine PD-DR_Swap-Nachricht verarbeitet wurde. Nach diesem Aufruf meldet das Betriebssystem die neue Rolle an URS, wodurch die vorhandenen Rollentreiber heruntergerissen und Treiber für die neue Rolle geladen werden.

  • UcmConnectorPowerDirectionChanged

    Rufen Sie diese Methode auf, nachdem eine PD-PR_Swap-Nachricht verarbeitet wurde. Nach einer PR_Swap muss der PD-Vertrag neu ausgehandelt werden. Der Clienttreiber muss diese PD-Vertragsverhandlung melden, indem er die in Schritt 4 beschriebenen Methoden aufruft.

7. Implementieren von Rückruffunktionen zum Verarbeiten von Strom- und Datenrollentauschanforderungen

Die UCM-Klassenerweiterung erhält möglicherweise Anforderungen zum Ändern der Daten oder der Energierichtung des Connectors. In diesem Fall ruft er die Implementierung von EVT_UCM_CONNECTOR_SET_DATA_ROLE und EVT_UCM_CONNECTOR_SET_POWER_ROLE Rückruffunktionen durch den Clienttreiber auf (wenn der Connector PD implementiert). Der Clienttreiber hat diese Funktionen zuvor in seinem Aufruf von UcmConnectorCreate registriert.

Der Clienttreiber führt Rollentauschvorgänge mithilfe von Hardwareschnittstellen aus.

  • EVT_UCM_CONNECTOR_SET_DATA_ROLE

    In der Rückrufimplementierung wird folgendes vom Clienttreiber erwartet:

    1. Senden Sie eine PD-DR_Swap-Nachricht an den Portpartner.
    2. Rufen Sie UcmConnectorDataDirectionChanged auf , um die Klassenerweiterung darüber zu benachrichtigen, dass die Nachrichtensequenz erfolgreich oder nicht erfolgreich abgeschlossen wurde.
    EVT_UCM_CONNECTOR_SET_DATA_ROLE     EvtSetDataRole;
    
    NTSTATUS
    EvtSetDataRole(
        UCMCONNECTOR  Connector,
        UCM_TYPE_C_PORT_STATE DataRole
        )
    {
        PCONNECTOR_CONTEXT connCtx;
    
        TRACE_INFO("EvtSetDataRole(%!UCM_TYPE_C_PORT_STATE!) Entry", DataRole);
    
        connCtx = GetConnectorContext(Connector);
    
        TRACE_FUNC_EXIT();
    
        return STATUS_SUCCESS;
    }
    
  • EVT_UCM_CONNECTOR_SET_POWER_ROLE

    In der Rückrufimplementierung wird folgendes vom Clienttreiber erwartet:

    1. Senden Sie eine PD-PR_Swap-Nachricht an den Portpartner.
    2. Rufen Sie UcmConnectorPowerDirectionChanged auf , um die Klassenerweiterung darüber zu benachrichtigen, dass die Nachrichtensequenz erfolgreich oder nicht erfolgreich abgeschlossen wurde.
    EVT_UCM_CONNECTOR_SET_POWER_ROLE     EvtSetPowerRole;
    
    NTSTATUS
    EvtSetPowerRole(
        UCMCONNECTOR Connector,
        UCM_POWER_ROLE PowerRole
        )
    {
        PCONNECTOR_CONTEXT connCtx;
    
        TRACE_INFO("EvtSetPowerRole(%!UCM_POWER_ROLE!) Entry", PowerRole);
    
        connCtx = GetConnectorContext(Connector);
    
        //PR_Swap operation.
    
        TRACE_FUNC_EXIT();
    
        return STATUS_SUCCESS;
    }
    

Hinweis

Der Clienttreiber kann UcmConnectorDataDirectionChanged und UcmConnectorPowerDirectionChanged asynchron aufrufen, d. h. nicht aus dem Rückrufthread. In einer typischen Implementierung ruft die Klassenerweiterung die Rückruffunktionen auf, wodurch der Clienttreiber eine Hardwaretransaktion zum Senden der Nachricht initiiert. Nach Abschluss der Transaktion benachrichtigt die Hardware den Treiber. Der Treiber ruft diese Methoden auf, um die Klassenerweiterung zu benachrichtigen.

8. Melden des Trennungsereignisses des Partnerconnectors

Der Clienttreiber muss UcmConnectorTypeCDetach aufrufen, wenn die Verbindung mit einem Partnerconnector beendet wird. Dieser Aufruf benachrichtigt die UCM-Klassenerweiterung, die das Betriebssystem weiter benachrichtigt.

Anwendungsbeispiel: Mobiles Gerät, das mit einem PC verbunden ist

Wenn ein Gerät, auf dem Windows 10 Mobile ausgeführt wird, mit einem PC verbunden ist, auf dem Windows 10 für Desktopeditionen ausgeführt wird, über eine USB-Typ-C-Verbindung, stellt das Betriebssystem sicher, dass das mobile Gerät der Upstream Facing Port (UFP) ist, da MTP nur in dieser Richtung funktioniert. In diesem Szenario sehen Sie hier die Sequenz für die Datenrollenkorrektur:

  1. Der Clienttreiber, der auf dem mobilen Gerät ausgeführt wird, meldet ein Anfügungsereignis durch Aufruf von UcmConnectorTypeCAttach und meldet den Partnerconnector als Downstream Facing Port (UFP).
  2. Der Clienttreiber meldet den PD-Vertrag, indem er UcmConnectorPdPartnerSourceCaps und UcmConnectorPdConnectionStateChanged aufruft.
  3. Die UCM-Klassenerweiterung benachrichtigt die geräteseitigen USB-Treiber, die dazu führen, dass diese Treiber auf Enumeration vom Host reagieren. Die Betriebssysteminformationen werden über USB ausgetauscht.
  4. Die UCM-Klassenerweiterung UcmCx ruft die Rückruffunktionen des Clienttreibers auf, um die Rollen zu ändern: EVT_UCM_CONNECTOR_SET_DATA_ROLE und EVT_UCM_CONNECTOR_SET_POWER_ROLE.

Hinweis

Wenn zwei Windows 10 Mobile Geräte miteinander verbunden sind, wird kein Rollentausch durchgeführt, und der Benutzer wird benachrichtigt, dass die Verbindung keine gültige Verbindung ist.