No Image

Что такое хост контроллер

СОДЕРЖАНИЕ
0 просмотров
22 января 2020

USB — Символ USB USB (ю эс би, англ. Universal Serial Bus «универсальная последовательная шина») последовательный интерфейс передачи данных для среднескоростных и низкоскоростных периферийных … Википедия

Pegasos — Компьютер, построенный на основе материнской платы Pegasos II Pegasos материнская плата на базе процессора PowerPC G3/G4, имеет 3 слота PCI … Википедия

Пегасос — Компьютер, построенный на основе материнской платы Pegasos II Pegasos материнская плата на базе процессора /PCI, 1 слот Ethernet (1Гбит и 10/100Мбит), DDR, AC97 совместимый звук и контроллер Firewire. В духе современных для загрузки системы… … Википедия

AMD Fusion — Информация в этой статье или некоторых её разделах устарела. Вы можете помочь проекту, обновив её и убрав после этого данный шаблон … Википедия

Звуковая плата — Creative Labs Sound Blaster Live! Звуковая плата AdLib … Википедия

RDC Semiconductor — У этого термина существуют и другие значения, см. RDC. RDC Semiconductor Co., Ltd. (коротко RDC) тайваньская компания, основанная в 1997 году. Компания специализируется на выпуске 16/32 битных микропроцессоров и микроконтроллеров с ядром… … Википедия

Звуковая карта — Звуковая плата Creative Labs Sound Blaster Live! … Википедия

Музыкальная плата — Звуковая плата Creative Labs Sound Blaster Live! Дешевая звуковая плата C media с оптическим входом и выходом Звуковая плата (также называемая звуковая карта или музыкальная плата) (англ. sound card) это плата, которая позволяет работать со… … Википедия

FICON — (Fibre Connection) последовательный канал передачи данных, основанный на ANSI стандарте Fibre Channel, введённом международным комитетом IT стандартов INCITS. Впервые был использован в генерациях G5, G6 серверов IBM S/390. FICON реализует… … Википедия

USB Attached SCSI — компьютерный интерфейс для высокоскоростного обмена с USB устройствами хранения, таких как жесткие диски, твердотельные диски и флэш накопители . UAS зависит от протокола USB, и использует стандартные набора команд SCSI. Предназначен для… … Википедия

Advanced Host Controller Interface (AHCI) — механизм, используемый для подключения накопителей информации стандарта Serial ATA, позволяющий пользоваться расширенными функциями, такими, как встроенная очерёдность команд (NCQ) и горячая замена.

AHCI был разработан для механических HDD и при работе с SSD не позволяет использовать все их преимущества, в отличие от NVMe [1]

Описание [ править | править код ]

Протокол AHCI появился в качестве замены устаревшего ATA, который поддерживает совместимость вплоть до оригинальной IBM PC/AT, контроллеры ATA поддерживают прямой доступ к памяти только как дополнение. Другой недостаток ATA — отсутствие возможности горячей замены (при том, что оборудование eSATA её поддерживает) и очередей команд: на одном канале (в случае SATA каждое устройство есть один канал) может одновременно исполняться только одна команда. Таким образом, задействование возможности ATA NCQ невозможно на классическом контроллере ATA даже при поддержке её диском.

До появления AHCI для решения этой проблемы использовались отдельные платы контроллеров (производимые фирмами Promise, HighPoint и другими), часто установленные в материнскую плату наряду с классическим ATА, встроенным в южный мост. Зачастую эти контроллеры воспринимались операционной системой как контроллеры SCSI и поддерживали все богатые возможности протокола SCSI.

Поддержка AHCI существует не во всех чипах южных мостов, но даже при её реализации в чипе производитель материнской платы может не реализовать её в BIOS, и она будет недоступна. Иногда проблема решается обновлением BIOS, существуют неофициальные версии BIOS для многих материнских плат.

Многие контроллеры SATA могут включать простой режим AHCI или с поддержкой RA >[2] .

В некоторых случаях (Asus P5KC) поддержку AHCI невозможно включить на южном мосту, но можно включить на отдельно стоящем чипе, работающем на устаревшем Parallel ATA разъёме внутри корпуса или через внешний eSATA-разъём. Получается, что внутренние жёсткие диски не могут использовать AHCI, а подключённый по eSATA внешний — может.

AHCI, по сути, является стандартизацией дешёвых версий контроллеров, позволяющей обойтись без установки дополнительынх драйверов. AHCI также позволяет использовать твердотельные накопители SSD.

Встроенная поддержка AHCI включена в Mac OS X, начиная с версии 10.4.4 для Intel, Microsoft Windows Vista и последующих (существует также альтернативный драйвер UniATA со свободной лицензией, реализующий поддержку AHCI для версий ОС Windows от Windows NT 3.51 до Windows 7 [3] ), Linux, начиная с ядра 2.6.19 [4] , NetBSD, OpenBSD с версии 4.1, FreeBSD с версии 8.0, Solaris 10 с версии 8/07. Для более старых операционных систем требуется драйвер производителя.

Проблемы использования AHCI в Microsoft Windows [ править | править код ]

При переключении в режим AHCI на уже установленной ОС Windows контроллера SATA, входящего в состав южного моста, произойдет задействование несовместимой логики работы контроллера ЖД — это действие эквивалентно установке в систему платы контроллера ATA, отличного от существующего, и физического переключения загрузочного диска на эту плату.

В этом случае Windows при загрузке не найдёт загрузочный диск и аварийно остановится с BSOD STOP 0x0000007B, INACCESSIBLE_BOOT_DEVICE . Для решения проблемы необходимо до переключения установить в Windows драйвер AHCI.

  • Самый простой способ — перед установкой операционной системы переключить в BIOS жёсткий диск с режима работы «AHCI» (стоит обычно по умолчанию) на « > [источник не указан 2459 дней] .
  • В Windows XP можно включить AHCI вручную (требует копирования msahci.sys и внесения его в реестр в двух местах — в список служб и в CriticalDeviceDatabase ), либо при помощи утилит наподобие nLite драйвер AHCI можно заранее вмонтировать в дистрибутив Windows, что позволит ей сохранить работоспособность при переключении загрузочного диска на контроллер в режиме AHCI. При первой загрузке на новом контроллере диска операционная система определит его как «новое оборудование» и предложит установить драйвер, необходимо согласиться и перезагрузить машину после этого. Кроме того, такой же способ подходит для миграции загрузочного образа операционной системы на совершенно новый контроллер диска, в том числе SCSI — Promise, HighPoint, Adaptec и т. д. Операции необходимо произвести на образе, уже развёрнутом на новый будущий загрузочный диск, в редакторе реестра, используя функцию загрузки ветви реестра (англ. Load Hive ). Многие программы создания/восстановления образов способны делать такое автоматически.
  • В Windows 8 и Windows 10 после включения режима AHCI в BIOS достаточно загрузиться в безопасном режиме, после чего Windows установит необходимые драйверы. В случае, если при загрузке ОС запустить безопасный режим не удается, можно сделать это стандартной программой bcdedit [5] . Если bcdedit не получилось запустить, можно также нажать WIN+R, запустить MSConfig и выбрать на вкладке «загрузка» запуск в безопасном режиме с минимальной конфигурацией.
  • В Windows 7 / Windows Vista перед включением режима AHCI в BIOS необходимо активировать драйвер AHCI (изменить значение в реестре или запустить бесплатную утилиту от Microsoft) [6] .
  • В версиях OS Windows до Windows 7 (Windows XP и младше) до переключения установить драйвер контроллера AHCI], после чего переключить режим SATA в AHCI в BIOS [7] .
  • В некоторых случаях можно установить плату расширения с внешним контроллером SATA, поддерживающим режим AHCI, или разрешить в BIOS дополнительный чип контроллера, обычно работающий на внешний eSATA разъем, после чего ОС установит драйвер такого контроллера, а при дальнейшем переключении загрузочного диска на такой же контроллер сохранит способность к загрузке.
  • Заменить стандартный драйвер контроллера жесткого диска на драйвер UniATA[3] .
Читайте также:  Чем интересна литература 18 века современному читателю

Аппаратная поддержка [ править | править код ]

AHCI встроен в чипсеты Intel начиная с некоторых версий ICH6 и во все чипсеты для платформ Core i3/i5/i7. Для платформ Core AHCI был реализован в следующих контроллерах концентраторов [8] :

Введение

Всех приветствую. Сегодня хочу поделиться опытом и всё-таки по-моему внятно объяснить про такой, на первый взгляд, простой стандарт для 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

.
Далее, по смещению +4 идет регистр USBSTS — статут хост-контроллера,

  • Бит 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 — допустимое количество ошибок. Данная таблица показывает, когда счетчик количества ошибок уменьшается:

Сноска 1 — обнаружение Babble либо Stall автоматически останавливает выполнение головы очереди. Сноска 3 — Ошибки буфера данных — это проблемы с хостом. Они не учитывают повторные попытки устройства.

  • 9:8 — PID Code — тип токена: 0 — токен на вход(от хоста к устройству), 1 — токен на выход(от устройства к хосту), 2 — «SETUP» токен
  • Биты 7:0 показывают статус TD:
    Бит 7 показывает, что данный TD имеет активное состояние(т.е. хост-контроллер обрабатывает данный TD)
    Бит 6 — Halted — показывает, что произошла какая-либо ошибка и выполнение TD остановлено.
    Бит 4 — Babble Detected — количество данных, которые мы отправили устройству, или на оборот, меньше, чем мы передаём, т.е., к примеру, нам устройство отправило 100 байт данных, а мы читаем только 50 байт, а потом еще 50. Бит Halted так же будет установлен, если данный бит установлен в 1.
    Бит 3 — Transaction Error — произошла ошибка во время проведения транзакции.
  • qTD Buffer Page Pointer List — любой из 5 буферов. Содержит ссылку на то, куда в памяти производить транзакцию(отправить данные устройству/принять данные с устройства), все адреса в буферах, кроме первого, должны быть выровнены по размеру страницы (4096 байт).

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

    Голова очереди(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 — адрес устройства

    Endpoint Capabilities: Queue Head DWord 2 — продолжение предыдущего двойного слова:

    • Биты 29:23 — номер Хаба
    • Биты 22:16 — адрес Хаба

    Current qTD Link Pointer — указатель на текущий qTD.

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

    Драйвер EHCI

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

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

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

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

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

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

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

    Комментировать
    0 просмотров
    Комментариев нет, будьте первым кто его оставит

    Это интересно
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    Adblock detector