USB Type-C 커넥터 드라이버 작성

다음 시나리오에서 USB Type-C 커넥터 드라이버를 작성해야 합니다.

요약

  • 클래스 확장 및 클라이언트 드라이버에서 사용하는 UCM 개체
  • UCM 클래스 확장에서 제공하는 서비스
  • 클라이언트 드라이버의 예상 동작

공식 사양

적용 대상

  • Windows 10

WDF 버전

  • KMDF 버전 1.15
  • UMDF 버전 2.15

중요 API

USB Type-C 커넥터 및 커넥터 드라이버의 예상 동작을 관리하는 UCM(USB 커넥터 관리자)에 대해 설명합니다.

UCM은 WDF 클래스 확장 클라이언트 드라이버 모델을 사용하여 설계되었습니다. 클래스 확장(UcmCx)은 클라이언트 드라이버가 커넥터에 대한 정보를 보고하기 위해 호출할 수 있는 인터페이스를 제공하는 Microsoft 제공 WDF 드라이버입니다. UCM 클라이언트 드라이버는 커넥터의 하드웨어 인터페이스를 사용하고 클래스 확장이 커넥터에서 발생하는 이벤트를 인식하게 합니다. 반대로 클래스 확장은 운영 체제 이벤트에 대한 응답으로 클라이언트 드라이버에서 구현한 콜백 함수를 호출합니다.

시스템에서 USB Type-C 커넥터를 사용하도록 설정하려면 클라이언트 드라이버를 작성해야 합니다.

usb 커넥터 관리자.

시작하기 전에

  • 개발 컴퓨터에 최신 WDK(Windows 드라이버 키트)를 설치합니다. 키트에는 UCM 클라이언트 드라이버를 작성하는 데 필요한 헤더 파일 및 라이브러리가 있습니다. 특히 다음이 필요합니다.

    • 스텁 라이브러리(UcmCxstub.lib)입니다. 라이브러리는 클라이언트 드라이버의 호출을 변환하고 UcmCx에 전달합니다.

    • 헤더 파일 UcmCx.h입니다.

      사용자 모드 또는 커널 모드에서 실행되는 UCM 클라이언트 드라이버를 작성할 수 있습니다. 사용자 모드의 경우 UMDF 2.x 라이브러리와 바인딩됩니다. 커널 모드의 경우 KMDF 1.15입니다. 프로그래밍 인터페이스는 두 모드 모두에 대해 동일합니다.

      ucm에 대한 visual studio 구성입니다.

  • 클라이언트 드라이버가 USB Type-C 커넥터 및 USB 전원 배달의 고급 기능을 지원할지 여부를 결정합니다.

    이 지원을 통해 USB Type-C 커넥터, USB Type-C 도크 및 액세서리 및 USB Type-C 충전기를 사용하여 Windows 디바이스를 빌드할 수 있습니다. 클라이언트 드라이버는 운영 체제가 시스템의 USB 및 전력 소비와 관련된 정책을 구현할 수 있도록 하는 커넥터 이벤트를 보고합니다.

  • 대상 컴퓨터에 데스크톱 버전(Home, Pro, Enterprise 및 Education)용 Windows 10 설치하거나 USB Type-C 커넥터를 사용하여 Windows 10 Mobile 설치합니다.

  • UCM 및 UCM이 다른 Windows 드라이버와 상호 작용하는 방법을 숙지합니다. 아키텍처: Windows 시스템의 USB Type-C 디자인을 참조하세요.

  • WDF(Windows 드라이버 파운데이션)에 대해 잘 알고 있습니다. 권장 읽기: 페니 오윅과 가이 스미스가 쓴 Windows 드라이버 파운데이션을 사용하여 드라이버 개발.

UCM 클래스 확장에서 제공하는 서비스 요약

UCM 클래스 확장은 운영 체제에 데이터 및 전원 역할의 변경 내용, 충전 수준 및 협상된 PD 계약에 대한 정보를 유지합니다. 클라이언트 드라이버는 하드웨어와 상호 작용하는 동안 이러한 변경이 발생할 때 클래스 확장에 알려야 합니다. 클래스 확장은 클라이언트 드라이버가 알림을 보내는 데 사용할 수 있는 메서드 집합을 제공합니다(이 항목에서 설명). 제공된 서비스는 다음과 같습니다.

데이터 역할 구성

USB Type-C 시스템에서 데이터 역할(호스트 또는 함수)은 커넥터의 CC 핀 상태 따라 달라집니다. 클라이언트 드라이버는 포트 컨트롤러에서 CC 줄(아키텍처: Windows 시스템의 USB Type-C 디자인 참조)상태 을 읽어 포트가 UFP(업스트림 연결 포트) 또는 UFP(다운스트림 연결 포트)로 확인되었는지 여부를 확인합니다. USB 역할 스위치 드라이버에 현재 역할을 보고할 수 있도록 해당 정보를 클래스 확장에 보고합니다.

참고

USB 역할 스위치 드라이버는 Windows 10 Mobile 시스템에서 사용됩니다. 데스크톱 버전 시스템용 Windows 10 클래스 확장과 역할 스위치 드라이버 간의 통신은 선택 사항입니다. 이러한 시스템은 이중 역할 컨트롤러를 사용하지 않을 수 있습니다. 이 경우 역할 스위치 드라이버는 사용되지 않습니다.

전원 역할 및 충전

클라이언트 드라이버가 USB Type-C 현재 광고를 읽거나 파트너 커넥터와 PD 전원 계약을 협상합니다.

  • Windows 10 Mobile 시스템에서 적절한 충전기를 선택하는 결정은 소프트웨어 지원입니다. 클라이언트 드라이버는 충전 중재 드라이버(CAD.sys)에 충전 수준을 보낼 수 있도록 계약 정보를 클래스 확장에 보고합니다. CAD는 사용할 현재 수준을 선택하고 충전 수준 정보를 배터리 하위 시스템에 전달합니다.
  • 데스크톱 버전 시스템용 Windows 10 하드웨어에서 적절한 충전기를 선택합니다. 클라이언트 드라이버는 해당 정보를 가져와 클래스 확장에 전달하도록 선택할 수 있습니다. 또는 다른 드라이버에서 해당 논리를 구현할 수 있습니다.

데이터 및 전원 역할 변경

PD 계약이 협상되면 데이터 역할 및 전원 역할이 변경될 수 있습니다. 이러한 변경은 클라이언트 드라이버 또는 파트너 커넥터에 의해 시작될 수 있습니다. 클라이언트 드라이버는 해당 정보를 클래스 확장에 보고하므로 그에 따라 항목을 다시 구성할 수 있습니다.

데이터 및/또는 전원 역할 업데이트

운영 체제에서 현재 데이터 역할이 올바르지 않다고 결정할 수 있습니다. 이 경우 클래스 확장은 드라이버의 콜백 함수를 호출하여 필요한 역할 교환 작업을 수행합니다.

Microsoft에서 제공하는 USB Type-C 정책 관리자는 USB Type-C 커넥터의 활동을 모니터링합니다. Windows 버전 1809에는 정책 관리자에 클라이언트 드라이버를 작성하는 데 사용할 수 있는 프로그래밍 인터페이스 집합이 도입되었습니다. 클라이언트 드라이버는 USB Type-C 커넥터에 대한 정책 결정에 참여할 수 있습니다. 이 집합을 사용하면 커널 모드 내보내기 드라이버 또는 사용자 모드 드라이버를 작성하도록 선택할 수 있습니다. 자세한 내용은 USB Type-C Policy Manager 클라이언트 드라이버 작성을 참조하세요.

클라이언트 드라이버의 예상 동작

클라이언트 드라이버는 다음 작업을 담당합니다.

  • CC 줄의 변경 내용을 검색하고 UFP, DFP 등과 같은 파트너 유형을 확인합니다. 이렇게 하려면 드라이버는 USB Type-C 사양에 정의된 대로 전체 Type-C 상태 컴퓨터를 구현해야 합니다.
  • CC 줄에서 검색된 방향에 따라 Mux를 구성합니다. 여기에는 PD 송신기/수신기 켜기 및 PD 메시지 처리 및 응답이 포함됩니다. 이렇게 하려면 드라이버는 USB Power Delivery 2.0 사양에 정의된 대로 전체 PD 수신기 및 송신기 상태 컴퓨터를 구현해야 합니다.
  • 계약 협상(원본 또는 싱크), 역할 교환 등과 같은 PD 정책 결정을 내립니다. 클라이언트 드라이버는 가장 적절한 계약을 결정할 책임이 있습니다.
  • 대체 모드를 보급 및 협상하고, 대체 모드가 감지되면 Mux를 구성합니다. 클라이언트 드라이버는 협상할 대체 모드를 결정할 책임이 있습니다.
  • 커넥터를 통해 VBus/VConn을 제어합니다.

1. UCM 커넥터 개체 초기화(UCMCONNECTOR)

UCM 커넥터 개체(UCMCONNECTOR)는 USB Type-C 커넥터를 나타내며 UCM 클래스 확장과 클라이언트 드라이버 간의 기본 핸들입니다. 개체는 커넥터의 작동 모드 및 전원 소싱 기능을 추적합니다.

다음은 클라이언트 드라이버가 커넥터에 대한 UCMCONNECTOR 핸들을 검색하는 시퀀스의 요약입니다. 드라이버에서 이러한 작업 수행

  1. UCM_MANAGER_CONFIG 구조체에 대한 참조를 전달하여 UcmInitializeDevice를 호출합니다. 드라이버는 WdfDeviceCreate를 호출하기 전에 EVT_WDF_DRIVER_DEVICE_ADD 콜백 함수에서 이 메서드를 호출해야 합니다.

  2. UCM_CONNECTOR_TYPEC_CONFIG 구조에서 USB Type-C 커넥터에 대한 초기화 매개 변수를 지정합니다. 여기에는 다운스트림 연결 포트, 업스트림 연결 포트 또는 이중 역할 가능 여부와 관계없이 커넥터의 작동 모드가 포함됩니다. 또한 커넥터가 전원인 경우 USB Type-C 현재 수준을 지정합니다. USB Type-C 커넥터는 3.5mm 오디오 잭을 작동할 수 있도록 설계할 수 있습니다. 하드웨어에서 이 기능을 지원하는 경우 커넥터 개체를 적절하게 초기화해야 합니다.

    구조에서는 데이터 역할을 처리하기 위한 클라이언트 드라이버의 콜백 함수도 등록해야 합니다.

    이 콜백 함수는 UCM 클래스 확장에 의해 호출되는 커넥터 개체와 연결됩니다. 이 함수는 클라이언트 드라이버에서 구현해야 합니다.

    EVT_UCM_CONNECTOR_SET_DATA_ROLE 파트너 커넥터에 연결할 때 커넥터의 데이터 역할을 지정된 역할로 바꿉니다.

  3. 클라이언트 드라이버가 PD 지원, 즉 커넥터의 Power Delivery 2.0 하드웨어 구현을 처리하려면 PD 초기화 매개 변수를 지정하는 UCM_CONNECTOR_PD_CONFIG 구조도 초기화해야 합니다. 여기에는 커넥터가 전원 싱크인지 소스인지 여부에 관계없이 전원 흐름이 포함됩니다.

    구조에서는 전원 역할을 처리하기 위한 클라이언트 드라이버의 콜백 함수도 등록해야 합니다.

    이 콜백 함수는 UCM 클래스 확장에 의해 호출되는 커넥터 개체와 연결됩니다. 이 함수는 클라이언트 드라이버에서 구현해야 합니다.

    EVT_UCM_CONNECTOR_SET_POWER_ROLE 파트너 커넥터에 연결할 때 커넥터의 전원 역할을 지정된 역할로 설정합니다.

  4. UcmConnectorCreate를 호출하고 커넥터에 대한 UCMCONNECTOR 핸들을 검색합니다. 클라이언트 드라이버가 WdfDeviceCreate를 호출하여 프레임워크 디바이스 개체를 만든 후에 이 메서드를 호출해야 합니다. 이 호출에 적합한 위치는 드라이버의 EVT_WDF_DEVICE_PREPARE_HARDWARE 또는 EVT_WDF_DEVICE_D0_ENTRY 있을 수 있습니다.

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. 파트너 커넥터 연결 이벤트 보고

파트너 커넥터에 대한 연결이 감지되면 클라이언트 드라이버가 UcmConnectorTypeCAttach 를 호출해야 합니다. 이 호출은 운영 체제에 추가로 알 수 있는 UCM 클래스 확장을 알 수 있습니다. 이 시점에서 시스템은 USB Type-C 수준에서 충전을 시작할 수 있습니다.

UCM 클래스 확장은 USB URS(역할 전환 드라이버)에도 알릴 수 있습니다. 파트너 유형에 따라 URS는 호스트 역할 또는 함수 역할에서 컨트롤러를 구성합니다. 이 메서드를 호출하기 전에 시스템의 Mux가 올바르게 구성되었는지 확인합니다. 그렇지 않으면 시스템이 기능 역할에 있는 경우 잘못된 속도(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. USB Type-C 보급 알림 변경 내용 보고

초기 연결 이벤트에서 파트너 커넥터는 현재 광고를 보냅니다. 보급 알림이 파트너가 USB Type-C 다운스트림 연결 포트인 경우 파트너 커넥터의 현재 수준을 지정하는 경우 그렇지 않으면 보급 알림은 UCMCONNECTOR 핸들(로컬 커넥터)로 표시되는 로컬 커넥터의 현재 수준을 지정합니다. 이 초기 보급 알림은 연결 수명 동안 변경될 수 있습니다. 이러한 변경 내용은 클라이언트 드라이버에서 모니터링해야 합니다.

로컬 커넥터가 전원 싱크이고 현재 보급 알림이 변경되면 클라이언트 드라이버는 현재 보급 알림의 변경 내용을 검색하여 클래스 확장에 보고해야 합니다. Windows 10 Mobile 시스템에서 해당 정보는 CAD.sys 및 배터리 하위 시스템에서 원본에서 그리는 전류의 양을 조정하는 데 사용됩니다. 현재 수준의 변경 사항을 클래스 확장에 보고하려면 클라이언트 드라이버가 UcmConnectorTypeCCurrentAdChanged를 호출해야 합니다.

4. 협상된 새 PD 계약 보고

커넥터가 PD를 지원하는 경우 초기 연결 이벤트 이후에 커넥터와 해당 파트너 커넥터 간에 전송되는 PD 메시지가 있습니다. 두 파트너 간에 커넥터가 그릴 수 있는 현재 수준을 결정하거나 파트너가 그릴 수 있도록 허용하는 PD 계약이 협상됩니다. PD 계약이 변경 될 때마다 클라이언트 드라이버는 클래스 확장에 변경 내용을 보고 하려면 이러한 메서드를 호출 해야 합니다.

  • 클라이언트 드라이버는 파트너로부터 원본 기능 보급 알림(원치 않거나 기타)을 받을 때마다 이러한 메서드를 호출해야 합니다. 로컬 커넥터(싱크)는 파트너가 원본인 경우에만 파트너로부터 원치 않는 광고를 가져옵니다. 또한 로컬 커넥터는 파트너가 현재 싱크인 경우에도 원본이 될 수 있는 파트너의 원본 기능을 명시적으로 요청할 수 있습니다. 교환은 파트너에게 Get_Source_Caps 메시지를 전송하여 수행됩니다.
  • 반대로 클라이언트 드라이버는 로컬 커넥터(원본)가 원본 기능을 파트너에게 보급할 때마다 이러한 메서드를 호출해야 합니다. 또한 로컬 커넥터가 파트너로부터 Get_Source_Caps 메시지를 받으면 로컬 커넥터의 원본 기능으로 응답해야 합니다.

5. 배터리 충전 상태 보고

충전 수준이 적절하지 않은 경우 클라이언트 드라이버는 UCM 클래스 확장에 알릴 수 있습니다. 클래스 확장은 이 정보를 운영 체제에 보고합니다. 시스템은 해당 정보를 사용하여 충전기가 시스템을 최적으로 충전하지 않는다는 사용자 알림을 표시합니다. 충전 상태 다음 방법으로 보고할 수 있습니다.

이러한 방법은 충전 상태를 지정합니다. 보고된 수준이 UcmChargingStateSlowCharging 또는 UcmChargingStateTrickleCharging 인 경우( UCM_CHARGING_STATE 참조) 운영 체제에 사용자 알림이 표시됩니다.

6. PR_Swap/DR_Swap 이벤트 보고

커넥터가 파트너로부터 전원 역할(PR_Swap) 또는 데이터 역할(DR_Swap) 교환 메시지를 수신하는 경우 클라이언트 드라이버는 UCM 클래스 확장을 알려야 합니다.

  • UcmConnectorDataDirectionChanged

    PD DR_Swap 메시지가 처리된 후 이 메서드를 호출합니다. 이 호출 후 운영 체제는 URS에 새 역할을 보고합니다. 그러면 기존 역할 드라이버가 중단되고 새 역할에 대한 드라이버가 로드됩니다.

  • UcmConnectorPowerDirectionChanged

    PD PR_Swap 메시지가 처리된 후 이 메서드를 호출합니다. PR_Swap 후 PD 계약을 재협상해야 합니다. 클라이언트 드라이버는 4단계에서 설명한 메서드를 호출하여 PD 계약 협상을 보고해야 합니다.

7. 전원 및 데이터 역할 교환 요청을 처리하는 콜백 함수 구현

UCM 클래스 확장은 커넥터의 데이터 또는 전원 방향을 변경하라는 요청을 받을 수 있습니다. 이 경우 클라이언트 드라이버의 EVT_UCM_CONNECTOR_SET_DATA_ROLE 구현을 호출하고 커넥터가 PD를 구현하는 경우 콜백 함수를 EVT_UCM_CONNECTOR_SET_POWER_ROLE . 클라이언트 드라이버는 이전에 UcmConnectorCreate 호출에서 해당 함수를 등록했습니다.

클라이언트 드라이버는 하드웨어 인터페이스를 사용하여 역할 교환 작업을 수행합니다.

  • EVT_UCM_CONNECTOR_SET_DATA_ROLE

    콜백 구현에서 클라이언트 드라이버는 다음을 수행해야 합니다.

    1. PD DR_Swap 메시지를 포트 파트너에게 보냅니다.
    2. UcmConnectorDataDirectionChanged를 호출하여 클래스 확장에 메시지 시퀀스가 성공적으로 완료되었거나 실패했음을 알립니다.
    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

    콜백 구현에서 클라이언트 드라이버는 다음을 수행해야 합니다.

    1. PD PR_Swap 메시지를 포트 파트너에게 보냅니다.
    2. UcmConnectorPowerDirectionChanged를 호출하여 클래스 확장에 메시지 시퀀스가 성공적으로 완료되었거나 실패했음을 알립니다.
    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;
    }
    

참고

클라이언트 드라이버는 콜백 스레드가 아닌 UcmConnectorDataDirectionChangedUcmConnectorPowerDirectionChanged 를 비동기적으로 호출할 수 있습니다. 일반적인 구현에서 클래스 확장은 콜백 함수를 호출하여 클라이언트 드라이버가 하드웨어 트랜잭션을 시작하여 메시지를 보냅니다. 트랜잭션이 완료되면 하드웨어가 드라이버에 알 수 있습니다. 드라이버는 이러한 메서드를 호출하여 클래스 확장을 알립니다.

8. 파트너 커넥터 분리 이벤트 보고

클라이언트 드라이버는 파트너 커넥터에 대한 연결이 종료되면 UcmConnectorTypeCDetach 를 호출해야 합니다. 이 호출은 운영 체제에 추가로 알 수 있는 UCM 클래스 확장을 알 수 있습니다.

사용 사례 예제: PC에 연결된 모바일 디바이스

Windows 10 Mobile 실행하는 디바이스가 USB Type-C 연결을 통해 데스크톱 버전용 Windows 10 실행되는 PC에 연결된 경우 운영 체제는 MTP가 해당 방향으로만 작동하기 때문에 모바일 디바이스가 UFP(업스트림 연결 포트)인지 확인합니다. 이 시나리오에서 데이터 역할 수정 시퀀스는 다음과 같습니다.

  1. 모바일 디바이스에서 실행되는 클라이언트 드라이버는 UcmConnectorTypeCAttach 를 호출하여 연결 이벤트를 보고하고 파트너 커넥터를 UFP(다운스트림 연결 포트)로 보고합니다.
  2. 클라이언트 드라이버는 UcmConnectorPdPartnerSourceCapsUcmConnectorPdConnectionStateChanged를 호출하여 PD 계약을 보고합니다.
  3. UCM 클래스 확장은 USB 디바이스 쪽 드라이버에 알리기 때문에 해당 드라이버가 호스트의 열거형에 응답합니다. 운영 체제 정보는 USB를 통해 교환됩니다.
  4. UCM 클래스 확장 UcmCx는 클라이언트 드라이버의 콜백 함수를 호출하여 역할을 변경합니다( EVT_UCM_CONNECTOR_SET_DATA_ROLEEVT_UCM_CONNECTOR_SET_POWER_ROLE).

참고

두 Windows 10 Mobile 디바이스가 서로 연결되어 있으면 역할 교환이 수행되지 않으며 사용자에게 연결이 유효한 연결이 아님을 알 수 있습니다.