Xhci pre boot driver что это

Обновлено: 06.07.2024


Всем привет. Мы продолжаем изучать биос, сегодня вот будем знакомиться с такой штукой как XHCI hand-off. Эта штука является пунктом в меню и многие юзеры хотели бы узнать для чего этот пункт. Ну окей, я расскажу. Ну вот я и узнал, короче XHCI hand-off расшифровывается как eXtensible Host Controller Interface, означает типа контроллер универсальной последовательной шины, соответствующий спецификации USB 3.0, короче что-то связанное с USB. И смотрите, вот читаю на асусовском официальном сайте, что если типа вы поставили Windows 7 и у вас не работают USB-порты, то нужно пойти в биос и включить там XHCI hand-off, то есть выбрать Enabled. Такие дела короче.

Вот на другом сайте, на форуме оверклокеров снова читаю, что XHCI Hand-off для Windows 7 просто необходимо включать. Но по умолчанию эта опция и так должна быть включена. А вот если у вас новее винда, ну там Windows 8, Windows 10, то XHCI Hand-off нужно отключать! Это пишет один прошаренный юзер на форуме

Ну а вот пункт XHCI hand-off в самом биосе материнки:


Вот еще пример, тут также еще есть EHCI Hand-off:


В общем ребята. Инфы страшно мало. Толком ничего я не нашел. Но знаю одно, пункты USB 2.0 и USB 3.0 влияют на работу USB-портов, так что если какие-то траблы с USB, то попробуйте пошаманить с этими настройками.

На этом все, прошу прощение что не смог найти инфу по этим пунктам в биосе. Удачи вам и позитива!

Драйвер EHCI

Начнем с того, какие запросы может выполнять EHCI. Есть 2 типа запросов: Control — а-ля команд, и Bulk — к конечным точкам, для обмена данными, к примеру, абсолютное большинство флешек(USB MassStorage) использует тип передачи данных Bulk/Bulk/Bulk. Мышь и клавиатура для передачи данных тоже используют Bulk — запросы.

Инициализируем EHCI и настраиваем асинхронную и последовательные очереди:


Собственно, код для сброса порта в изначальное состояние:


Control-запрос к устройству:


Код обработки очереди:


И теперь запрос к конечной точке(Bulk-запрос)


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

Регистры EHCI контроллера

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

Для начала вам надо получить адрес MMIO, который выдан данному контроллеру, по смещению +0x10 будет лежать адрес наших долгожданных регистров. Есть одно но: сначала идут Capability регистры, а только после них — Operational, поэтому по смещению 0(от предыдущего адреса, который мы получили по смещению 0x10 относительно начала MMIO нашего EHCI) лежит один байт — длина Capability-регистров.

Capability регистры

По смещению 2 лежит регистр HCIVERSION — номер ревизии данного HC, который занимает 2 байта и содержит BCD версию ревизии (что такое BCD можно узнать из википедии).
По смещению +4 лежит регистр HCSPARAMS, его размер — 2 слова, он содержит структурные параметры устройства и его биты показывают следующее:

  • Бит 16 — Port Indicators — доступные световые индикаторы для подключенных USB-устройств.
  • Биты 15:12 — номер контроллера-компаньона, который присвоен данному контроллеру
  • Биты 11:8 — количество портов у компаньон-контроллера
  • Бит 7 — Port Routing Rules — показывает, как данные порты привязаны к компаньон-портам
  • Бит 4 — Port Power Control — показывает, надо ли включать питание каждому порту, 0 — питание подаётся автоматически
  • Биты 3:0 — количество портов у данного контроллера.
  • По смещению +8 лежит регистр HCCPARAMS — показывает параметры совместимости, его биты значат следующее:
  • Бит 2 — доступность асинхронной очереди,
  • Бит 1 — доступность периодической (последовательной) очереди
  • Бит 0 — 64-битная совместимость

Operation регистры

По смещению 0 лежит регистр USBCMD — командный регистр контроллера, его биты означают следующее:

  • Биты 23:16 — Interrupt Threshold Control — показывает сколько микро-фреймов будет использоваться на один обычный фрейм. Чем больше, тем быстрее, но если больше 8 — то микро-фреймы будут обрабатываться с той же скоростью, что и для 8.
  • Бит 6 — прерывание после каждой транзакции в асинхронной очереди,
  • Бит 5 — используется ли асинхронная очередь,
  • Бит 4 — использование последовательной очереди,
  • Биты 3:2 — размер FrameList'a (о этом — дальше). 0 означает 1024 элемента, 1 — 512, 2 — 256, 3 — зарезервировано
  • Бит 1 — устанавливается для выполнение сброса хост-контроллера.
  • Бит 0 — Run/Stop
  • Бит 15 показывает используется ли асинхронная очередь
  • Бит 14 показывает используется ли последовательная очередь,
  • Бит 13 — показывает, что обнаружена пустая асинхронная очередь,
  • Бит 12 установлен в 1, если при обработке транзакции произошла ошибка, тогда хост-контроллер остановит выполнение всех очередей.
  • Бит 4 установлен в 1, если произошла серьезная ошибка, хост-контроллер останавливает выполнение всех очередей.
  • Бит 3 FrameList (Регистр) Rollover — ставится в 1, когда хост-контроллер обработал весь frameList.
  • Бит 1 — USB Error Interrupt — генерировать ли прерывание при ошибках?
  • Бит 0 — USB Interrupt — выставляется после успешной обработки транзакции, если в TD был установлен IOC

По смещению +8 лежит регистр USBINTR — регистр включения прерываний
Чтобы долго не писать, и тем более, Вам долго не читать, значения битов данного регистра можно посмотреть в спецификации, ссылка на неё будет оставлена внизу. Сюда я просто записываю 0, т.к. абсолютно не имею желания писать обработчики, мапить прерывания и т.п., так что это я считаю почти что абсолютно бессмысленным.

По смещению +12(0x0C) лежит регистр FRINDEX, в котором просто лежит текущий номер фрейма, при чем, хочу заметить, что последние 4 бита показывают номер микро-фрейма, в старшие 28 — номер фрейма (так же значение не обязательно меньше размера frameList'а, если вам нужен индекс — лучше брать его с маской 0x3FF(или же 0x1FF, и т.п.).

Регистр CTRLDSSEGMENT лежит по смещению +0x10, он показывает хост-контроллеру старшие 32 бита адреса листа фреймов.

Регистр PERIODICLISTBASE имеет смещение +0x14, в него вы можете положить младшие 32 бита листа фреймов, заметим, что адрес должен быть выравнен по размеру страницы памяти (4096).

Регистр ASYNCLISTADDR имеет смещение +0x18, в него вы можете положить адрес асинхронной очереди, заметим, что он должен быть выравнен по границе 32 байта, при этом должен находиться в первых четырех гигабайтах физической памяти.

Регистр CONFIGFLAG показывает, настроено ли устройство. Вы должны выставить бит 0 после завершения настройки устройства, он имеет смещение +0x40.

Перейдем к регистрам портов. Каждый порт имеет свой командно-статусный регистр, каждый регистр порта располагается со смещением +0x44 + (PortNumber — 1)*4, его биты значат следующее:

  • Бит 12 — питание порта, 1 — питание подаётся, 0 — нет.
  • Бит 8 — Port Rest — устанавливается для сброса устройства.
  • Бит 3 — Port Enable/Disable Change — выставляется при изменении статуса «включенности» порта.
  • Бит 2 — порт включен/не включен.
  • Бит 1 — Изменение статуса подключения, ставится в 1, к примеру, если вы подключили, или отключили USB устройство.
  • Бит 0 — статус подключения, 1 — подключено, 0 — нет.

Особенности AMI UEFI firmware

В одной из предыдущих публикаций[1] мы затронули такой, казалось бы, очевидный вопрос: «Как убедиться в том, что флешка работает в USB 3.0?» Голоса в обсуждении сначала ехидно отметили, что той статье не хватает тэга «садомазо», а затем как бы испугавшись собственного эго, вычеркнули эту мысль из нашего сознания.

image


Рис 1. Эксперименты с утилитой CheckUSB на ноутбуке ASUS T300LA

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

Опция xHCI Pre-Boot Mode в установках UEFI firmware


Рис 2. Опция xHCI Pre-Boot Mode в установках UEFI firmware ноутбуке ASUS T300LA

USB Routing to EHCI

Например, если в CMOS Setup исходное состояние опции xHCI Pre-Boot Mode установлено Disable, заменяем на Smart Auto, и не загружая операционную систему запускаем утилиту CheckUSB, то видим, что список устройств, подключенных к контроллеру xHCI пуст. Это означает, что для обслуживания подключенных USB-устройств используется контроллер EHCI.

Рис 3. Подключение USB-устройств к Enhanced Host Controller Interface на ноутбуке ASUS N750JK до запуска Windows

  • USB 2.0 Port Routing = 0, 14 соединений USB2 подключены к EHCI
  • USB 3.0 Port SuperSpeed Enable = 0, 4 соединения USB3 отключены
  • USB 2.0 Port Routing Mask = 00003FFFh
  • USB 3.0 Port Routing Mask = 0000000Fh

USB Routing to xHCI

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

Рис 4. Подключение USB-устройств к eXtensible Host Controller Interface на ноутбуке ASUS N750JK при загрузке после Windows

EHCI по-людски на русском языке

image

Всех приветствую. Сегодня хочу поделиться опытом и всё-таки по-моему внятно объяснить про такой, на первый взгляд, простой стандарт для USB 2.0 хост-контроллера.

Изначально можно представить себе что USB 2.0 порт — это всего лишь 4 пина, по двум из которых просто передаются данные(Как, к примеру, COM-порт), но самом деле всё не так, и даже совсем наоборот. USB-контроллер в принципе не даёт нам возможности передавать данные как через обычный COM-порт. EHCI — довольно замысловатый стандарт, который позволяет обеспечить надежную и быструю передачу данных от софта до самого девайса, и в обратную сторону.

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

Что такое EHCI

Что же, давайте начнем. EHCI — Enhanced Host Controller Interface, предназначен для передачи данных и управляющих запросов USB-устройствам, и в другую сторону, а в 99% случаев — является связующим звеном, между каким-либо софтом и физическим устройством. EHCI работает как PCI-устройство, а соответственно использует MMIO(Memory-Mapped-IO) для управления контроллером(да-да, я знаю, что некоторые PCI-девайсы используют порты, но тут я всё обобщил). В документации от Intel описан лишь принцип работы, и никаких намеков на алгоритмы, написанные хотя бы на псевдокоде, нет вовсе. EHCI имеет 2 типа MMIO-регистров: Capability и Operational. Первые служат для получения характеристик контроллера, вторые же — для его управления. Собственно, прикреплю саму суть связи софта и EHCI контроллера:

image

Каждый EHCI контроллер имеет несколько портов, каждому из которых могут быть подключены какие-либо USB-устройства. Так же, прошу заметить, что EHCI является улучшенной версией UHCI, который так же был разработан Intel на несколько годов раньше. Для обратной совместимости любой UHCI/OHCI контроллер, который имеет версию ниже, чем EHCI, будет компаньоном к EHCI. К примеру, у вас есть USB-клавиатура(А большинство клавиатур года так до сих пор были именно такими), которая работает на USB 1.1(заметим, что максимальная скорость работы USB 1.1 — 12 мегабит в секунду, а FullSpeed USB 2.0 имеет пропускную способность аж в 480 мбит/сек), а у Вас имеется компьютер с USB 2.0 портом, при подключении клавиатуры к компьютеру хост-контроллер EHCI как ни как будет работать с USB 1.1. Данная модель показана на следующей схеме:

image

Так же на будущее хочу сразу предупредить, что Ваш драйвер может работать не правильно из-за такой вот нелепой ситуации: вы инициализировали UHCI, а после чего EHCI, при этом добавили два одинаковых устройства, поставили в регистр порта бит Port Owner Control, после чего UHCI перестал работать, из-за того, что EHCI автоматически перетягивает порт на себя, а порт на UHCI перестаёт откликаться, эту ситуацию надо отслеживать.

Так же, давайте рассмотрим схему, показывающую саму архитектуру EHCI:

image

Справа написано про очереди — о них чуть позже.

Структуры передачи данных и запросов

Организация структуры для обработки запросов включает в себя очередь и трансфер дескрипторы(TDs).

На данный момент мы рассмотрим только 3 структуры.

Последовательный список

Последовательный(Периодичный, Pereodic) список устроен следующим образом:

image

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

image

Как видно на картинке, адрес очереди/трансфер дескриптора выровнен по границе 32 байта, бит 0 означает то, что хост-контроллер не будет обрабатывать данный элемент, биты 3:1 показывают тип того, что будет обрабатывать хост-контроллер: 0 — изосинхронный TD(iTD), 1 — очередь, 2 и 3 в данной статье я рассматривать не буду.

Асинхронная очередь

Хост контроллер обрабатывает данную очередь только тогда, когда фрейм последовательный пустой, либо хост-контроллер обработал весь последовательный список.

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

image

qTD(Queue Element Transfer Descriptor)

Данный TD имеет следующую структуру:

image

Next qTD Pointer — указатель на продолжение очереди для обработки(для Horizontal Execution), бит 0 Next qTD Pointer'а показывает, то, что дальше нет еще одной очереди.
qTD Token — токен TD, показывает параметры передачи данных:

  • Бит 31 — Data Toggle (об этом дальше)
  • Биты 30:16 — количество данных для передачи, после завершения транзакции их значение уменьшается на количество переданных данных.
  • Бит 15 — IOC — Interrupt On Complete — вызвать прерывание после завершения обработки дескриптора.
  • Биты 14:12 показывают номер текущего буфера, в который/из которого производиться обмен данными, об этом далее.
  • Биты 11:10 — допустимое количество ошибок. Данная таблица показывает, когда счетчик количества ошибок уменьшается:

image

Голова очереди

Голова очереди(Queue Head) имеет следующую структуру:

image

Queue Head Horizontal Link Pointer — указатель на следующую очередь, биты 2:1 имеют следующие значения в зависимости от типа очереди:

image

Endpoint Capabilities/Characteristics — характеристики очереди:

image

  • Биты 26:16 содержат максимальный размер пакета для передачи
  • Бит 14: Data Toggle Control — показывает, где хост-контроллер должен брать изначальное значение Data Toggle, 0 — игнорирует бит DT в qTD, сохраняет бит DT для головы очереди.
  • Бит 13:12 — характеристики скорости передачи:
  • Биты 11:8 — номер конечной точки, к которой выполняется запрос
  • Биты 6:0 — адрес устройства
  • Биты 29:23 — номер Хаба
  • Биты 22:16 — адрес Хаба

Переходим к самому интересному.

Что делает настройка BIOS в режиме предварительной загрузки XHCI?

У меня есть настройки BIOS, называемые режимом предварительной загрузки XHCI. Если у меня включен этот USB-устройства, которые не подключены при загрузке, никогда не распознаются, если я установил его на Отключено, то USB-устройства работают нормально. Краткое описание BIOS гласит: «Включите эту опцию, если вам нужна поддержка USB3.0 в DOS». Что я не делаю, но он также говорит: «Пожалуйста, обратите внимание, что контроллер XHCI будет отключен, если вы установите этот пункт как Отключено». Значит ли это, что USB3 отключен с этой опцией? Вот изображение экрана:

Asus UX32VD Расширенный экран USB BIOS

ОБНОВЛЕНИЕ I Последующее обновление BIOS, по-видимому, устранило эту проблему, поскольку устройства USB работают, даже если они не подключены при загрузке с включенным параметром.

Исходя из общего признака того, что USB-устройства не работают при включенном XHCI, может показаться, что ваша ОС имеет драйверы USB 2.0, но не драйверы USB 3.0.

Что делает этот тип настройки BIOS? Я нашел хорошую сводку вариантов подобной настройки BIOS 'XHCI Mode' в посте пользователя tonymac a6f691ac :

Режим XHCI = отключено - встроенный порт USB 3.0 работает как порт 2.0

Режим XHCI = включен - встроенный порт USB 3.0 работает как порт 3.0

Режим XHCI = Авто - встроенный порт USB 3.0 функционирует как порт 2.0 до загрузки драйвера ОС USB 3.0. Если вы перезагрузите ОС, встроенный порт USB 3.0 снова будет функционировать как порт 2.0 во время этой фазы перезагрузки BIOS до загрузки драйвера ОС USB 3.0.

Режим XHCI = Smart Auto - встроенный порт USB 3.0 функционирует как порт 2.0 до загрузки драйвера ОС USB 3.0. Если вы перезагружаете ОС, во время этой фазы перезагрузки BIOS будет достаточно «умным», чтобы избежать снижения производительности порта USB 3.0 до уровня 2.0 до загрузки драйвера ОС USB 3.0. Таким образом, Smart Auto работает быстрее, чем Auto при 2-й загрузке и позже, но Enabled работает быстрее, если вы уверены, что в ОС установлен драйвер USB 3.0, потому что это позволяет избежать переключения. Создание встроенного порта USB 3.0, например, порта 2.0, в основном для поддержки установки ОС или поддержки ОС, в которой нет встроенного драйвера USB 3.0, чтобы клавиатура USB все еще работала, если пользователь подключил USB клавиатура или любые другие USB-устройства в порты USB 3.0 перед установкой ОС с драйвером USB 3.0 поставляются вместе с материнской платой.

Фон:

Каждая основная версия USB использует новый программный интерфейс на контроллере USB (1.x: UHCI / OHCI, 2.x: EHCI: 3.x: XHCI), каждый из которых несовместим с драйверами для предыдущей версии. Новые USB-контроллеры прекрасно работают со старыми USB-периферийными устройствами, поэтому у компьютера нет причин иметь что-либо, кроме новейшего USB-оборудования - при условии, что он полностью соответствует необходимым драйверам.

Тем не менее, при установке ОС, существует вероятность возникновения проблемы, когда у вас есть драйверы, но они не встроены в установку ОС, и у вас нет способа завершить установку ОС и получить драйверы для системы, кроме использования оборудования, для которого предназначены драйверы.

Чтобы обойти это для USB, системы либо включают в себя выделенные старые порты (например, выделенные порты USB 2 в системе, в которой также есть порты USB 3), либо они помещают такой выбор в BIOS, который позволяет менять порты для использования более старый стандарт интерфейса на стороне компьютера, а затем, когда вы включили ОС и скопировали в систему обновленный установщик драйвера USB, вы можете вернуться обратно, установить обновленные драйверы USB, и теперь все работает на новейшем более быстром USB версия.

Различные настройки «Авто» выглядят как попытка предоставить конфигурацию BIOS, которая обычно работает на полной скорости без необходимости изменения настроек BIOS во время установки. Это, по-видимому, позволяет экономить на обращениях в службу технической поддержки от отдельных владельцев, которые переустанавливают свои ОС, а также в соответствии с централизованно администрируемыми средами, в которых все установки ОС выполняются с помощью удаленной загрузки по сети и что-то вроде изменения настроек BIOS на отдельном компьютере частично через Процесс установки будет нецелесообразным.

Читайте также: