Поделиться через


Отправка передачи USB-элемента управления (приложение UWP)

В этой статье показано:

  • Форматирование пакета установки USB
  • Как инициировать передачу USB-элемента управления из приложения

Важные API

Приложение, которое взаимодействует с USB-устройством, обычно отправляет несколько запросов на передачу элементов управления. Эти запросы получают сведения об устройстве и отправляют команды управления, определенные поставщиком оборудования. В этом разделе вы узнаете о передаче элементов управления и о том, как отформатировать и отправить их в приложении UWP.

Передача элемента управления может считывать или записывать сведения о конфигурации или выполнять определенные устройства функции, определенные поставщиком оборудования. Если передача выполняет операцию записи, это передача out; операция чтения— это передача in. Независимо от направления, программное обеспечение, например приложение UWP, на хост-системе всегда создает и инициирует запрос на передачу элемента управления. Иногда приложение может инициировать передачу данных, которые считывают или записывают данные. В этом случае может потребоваться отправить дополнительный буфер.

Для размещения всех типов передачи элементов управления Windows.Devices.Usb предоставляет следующие методы:

передача usb-элементов управления для API среды выполнения Windows для USB.

Передача usb-элементов управления также используется для получения данных дескриптора или отправки стандартных команд. Однако рекомендуется отправлять эти типы запросов, вызывая определенные методы, предоставляемые Windows.Devices.Usb , а не создавать передачу элементов управления вручную. Например, чтобы выбрать альтернативный параметр, вызовите SelectSettingAsync вместо вызова SendControlOutTransferAsync (UsbSetupPacket).

Управление передачей для определенных типов стандартных запросов не поддерживается. Однако если устройство принадлежит классу устройства, поддерживаемому 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 Свойство Description
    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);
}