Архитектура стека драйвера двойной роли USB

Контроллеры с двумя ролями USB теперь поддерживаются в Windows, начиная с Windows 10 для классических выпусков (Домашняя, Pro, Корпоративная и Для образовательных учреждений) и Windows 10 Mobile.

Введение

Функция двойной роли USB позволяет системе быть ЛИБО USB-устройством , либо USB-узлом. Подробную спецификацию двойной роли USB можно найти на usb-if на странице Сведений о переходе .

Важно отметить, что функция двойной роли позволяет мобильному устройству, например телефону, фаблету или планшету, обозначать себя как устройство или узел.

Когда мобильное устройство находится в режиме работы , оно присоединяется к компьютеру или другому устройству, которое выступает в качестве узла для подключенного мобильного устройства.

Когда мобильное устройство находится в режиме узла , пользователи могут подключать к нему свои устройства, например мышь или клавиатуру. В этом случае подключенные устройства размещаются на мобильном устройстве.

Предоставляя поддержку двойной роли USB в Windows 10, мы предоставляем следующие преимущества:

  • Подключение к мобильным периферийным устройствам через USB, который обеспечивает большую пропускную способность данных по сравнению с беспроводными протоколами, такими как Bluetooth.
  • Возможность зарядки батареи через USB при подключении к другим USB-устройствам и взаимодействии с ними (при условии, что присутствует необходимая аппаратная поддержка).
  • Включите клиентов, которые, скорее всего, будут владеть мобильными устройствами, такими как смартфоны, для всей работы. Эта функция позволит повысить производительность в сценарии проводной док-станции, где мобильное устройство закрепляет периферийные устройства и, таким образом, размещает периферийные устройства.

В следующей таблице показан список драйверов класса узла , доступных на настольных и мобильных SKU Windows.

Драйверы класса USB Host Windows 10 Mobile Windows 10 для настольных компьютеров
USB-концентраторы (USBHUB) Да Да (начиная с Windows 2000)
HID — клавиатура и мыши (HidClass, KBDCLass, MouClass, KBDHid, MouHid) Да Да (начиная с Windows 2000)
USB Mass Storage (Bulk & UASP) Да Да (начиная с Windows 2000)
Универсальный драйвер узла USB (WinUSB) Да Да (начиная с Windows Vista)
Usb Audio in/out (USBAUDIO) Да Да (начиная с Windows XP)
Последовательные устройства (USBSER) Да Да (с Windows 10)
Bluetooth (BTHUSB) Да Да (начиная с Windows XP)
Печать (usbprint) Нет Да (начиная с Windows XP)
Сканирование (USBSCAN) Нет Да (начиная с Windows 2000)
WebCam (USBVIDEO) Нет Да (начиная с Windows Vista)
Протокол передачи мультимедиа (инициатор MTP) Нет Да (начиная с Windows Vista)
Remote NDIS (RNDIS) Нет Да (начиная с Windows XP)
IP-адрес через USB (IPoverUSB) Нет Да (новые для Windows 10)

Драйверы классов в таблице были выбраны на основе данных телеметрии класса устройства и на основе ключевых сценариев, выбранных для Windows 10. Мы планируем включить ограниченное количество почтовых сообщений, сторонних драйверов узлов для поддержки ключевых устройств на Windows 10 Mobile. А для Windows 10 для настольных компьютеров эти драйверы будут доступны на веб-сайте изготовителя оборудования или через клиентский компонент Центра обновления Windows (WU).

Для Windows 10 Mobile сторонние драйверы, не включенные в папку "Входящие", не будут доступны в WU. Место на диске стека узла USB + HID остается небольшим. Именно поэтому не все драйверы класса, и очень немногие сторонние драйверы включены в папку "Входящие" для Windows 10 Mobile. Изготовитель оборудования, который хочет предоставить сторонние драйверы, может использовать пакет поддержки платы (BSP), чтобы добавить их в образы ОС для мобильных устройств.

В следующей таблице показаны драйверы классов функций , доступные на мобильных SKU Windows.

Примечание

Драйверы функций недоступны в Windows 10 для классических выпусков.

Драйверы класса функций USB Windows 10 Mobile Windows 10 для настольных компьютеров Примечания
Протокол передачи мультимедиа (ответчик MTP) Да Нет Для ответчика MTP на рабочем столе нет сценариев. Сценарии P2P между настольными системами были включены через Easy-MigCable через WinUSB.
Вывод видео (vidstream) Да Нет
Универсальный драйвер функции USB (GenericUSBFn) Да Нет Это потребуется для IPoverUSB и других сценариев мигания на рабочем столе.

Мы будем отслеживать данные вложений устройств, чтобы сообщить нам, нужно ли предоставлять дополнительную поддержку драйверов класса, так как список популярности класса устройств со временем меняется.

Реализация драйвера

Драйвер Microsoft USB Role Switch (URS) позволяет разработчику системы воспользоваться преимуществами возможностей USB с двойной ролью своей платформы.

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

В системе с usb-соединителем micro-AB драйвер использует аппаратные прерывания, которые указывают состояние маркера идентификатора на соединителе. Этот контакт используется для определения того, должен ли контроллер принимать роль узла или роль функции в соединении. Дополнительные сведения см. в спецификации USB On-The-Go. В системах с соединителем USB Type-C поставщик оборудования должен предоставить драйвер клиента соединителя с помощью программных интерфейсов драйвера соединителя USB Type-C. Драйвер клиента взаимодействует с предоставленным корпорацией Майкрософт расширением класса диспетчера USB-соединителей (UcmCx) для управления всеми аспектами соединителя USB Type-C, такими как обнаружение CC, обмен сообщениями с PD и т. д. Для переключения ролей драйвер клиента сообщает о состоянии соединителя USB Type-C драйверу URS.

На следующей схеме показан стек программного драйвера USB для контроллера с двумя ролями, использующего драйвер URS.

архитектура стека драйвера коммутатора ролей usb.

Обратите внимание, что драйвер URS никогда не будет одновременно загружать стеки функций и узлов, показанные на предыдущей схеме. Драйвер URS загрузит либо стек функций, либо стек узлов в зависимости от роли USB-контроллера.

Требования к оборудованию

Если вы разрабатываете платформу, которая будет использовать преимущества драйвера URS для предоставления функций USB с двумя ролями, необходимо выполнить следующие требования к оборудованию:

  • КОНТРОЛЛЕР USB

    Эти драйверы предоставляются корпорацией Майкрософт в качестве встроенных драйверов.

    Контроллер Synopsys DesignWare Core USB 3.0. Входящие INF: UrsSynopsys.inf.

    Chipidea High-Speed USB OTG Controller. Входящие INF: UrsChipidea.inf.

  • Прерывания закрепления идентификатора

    Прерывания контактов идентификатора для систем, отличных от USB Type-C, могут быть реализованы одним из двух способов:

    Два прерывания, активируются ребрами: одно срабатывает при заземленном закреплении идентификатора на соединителе, а другое срабатывает при плавающем контакте идентификатора.

    Одно активное прерывание, которое находится на активном уровне, когда закрепление идентификатора заземлено.

  • Перечисление контроллера USB

    Контроллер с двойной ролью USB должен быть перечислен с помощью ACPI.

  • Поддержка программного обеспечения

    Драйвер URS ожидает программный интерфейс, который позволяет управлять виртуальной шиной через соединитель. Этот интерфейс зависит от SoC. Для получения дополнительных сведений обратитесь к поставщику SoC.

В Windows не поддерживаются следующие функции USB OTG:

  • Обнаружение адаптера зарядного устройства (ACA).
  • Протокол запроса сеанса (SRP).
  • Протокол согласования узла (HNP).
  • Присоединение протокола обнаружения (ADP).

Конфигурация системы ACPI

Чтобы использовать драйвер URS, необходимо создать файл определения ACPI для системы. Кроме того, необходимо учитывать некоторые факторы, связанные с драйвером.

Ниже приведен пример определения ACPI для контроллера с двумя ролами USB.

//
// You may name the device whatever you want; we don't depend on it being called 'URS0'.
//
Device(URS0)
{
    //
    // Replace with your own hardware ID. Microsoft will add it to the inbox INF,
    // or you may choose to author a custom INF that uses Needs & Includes directives
    // to include sections from the inbox INF.
    //
    Name(_HID, "ABCD1234")

    Name(_CRS, ResourceTemplate() {
        //
        // The register space for the controller must be defined here.
        //
        Memory32Fixed(ReadWrite, 0xf1000000, 0xfffff)


        //
        // The ID pin interrupts, if you are using two edge-triggered interrupts.
        //
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1001}
        GpioInt(Edge, ActiveHigh, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x1002}

        //
        // Following is an example of a single active-both interrupt.
        //
        // GpioInt(Edge, ActiveBoth, Exclusive, PullUp, 0, "\\_SB.GPI0", 0, ResourceConsumer, , ){0x12}
        //

        //
        // For a Type-C platform, you do not need to specify any interrupts here.
        //
    })

    //
    // This child device represents the USB host controller. This device node is in effect
    // when the controller is in host mode.
    // You may name the device whatever you want; we don't depend on it being called 'USB0'.
    //
    Device(USB0)
    {
        //
        // The host controller device node needs to have an address of '0'
        //
        Name(_ADR, 0)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt.
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x10}
        })
    }

    //
    // This child device represents the USB function controller. This device node is in effect
    // when the controller is in device/function/peripheral mode.
    // You may name the device whatever you want; we don't depend on it being called 'UFN0'.
    //
    Device(UFN0)
    {
        //
        // The function controller device node needs to have an address of '1'
        //
        Name(_ADR, 1)
        Name(_CRS, ResourceTemplate() {

            //
            // The controller interrupt (this could be the same as the one defined in
            // the host controller).
            //
            Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive, , , ){0x11}
        })
    }
}

Ниже приведены некоторые объяснения для main разделов файла ACPI:

  • URS0 — это определение ACPI для контроллера с двумя ролями USB. Это устройство ACPI, на которое будет загружаться драйвер URS.

  • USB0 и UFN0 являются дочерними устройствами в область URS0. USB0 и UFN0 представляют два дочерних стека, которые будут перечислены драйвером URS, а также стеками узлов и функций соответственно. Обратите внимание, что _ADR — это средство, с помощью которого ACPI сопоставляет эти определения устройств с объектами устройства, создаваемыми драйвером URS.

  • Если контроллер использует одно и то же прерывание для обеих ролей, одно и то же прерывание контроллера можно описать на обоих дочерних устройствах. Даже в этом случае прерывание по-прежнему можно описать как "Монопольное".

  • При необходимости можно добавить в этот файл определения ACPI. Например, можно задать любые другие необходимые методы или свойства на любом из устройств в файле определения ACPI. Такие добавления не помешают работе драйвера URS. Любые дополнительные ресурсы, необходимые в любом из стеков, также можно описать в _CRS соответствующего устройства.

Драйвер URS назначает идентификаторы оборудования стекам узлов и функций. Эти идентификаторы оборудования являются производными от идентификатора оборудования устройства URS. Например, если у вас есть устройство URS с идентификатором оборудования ACPI\ABCD1234, драйвер URS создает идентификаторы оборудования для стеков узлов и функций следующим образом:

  • Стек узлов: URS\ABCD1234&HOST

  • Стек функций: URS\ABCD1234&FUNCTION

Пакеты установки драйвера INF

При необходимости пакеты драйверов сторонних производителей могут зависеть от этой схемы.

Если вы IHV или OEM и вы думаете о предоставлении собственного пакета драйверов, вот некоторые моменты, которые следует учитывать:

  • Пакет драйвера URS

    Ожидается, что идентификатор оборудования для контроллера с двумя ролями на каждой платформе будет добавлен в папку "Входящие" для URS. Однако если по какой-либо причине не удается добавить идентификатор, IHV/OEM может предоставить пакет драйвера с inf-файлом, который требуется или включает inf-файл для папки "Входящие" и соответствует идентификатору оборудования.

    Это необходимо в случае, когда IHV или OEM требует наличия драйвера фильтра в стеке драйверов.

  • Пакет драйвера узла.

    Пакет драйверов, предоставляемый IHV/OEM, который требуется или включает в себя папку "Входящие " usbxhci.inf и соответствует идентификатору оборудования хост-устройства. Соответствие идентификатора оборудования будет основываться на схеме, описанной в предыдущем разделе.

    Это необходимо в случае, когда IHV или OEM требует наличия драйвера фильтра в стеке драйверов.

    Выполняется работа по назначению драйвера URS идентификатора, совместимого с XHCI, для хост-устройства.

  • Пакет драйвера функции

    Пакет драйверов, предоставляемый IHV/OEM, который требуется или включает папку "Входящие" Ufxsynopsys.inf и соответствует идентификатору оборудования периферийного устройства. Соответствие идентификатора оборудования будет основываться на схеме, описанной в предыдущем разделе.

    IHV/OEM также может включать драйвер фильтра в пакет драйверов.

См. также:

Справочник по драйверу контроллера с двумя ролами