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

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

Введение

Функция двойной роли USB позволяет системе быть USB-устройством или USB-узлом. Подробные спецификации двойной роли USB можно найти на USB-IF USB-IF на странице сведений о Go .

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

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

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

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

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

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

Драйверы класса USB-узла 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) No Да (с Windows XP)
Сканирование (USBSCAN) No Да (с Windows 2000)
WebCam (USBVIDEO) No Да (с Windows Vista)
Протокол передачи мультимедиа (инициатор MTP) No Да (с Windows Vista)
Удаленные NDIS (RNDIS) No Да (с Windows XP)
IP-адрес через USB (IPoverUSB) No Да (новое для Windows 10)

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

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

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

Примечание.

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

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

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

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

Драйвер коммутатора ролей (URS) Майкрософт позволяет системе реализовать преимущества usb-интерфейса двойной роли для своей платформы.

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

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

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

Архитектура стека драйверов usb-switch.

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

Требования к аппаратному обеспечению

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

  • USB-контроллер

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

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

    Контроллер OTG с высокоскоростным USB-интерфейсом Chipidea. Inbox INF: UrsChipidea.inf.

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

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

      1. Два прерывания, активированные по краю: один из них запускается при срабатывании пин-кода на соединителе, а другой , который запускается при плавающем закреплении идентификатора.
      2. Одно активное прерывание, которое находится на активном уровне при закреплении идентификатора.
  • Перечисление USB-контроллера

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

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

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

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

  • Обнаружение адаптера аксессуаров (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}
        })
    }
}

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

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

  • 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 также может включать драйвер фильтра в пакет драйвера.

См. также