
Сегодня совершенно естественно выглядит USB-подключение планшета или смартфона к персональному компьютеру, хотя такой линк обеспечивает лишь частичный обмен ресурсами и далек от совершенства. Аналогично выглядит и подключение USB-устройства к планшету, смартфону, ноутбуку: здесь есть только один монополист (USB-хост), который диктует свои условия и запрещает любую инициативу со стороны подчиненных. Может ли быть иначе?
Да, технология USB Dual Role, внедрение которой началось уже сравнительно давно, позволяет смартфону или планшету выбирать свою роль в процессе обмена данными по универсальной последовательной шине, динамически управляя функциональностью контроллеров, входящих в состав USB-подсистемы. Каким образом могут меняться свойства USB-контроллеров в составе системной логики платформы? Пока доступно два режима, две роли этого интерфейса:
- Режим хост-устройства или host mode, обеспечивает подключение клавиатуры, мыши, флэш-накопителей и других периферийных устройств.
- В режиме функции или function mode, наше мобильное устройство само становится периферией, подключаясь к компьютеру, например для копирования данных.
Архитектура аппаратного обеспечения, в частности современная системная логика Intel, предусматривает разделение USB-подсистемы на два контроллера:
- xHCI (eXtensible Host Controller Interface) реализует USB-хост;
- xDCI (eXtensible Device Controller Interface) реализует USB-функцию или периферийное устройство.
С точки зрения системного программиста, при доступе к конфигурационным и операционным регистрам, данные контроллеры взаимно независимы. При этом физически, оба узла реализуются в составе микросхемы PCH (Platform Controller Hub) системной логики Intel. Добавим, что решения System-on-Chip (SoC), предполагают размещение кристалла PCH в составе одной микросхемы, совмещающей функции центрального процессора и периферийного контроллера.
Рис.1. Согласно документу Intel Atom Processor Z3600 and Z3700 Series Datasheet, системная логика поддерживает USB Device Controller
В чем новшество Windows 10?
Согласно информации базы знаний Microsoft MSDN, операционная система Windows 10 стандартизует модель драйверной подсистемы, обслуживающей функциональность Dual Role USB. В частности, вводится понятие Microsoft USB Role Switch (URS). За данным термином скрывается специальный драйвер, призванный обеспечить бесконфликтное использование заданного USB-порта или группы портов для режимов USB-хоста и USB-функции, выбирая нужный режим в зависимости от типа подключения и передавая порт одному из контроллеров: xHCI или xDCI.
Как известно, основная часть информации MSDN в большей степени ориентирована на программистов, чем на разработчиков аппаратного обеспечения, тем не менее, в материалах упоминается метод детектирования USB-подключения, использующий линию ID pin разъема USB.
- ID=0 (pin grounded) — означает режим host
- ID=1 (pin floated) — означает режим function
Приравнивая неподключенное состояние сигнальной линии к логической «единице», важно не забыть об установке pull-up резистора, соединяющего данную линию с плюсовым проводом источника питания.
Изменение состояния сигнальной линии ID pin сообщает драйверу URS об изменении подключений и требует вмешательства драйвера для перепрограммирования схемы коммутации портов и контроллеров. Именно поэтому документация Microsoft нормирует генерацию сигнала запроса на аппаратное прерывание для обслуживания данного события.
Сложности детектирования
Очевидно, для обнаружения устройства и загрузки драйвера, UEFI firmware платформы должно передать операционной системе информацию об устройстве. Текущая реализация драйвера URS поддерживает детектирование USB-подсистемы посредством интерфейса ACPI (ACPI enumeration). Добавление метода прямого сканирования ресурсов шины PCI (PCI enumeration) планируется в будущих реализациях. Возможно, логическая обособленность контроллеров xHCI и xDCI оказалась несколько неудобным фактом для программистов Microsoft.
Другая возможная причина – необходимость декларирования platform-specific механизмов идентификации типа подключения, использующих сигналы General-Purpose Input Output (GPIO) в качестве упомянутых линий ID pin. В любом случае, есть основания считать, что проблема несовместимости временная.