Bios ehci hand off что это
Для управления шиной USB на материнской плате используется специальный контроллер. В случае с USB 2.0 это EHCI (Enhanced Host Controller Interface или «улучшенный интерфейс хост-контроллера»), совместимый с устаревшими USB-устройствами 1.0. Разработка стандарта USB 3.0 стала причиной появления нового контроллера — XHCI (eXtensible Host Controller Interface или «расширяемого интерфейса хост-контроллера»).
XHCI-контроллер совместим с устройствами USB 2.0 и с USB 1.0. В настройках BIOS доступен, как минимум, один параметр, связанный с контроллером XHCI: XHCI Hand-off. В этой статье вы узнаете что это за параметр и как его настроить.
Что такое XHCI Hand-off BIOS?
Как и EHCI Hand-off, параметр XHCI Hand-off отвечает за передачу управления контроллером шины USB от BIOS операционной системе. В противном случае могут перестать работать порты USB 3.0, ОС может перестать загружаться или будет работать крайне нестабильно. Для современных операционных систем параметр XHCI Hand-off в настройках BIOS должен быть включён. Обычно, по умолчанию так и есть. Этот параметр может понадобиться отключить для установки, например MacOS в редакции хакинтош.
Параметр XHCI Hand-off чаще всего находится на вкладке Advanced. Для материнских плат MSI нужно открыть меню Settings, затем Конфигурация USB:
Здесь кликните по параметру XCHI Hand-off и выберите Enabled для включения или Disabled для отключения.
Установив требуемое значение с помощью всплывающего меню, закройте редактор настроек BIOS, сохранив внесённые изменения. Новые настройки вступят в силу после перезагрузки компьютера. На этом настройка XHCI Hand-off завершена.
Выводы
В этой статье мы рассмотрели вопрос о том, что такое XHCI Hand-off в биосе, узнали как его настраивать. Обращаем внимание на то, что параметр активирован по умолчанию, его отключение скорее всего приведёт к проблемам в работе устройств USB если операционная система которую вы используете явно не требует его отключения.
В BIOS любой современной материнской платы, как правило, существует немало опций, связанных с настройкой внешней шины USB (Universal Serial Bus). Опция BIOS EHCI Hand-Off предназначена для включения или выключения особой функции, относящейся к работе расширенного контроллера шины EHCI. Возможными значениями опции являются лишь два варианта – Enabled (Включено) и Disabled (Выключено).
Принцип работы
Всем пользователям персонального компьютера, наверное, прекрасно известна шина USB, которая предоставляет возможность для подключения разнообразных периферийных устройств Plug-and-Play. Спецификация 2.0 шины, увидевшая свет в 2000 г., позволила устройствам передавать данные по ней с высокой скоростью – до 480 Мбит/c.
Работой USB управляет контроллер, расположенный на материнской плате. В частности, для реализации возможностей USB спецификации 2.0 был разработан контроллер шины, получивший название EHCI (Enhanced Host Controller Interface, расширенный интерфейс хост-контроллера).
В большинстве современных операционных систем существуют драйверы, которые позволяют ОС самостоятельно управлять контроллером USB. Однако до загрузки операционной системы контроллером данной шины управляет не сама ОС, а БИОС. Управление контроллером шины до загрузки может понадобиться, в частности, для использования накопителей USB, а также устройств ввода-вывода, таких, как мышь и клавиатура. Во время загрузки операционной системы осуществляется передача управления шиной от БИОС к ОС. Для этой цели в контроллере EHCI предусмотрен специальный механизм.
В старых операционных системах, например, в операционных системах, более ранних, чем Windows XP, существовали проблемы с передачей управления контроллером USB 2.0 от BIOS к операционной системе. Эти проблемы могли приводить к тому, что шиной могли управлять одновременно и драйвер BIOS, и драйвер ОС. Излишне говорить, что подобная ситуация нередко приводила к ошибкам в работе устройств, подключаемых к шине, вплоть до зависания ОС и появления «экрана смерти».
Описываемая опция запрещает передачу управления от BIOS к OC, что исключает конфликты, которые могут возникнуть при работе устройств USB. Данная проблема были исправлена с выходом обновления Windows XP – Service Pack 2. Кроме того, от этой проблемы были избавлены и последующие версии Windows, поэтому при использовании современных версий операционных систем Windows надобность во включении этой опции отпадает.
Опцию обычно можно найти в BIOS Setup в специальном разделе, отведенном для настройки параметров USB, который может называться USB Configuration (Конфигурация USB), или иметь подобное этому название.
Стоит ли включать?
Обычно нет особой необходимости во включении опции, поскольку в современных операционных системах, в частности, в операционных системах линейки Windows, таких, как Windows XP SP2 и SP3, Windows Vista, Windows 7 и 8, передача управления шиной USB от BIOS к ОС работает без проблем.
Однако если у вас установлена ОС, более ранняя, чем Windows XP SP2, то опцию лучше всего включить, установив значение Enabled. В противном случае возможны проблемы при работе устройств, использующих шину. По умолчанию данная опция, как правило, также включена.
Другие идентичные по назначению опции: Power Button, Power Button Function, Power Button Mode, PWR Button < 4 Secs.
Опция Soft-Off by Power Button предназначена для выбора режима функционирования кнопки питания на передней панели персонального компьютера. Обычными значениями опции являются варианты Instant-off (Немедленное выключение) и Delay 4 Sec (Задержка в 4 секунды).
Принцип работы
Обычно при нажатии на кнопку Power (Питание) системного блока компьютер полностью выключается (если не доступны возможности управления питанием ACPI и не произведена настройка кнопки при помощи средств ОС, например, при помощи панели управления питанием в Windows). Однако во многих BIOS существует возможность изменить поведение компьютера при нажатии на Power.
В случае выбора варианта опции Instant-off (также Power Off или просто Off) кнопка работает так же, как и обычно, и сразу же выключает компьютер после нажатия на нее. Однако при выборе варианта Delay 4 Sec (также Suspend) поведение компьютера зависит от того, каким образом пользователь нажал на эту кнопку. Если нажатие на кнопку было кратковременным, то компьютер не выключается полностью, а всего лишь переходит в спящий режим, из которого его можно будет вывести нажатием на любую клавишу клавиатуры или с помощью движения мыши.
Полное выключение компьютера после выбора варианта Delay 4 Sec осуществляется только в том случае, если пользователь удерживал Power достаточно длительное время – более 4 секунд.
Эта функция может оказаться полезной, если существует опасность случайного нажатия на кнопку питания и связанного с этим несанкционированного выключения компьютера.
Стоит ли включать опцию?
Это зависит от ваших личных предпочтений и того, что вы считаете удобным. В том случае, если кнопка питания находится в таком месте, в котором ее легко случайно нажать, то имеет смысл включить опцию, установив значение Delay 4 Sec. Кроме того, включение данной опции может принести пользу тогда, когда вы хотите заставить компьютер уходить в спящий режим при помощи Power Button. Стоит отметить, что эта причина может иметь смысл только в том случае, если у вас нет возможности использовать для настройки кнопки питания средства, доступные в операционной системе.
В настройках BIOS присутствует множество непонятных обычному пользователю параметров (в основном, по причине использования аббревиатур). Параметр EHCI Hand-Off — один из таких. Отключив его, вы обнаружите, что некоторые USB-устройства стали работать некорректно или вовсе не реагируют на обращение к ним.
Стоит отметить, что эта статья актуальна для пользователей уже устаревших версий ОС Windows (вышедших до Windows XP SP2), так как в более новых ОС конфигурирование устройств USB с помощью параметра EHCI Hand-Off не требуется.
Что такое параметр EHCI Hand-Off в BIOS?
Для управления шиной USB 2.0 и подключаемыми к ней устройствами на материнской плате предусмотрен специальный контроллер, именуемый EHCI (Enhanced Host Controller Interface или «улучшенный интерфейс хост-контроллера»).
Использование этого контроллера, например, позволяет получать информацию об использовании клавиатуры, отслеживать движение мыши и вообще управлять любыми другими поддерживаемыми USB-устройствами (включая USB-накопители).
Однако в процессе загрузки старых операционных систем (появившихся до Windows XP SP2) имела место одна проблема — BIOS продолжал управлять шиной USB в монопольном режиме. Это приводило иногда к конфликтам и даже полной неработоспособности всех подключаемых USB-устройств, зависаниям и появлению BSOD (синего экрана смерти). Для решения этой проблемы и был разработан механизм передачи управления шиной USB от BIOS операционной системе, называемый EHCI Hand-Off.
EHCI Hand-Off исключает возможность возникновения конфликтов, связанных с контроллером шины USB. В операционных системах, вышедших после Windows XP SP2, эта проблема была исправлена, а сам механизм ECHI Hand-Off перестал быть актуальным.
В редакторе настроек BIOS параметр имеет только два возможных значения: Enabled и Disabled. По умолчанию параметр EHCI Hand-Off всегда включён. Если на компьютере установлена старая ОС (появившаяся до Windows XP SP2), отключать параметр не рекомендуется. Однако если на компьютере установлена более новая ОС, отключить параметр EHCI Hand-Off можно без последствий и риска. Сделать это можно, загрузив редактор настроек BIOS с помощью горячих клавиш (F2 или Del в зависимости от модели материнской платы) сразу после включения компьютера (как только появится на экране появляется логотип производителя материнской платы).
В редакторе настроек BIOS перейдите на вкладку Advanced, найдите параметр EHCI Hand-Off и установите нужное значение с помощью контекстного меню. Завершите работу в редакторе настроек BIOS, сохранив внесённые изменения.
Выводы
Параметр EHCI Hand-Off отвечает за передачу управления шиной USB от BIOS операционной системе. Этот механизм потерял свою актуальность с выходом Windows XP SP2. Во многих современных материнских платах параметр EHCI Hand-Off отсутствует или недоступен для редактирования. В дополнение к нему относительно недавно появился параметр XHCI Hand-Off.
В отличие от EHCI, контроллер XHCI управляет шиной USB 3.0. Часто на материнской плате размещены оба контроллера шины USB — EHCI и XHCI (в связи с наличием портов USB 2.0 и 3.0 для совместимости с моделями очень старого оборудования), а в редакторе настроек BIOS можно также переключать режим работы портов USB с 3.0 на 2.0 при необходимости.
Всех приветствую. Сегодня хочу поделиться опытом и всё-таки по-моему внятно объяснить про такой, на первый взгляд, простой стандарт для 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 контроллера:
Каждый 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. Данная модель показана на следующей схеме:
Так же на будущее хочу сразу предупредить, что Ваш драйвер может работать не правильно из-за такой вот нелепой ситуации: вы инициализировали UHCI, а после чего EHCI, при этом добавили два одинаковых устройства, поставили в регистр порта бит Port Owner Control, после чего UHCI перестал работать, из-за того, что EHCI автоматически перетягивает порт на себя, а порт на UHCI перестаёт откликаться, эту ситуацию надо отслеживать.
Так же, давайте рассмотрим схему, показывающую саму архитектуру EHCI:
Справа написано про очереди — о них чуть позже.
Регистры 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 — нет.
Структуры передачи данных и запросов
Организация структуры для обработки запросов включает в себя очередь и трансфер дескрипторы(TDs).
На данный момент мы рассмотрим только 3 структуры.
Последовательный список
Последовательный(Периодичный, Pereodic) список устроен следующим образом:
Как видно на схеме, обработка начинается с получения нужного фрейма из фрейм листа, каждый его элемент занимает 4 байта и имеет следующую структуру:
Как видно на картинке, адрес очереди/трансфер дескриптора выровнен по границе 32 байта, бит 0 означает то, что хост-контроллер не будет обрабатывать данный элемент, биты 3:1 показывают тип того, что будет обрабатывать хост-контроллер: 0 — изосинхронный TD(iTD), 1 — очередь, 2 и 3 в данной статье я рассматривать не буду.
Асинхронная очередь
Хост контроллер обрабатывает данную очередь только тогда, когда фрейм последовательный пустой, либо хост-контроллер обработал весь последовательный список.
Асинхронная очередь представляет собой указатель на очередь, где содержатся другие очереди, которые нуждаются в обработке. Схема:
qTD(Queue Element Transfer Descriptor)
Данный TD имеет следующую структуру:
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 — допустимое количество ошибок. Данная таблица показывает, когда счетчик количества ошибок уменьшается:
Голова очереди
Голова очереди(Queue Head) имеет следующую структуру:
Queue Head Horizontal Link Pointer — указатель на следующую очередь, биты 2:1 имеют следующие значения в зависимости от типа очереди:
Endpoint Capabilities/Characteristics — характеристики очереди:
- Биты 26:16 содержат максимальный размер пакета для передачи
- Бит 14: Data Toggle Control — показывает, где хост-контроллер должен брать изначальное значение Data Toggle, 0 — игнорирует бит DT в qTD, сохраняет бит DT для головы очереди.
- Бит 13:12 — характеристики скорости передачи:
- Биты 11:8 — номер конечной точки, к которой выполняется запрос
- Биты 6:0 — адрес устройства
- Биты 29:23 — номер Хаба
- Биты 22:16 — адрес Хаба
Переходим к самому интересному.
Драйвер EHCI
Начнем с того, какие запросы может выполнять EHCI. Есть 2 типа запросов: Control — а-ля команд, и Bulk — к конечным точкам, для обмена данными, к примеру, абсолютное большинство флешек(USB MassStorage) использует тип передачи данных Bulk/Bulk/Bulk. Мышь и клавиатура для передачи данных тоже используют Bulk — запросы.
Инициализируем EHCI и настраиваем асинхронную и последовательные очереди:
Собственно, код для сброса порта в изначальное состояние:
Control-запрос к устройству:
Код обработки очереди:
И теперь запрос к конечной точке(Bulk-запрос)
Думаю, что тема достаточно интересная, в интернете на русском документаций, описаний и статей на эту тему почти нет, а если есть — очень размыто. Если интересна тема работы с железом и разработки ОС, то есть много чего рассказать.
Читайте также: