다음을 통해 공유


USB 제어 전송을 보내는 방법(UWP 앱)

이 문서에서는 다음을 보여 줍니다.

  • USB 설치 패킷의 서식을 지정하는 방법
  • 앱에서 USB 컨트롤 전송을 시작하는 방법

중요 API

USB 디바이스와 통신하는 앱은 일반적으로 여러 제어 전송 요청을 보냅니다. 이러한 요청은 디바이스에 대한 정보를 얻고 하드웨어 공급업체에서 정의한 제어 명령을 보냅니다. 이 항목에서는 컨트롤 전송에 대해 알아보고 UWP 앱에서 형식을 지정하고 보내는 방법을 알아봅니다.

제어 전송은 구성 정보를 읽거나 쓰거나 하드웨어 공급업체에서 정의한 디바이스별 기능을 수행할 수 있습니다. 전송이 쓰기 작업을 수행하는 경우 OUT 전송입니다. 읽기 작업으로, IN 전송입니다. 방향에 관계없이 호스트 시스템에서 UWP 앱과 같은 소프트웨어는 항상 컨트롤 전송 요청을 빌드하고 시작합니다. 때때로 앱은 데이터를 읽거나 쓰는 제어 전송을 시작할 수 있습니다. 이 경우 추가 버퍼를 보내야 할 수 있습니다.

모든 유형의 제어 전송을 수용하기 위해 Windows.Devices.Usb 는 다음 방법을 제공합니다.

usb용 Windows 런타임 API에 대한 usb 제어 전송

USB 제어 전송은 설명자 데이터를 얻거나 표준 명령을 보내는 데도 사용됩니다. 그러나 컨트롤 전송을 수동으로 빌드하는 대신 Windows.Devices.Usb에서 제공하는 특정 메서드를 호출하여 이러한 유형의 요청을 보내는 것이 좋습니다. 예를 들어 대체 설정을 선택하려면 SendControlOutTransferAsync(UsbSetupPacket)를 호출하는 대신 SelectSettingAsync를 호출합니다.

특정 유형의 표준 요청에 대한 제어 전송은 지원되지 않습니다. 그러나 디바이스가 Windows.Devices.Usb에서 지원하는 디바이스 클래스에 속하는 경우 디바이스 클래스 사양에 정의된 대로 일부 요청을 보낼 수 있습니다.

시작하기 전에

  • 디바이스를 열고 UsbDevice 개체를 가져와야 합니다. USB 디바이스(UWP 앱)에 연결하는 방법을 읽습니다.
  • 공급업체 정의 제어 명령에 대한 정보를 가져옵니다. 이러한 명령은 일반적으로 하드웨어 사양에 정의됩니다.
  • CustomUsbDeviceAccess 샘플, Scenario2_ControlTransfer.cpp 및 Scenario2_ControlTransfer.h에서 이 항목에 표시된 전체 코드를 볼 수 있습니다.

1단계: 설치 패킷 채우기

이 항목에서는 다양한 패턴으로 조명을 깜박이는 디바이스로 컨트롤 전송을 보냅니다. 설치 패킷을 채웁니다. 컨트롤 명령이 하드웨어 공급업체에 의해 정의되어 있는지 알고 있어야 합니다.

  • bmRequestType (D7): OUT
  • bmRequestType (D4): 디바이스
  • bmRequestType (D6... D5): 공급업체
  • bRequest: 0x03
  • wValue: 0-7(해당 범위의 모든 숫자 포함)
  • wIndex: 0
  • wLength: 0

제어 전송의 경우 전송에 대한 모든 정보가 포함된 설정 패킷을 채워야 합니다. 요청이 데이터를 읽거나 쓰는지 여부, 요청 유형 등을 입력해야 합니다. 설치 패킷의 형식은 공식 USB 사양에 정의되어 있습니다. 설정 패킷 필드의 값은 디바이스의 하드웨어 사양에 의해 제공됩니다.

  1. UsbSetupPacket 개체를 만듭니다.

  2. 다양한 속성을 설정하여 UsbSetupPacket 개체를 채웁니다. 이 표에는 USB 정의 설정 패킷 필드와 해당 필드에 해당하는 속성이 표시됩니다.

    섹션 9.3의 필드 속성 설명
    bmRequestType (D7) UsbControlRequestType.Direction 요청의 방향입니다. 요청이 호스트에서 디바이스로(전송 중) 또는 호스트할 디바이스인지 여부(전송 중)
    bmRequestType (D4) UsbControlRequestType.Recipient 요청의 받는 사람입니다. 모든 컨트롤 전송은 기본 엔드포인트를 대상으로 합니다. 그러나 받는 사람은 디바이스, 인터페이스, 엔드포인트 또는 기타일 수 있습니다. USB 디바이스, 인터페이스, 엔드포인트 계층 구조에 대한 자세한 내용은 디바이스 레이아웃을 참조하세요.
    bmRequestType (D6... D5) UsbControlRequestType.ControlTransferType 요청의 범주입니다. 표준, 클래스 또는 공급업체.
    bRequest UsbSetupPacket.Request 요청 유형입니다. 요청이 GET_DESCRIPTOR 요청과 같은 표준 요청인 경우 해당 요청은 USB 사양에 의해 정의됩니다. 그렇지 않으면 공급업체에서 정의할 수 있습니다.
    wValue UsbSetupPacket.Value 요청 유형에 따라 달라집니다.
    wIndex UsbSetupPacket.Index 요청 유형에 따라 달라집니다.
    wLength UsbSetupPacket.Length 이 요청에서 보내거나 받은 데이터 패킷의 길이입니다.

! [참고] 특정 컨트롤 전송의 경우 bmRequestType을 원시 바이트로 제공해야 할 수 있습니다. 이 경우 UsbControlRequestType.AsByte 속성에서 바이트를 설정할 수 있습니다.

2단계: 컨트롤 전송을 보내는 비동기 작업 시작

컨트롤 전송을 보내려면 UsbDevice 개체가 있어야 합니다. 컨트롤 전송에는 설정 패킷을 따르는 데이터 패킷이 필요할 수도 있으며 필요하지 않을 수도 있습니다.

컨트롤 전송을 시작하려면 SendControlInTransferAsync 또는 SendControlOutTransferAsync의 재정의를 호출합니다. 전송에서 데이터 패킷을 사용하는 경우 SendControlOutTransferAsync(UsbSetupPacket, IBuffer), SendControlInTransferAsync(UsbSetupPacket, IBuffer)를 호출합니다. 이러한 메서드는 디바이스에서 데이터를 쓰거나 받을 데이터가 포함된 추가 매개 변수를 사용합니다. 순서도를 사용하여 호출할 재정의를 결정합니다.

호출이 시작되고 비동기 작업이 수행됩니다. 작업이 완료되면 호출은 작업 결과를 포함하는 IAsyncOperation 개체를 반환합니다. OUT 전송의 경우 개체는 전송에 전송된 바이트 수를 반환합니다. IN 전송의 경우 개체에는 디바이스에서 읽은 데이터가 포함된 버퍼가 포함됩니다.

USB 제어 전송 코드 예제

이 예제 코드는 SuperMUTT 디바이스에서 깜박이는 패턴을 변경하는 컨트롤 전송을 보내는 방법을 보여 줍니다. 전송에 대한 설정 패킷에는 공급업체에서 정의한 명령이 포함되어 있습니다. 예제는 Scenario2_ControlTransfer.cpp.

async Task SetSuperMuttLedBlinkPatternAsync(Byte pattern)
        {
            UsbSetupPacket initSetupPacket = new UsbSetupPacket
            {
                RequestType = new UsbControlRequestType
                {
                    Direction = UsbTransferDirection.Out,
                    Recipient = UsbControlRecipient.Device,
                    ControlTransferType = UsbControlTransferType.Vendor
                },
                Request = SuperMutt.VendorCommand.SetLedBlinkPattern,
                Value = pattern,
                Length = 0
            };

            UInt32 bytesTransferred = await EventHandlerForDevice.Current.Device.SendControlOutTransferAsync(initSetupPacket);

            MainPage.Current.NotifyUser("The Led blink pattern is set to " + pattern.ToString(), NotifyType.StatusMessage);
        }

이 예제 코드는 SuperMUTT 디바이스에서 깜박이는 패턴을 변경하는 컨트롤 전송을 보내는 방법을 보여 줍니다. 전송에 대한 설정 패킷에는 공급업체에서 정의한 명령이 포함되어 있습니다. 예제는 Scenario2_ControlTransfer.cpp.

async Task<IBuffer> SendVendorControlTransferInToDeviceRecipientAsync(Byte vendorCommand, UInt32 dataPacketLength)
 {
    // Data will be written to this buffer when we receive it
    var buffer = new Windows.Storage.Streams.Buffer(dataPacketLength);

    UsbSetupPacket initSetupPacket = new UsbSetupPacket
    {
        RequestType = new UsbControlRequestType
        {
            Direction = UsbTransferDirection.In,
            Recipient = UsbControlRecipient.Device,
            ControlTransferType = UsbControlTransferType.Vendor,
        },
        Request = vendorCommand,
        Length = dataPacketLength
    };

    return await EventHandlerForDevice.Current.Device.SendControlInTransferAsync(initSetupPacket, buffer);
}