USB/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
mNo edit summary
Line 103: Line 103:
Основная сложность реализации поддержки USB состоит в большом количестве абстракций, связанных с передачей данных по шине USB. В связи с этим существует необходимость в упрощенном и структурированном изложении теории. Предлагается разделить теорию на уровни в порядке увеличения сложности абстракций.
Основная сложность реализации поддержки USB состоит в большом количестве абстракций, связанных с передачей данных по шине USB. В связи с этим существует необходимость в упрощенном и структурированном изложении теории. Предлагается разделить теорию на уровни в порядке увеличения сложности абстракций.
=== Уровень 0. Регистры хост-контроллера. ===
=== Уровень 0. Регистры хост-контроллера. ===
Драйвер хост-контроллера USB управляет его работой с помощью регистров. Существует два вида регистров хост-контроллера USB:
* Регистры конфигурационного пространства [[PCI/ru|PCI]]
* Регистры пространства ввода/вывода
Работа с регистрами конфигурационного пространства PCI не безопасна, т.к. может привести к зависанию ОС. Поэтому будут рассмотрены только регистры пространства ввода/вывода.
Доступ к регистрам пространства ввода/вывода, осуществляется через группу портов ввода/вывода, базовый адрес которых задан в конфигурационном регистре '''USBBaseAddress'''.
{| class="wikitable" border="1"
|-
! Смещение
! Размер
! Доступ
! Мнемоника
! Наименование регистра
|-
| 00h
| WORD
| R/W
| USBCMD
| Регистр команды USB
|-
| 02h
| WORD
| R/WC
| USBSTS
| Регистр состояния USB
|-
| 04h
| WORD
| R/W
| USBINTR
| Регистр управления прерываниями USB
|-
| 06h
| WORD
| R/W
| FRNUM
| Регистр номера кадра USB
|-
| 08h
| DWORD
| R/W
| FLBASEADD
| Регистр базового адреса списка кадров USB
|-
| 0Ch
| BYTE
| R/W
| SOFTMOD
| Регистр модификатора начала кадра USB
|-
| 10h
| WORD
| R/WC
| PORTSC0
| Регистр состояния и управления порта 0
|-
| 12h
| WORD
| R/WC
| PORTSC1
| Регистр состояния и управления порта 1
|}
====Регистр команды USB====
====Регистр состояния USB====
====Регистр управления прерываниями USB====
====Регистр номера кадра USB====
====Регистр базового адреса списка кадров USB====
====Регистр модификатора начала кадра USB====
====Регистр состояния и управления порта 0====
====Регистр состояния и управления порта 1====
=== Уровень 1. Структуры данных хост-контроллера. ===
=== Уровень 1. Структуры данных хост-контроллера. ===
=== Уровень 2. Запросы к устройствам USB. ===
=== Уровень 2. Запросы к устройствам USB. ===

Revision as of 00:39, 16 July 2010

Шина USB

USB (Template:Lang-en — «универсальная последовательная шина») — последовательный интерфейс передачи данных для среднескоростных и низкоскоростных периферийных устройств в вычислительной технике. Символом USB являются четыре геометрические фигуры: большой круг, малый круг, треугольник и квадрат, расположенные на концах древовидной блок-схемы.

Разработка спецификаций на шину USB производится в рамках международной некоммерческой организации USB Implementers Forum (USB-IF), объединяющей разработчиков и производителей оборудования с шиной USB.

Для подключения периферийных устройств к шине USB используется четырёхпроводный кабель, при этом два провода (витая пара) в дифференциальном включении используются для приёма и передачи данных, а два провода — для питания периферийного устройства. Благодаря встроенным линиям питания USB позволяет подключать периферийные устройства без собственного источника питания (максимальная сила тока, потребляемого устройством по линиям питания шины USB, не должна превышать 500 мА).

В настоящее время широко используются устройства, выполненные в соответствии со спецификацией USB 2.0. Ведётся внедрение в производство устройств спецификации USB 3.0.

Архитектура шины

К одному контроллеру шины USB можно подсоединить до 127 устройств по топологии многоярусной звезды, в том числе и концентраторы (хабы). На одной шине USB может быть до 127 устройств и до 5 уровней каскадирования хабов, не считая корневого.

История

Предварительные версии

  • USB 0.7: спецификация выпущена в ноябре 1994 года.
  • USB 0.8: спецификация выпущена в декабре 1994 года.
  • USB 0.9: спецификация выпущена в апреле 1995 года.
  • USB 0.99: спецификация выпущена в августе 1995 года.
  • USB 1.0 Release Candidate: спецификация выпущена в ноябре 1995 года.

USB 1.0

Спецификация выпущена 15 января 1996 года.

Технические характеристики:

  • два режима передачи данных:
    • режим с высокой пропускной способностью (Full-Speed) — 12 Мбит/с
    • режим с низкой пропускной способностью (Low-Speed) — 1,5 Мбит/с
  • максимальная длина кабеля для режима с высокой пропускной способностью — 5 м USB Cable: Maximum Cable Length
  • максимальная длина кабеля для режима с низкой пропускной способностью — 3 м
  • максимальное количество подключённых устройств (включая размножители) — 127
  • возможно подключение устройств, работающих в режимах с различной пропускной способностью к одному контроллеру USB
  • напряжение питания для периферийных устройств — 5 В
  • максимальный ток, потребляемый периферийным устройством — 500 мА

USB 1.1

Спецификация выпущена в сентябре 1998 года. Исправлены проблемы и ошибки, обнаруженные в версии 1.0. Первая версия, получившая массовое распространение.

USB 2.0

Спецификация выпущена в апреле 2000 года.

USB 2.0 отличается от USB 1.1 введением режима Hi-speed.

Для устройств USB 2.0 регламентировано три режима работы:

  • Low-speed, 10—1500 Кбит/c (используется для интерактивных устройств: клавиатуры, мыши, джойстика)
  • Full-speed, 0,5—12 Мбит/с (аудио-, видеоустройства)
  • Hi-speed, 25—480 Мбит/с (видеоустройства, устройства хранения информации)

Последующие модификации

Последующие модификации к спецификации USB публикуются в рамках Извещений об инженерных изменениях (ECN). Самые важные из модификаций ECN представлены в наборе спецификаций USB 2.0 (USB 2.0 specification package), доступном на сайте USB Implementers Forum.

  • Mini-B Connector ECN: извещение выпущено в октябре 2000 года.
  • Errata, начиная с декабря 2000: извещение выпущено в декабре 2000 года.
  • Pull-up/Pull-down Resistors ECN: извещение выпущено в мае 2002 года.
  • Errata, начиная с мая 2002: извещение выпущено в мае 2002 года.
  • Interface Associations ECN: извещение выпущено в мае 2003 года.
    • Были добавлены новые стандарты, позволяющие ассоциировать множество интерфейсов с одной функцией устройства.
  • Rounded Chamfer ECN: извещение выпущено в октябре 2003 года.
  • Unicode ECN: извещение выпущено в феврале 2005 года.
    • Данное ECN специфицирует, что строки закодированы с использованием UTF-16LE.
  • Inter-Chip USB Supplement: извещение выпущено в марте 2006 года.
  • On-The-Go Supplement 1.3: извещение выпущено в декабре 2006 года.
    • USB On-The-Go делает возможным связь двух USB-устройств друг с другом без отдельного USB-хоста. На практике одно из устройств играет роль хоста для другого.

USB OTG

USB OTG (аббр. от On-The-Go) — дальнейшее расширение спецификации USB 2.0, предназначенное для лёгкого соединения периферийных USB-устройств друг с другом без необходимости подключения к ПК. Например, цифровой фотоаппарат можно подключать к фотопринтеру напрямую, если они оба поддерживают стандарт USB OTG. К моделям КПК и коммуникаторов, поддерживающих USB OTG, можно подключать некоторые USB-устройства. Обычно это флэш-накопители, цифровые фотоаппараты, клавиатуры, мыши и другие устройства, не требующие дополнительных драйверов. Этот стандарт возник из-за резко возросшей в последнее время необходимости надёжного соединения различных устройств без использования ПК.

Хотя соединение USB OTG выглядит как одноранговое, на самом деле только создаётся такое ощущение — в действительности устройства сами определяют, какое из них будет мастер-устройством, а какое — подчинённым. Одноранговый интерфейс USB существовать не может.

USB Wireless

frame|Логотип USB wireless

USB wireless — технология USB (официальная спецификация доступна с мая 2005 года), позволяющая организовать беспроводную связь с высокой скоростью передачи информации (до 480 Мбит/с на расстоянии 3 метра и до 110 Мбит/с на расстоянии 10 метров).

23 июля 2007 года USB Implementers Forum (USB-IF) объявила о сертификации шести первых потребительских продуктов с поддержкой Wireless USB. terralab.ru Wireless USB: первые шаги

USB 3.0

Окончательная спецификация USB 3.0 появилась в 2008 году. Созданием USB 3.0 занимались компании Intel, Microsoft, Hewlett-Packard, Texas Instruments, NEC и NXP Semiconductors.
В спецификации USB 3.0 разъёмы и кабели обновлённого стандарта физически и функционально совместимы с USB 2.0. Кабель USB 2.0 содержит в себе четыре линии — пару для приёма/передачи данных, плюс и ноль питания. В дополнение к ним USB 3.0 добавляет еще четыре линии связи (две витых пары), в результате чего кабель стал гораздо толще. Hовые контакты в разъемах USB 3.0 расположены отдельно от старых на другом контактном ряду. Теперь можно будет с лёгкостью определить принадлежность кабеля к той или иной версии стандарта, просто взглянув на его разъём. Спецификация USB 3.0 повышает максимальную скорость передачи информации до 5,0 Гбит/с — что более чем на порядок больше 480 Мбит/с, которые может обеспечить USB 2.0.
Версия 3.0 может похвастаться не только более высокой скоростью передачи информации, но и увеличенной силой тока с 500 мА до 900 мА. Отныне пользователь может не только подпитывать от одного хаба большее количество устройств, но и сами устройства во многих случаях смогут избавиться от отдельных блоков питания.

Компания Asus выпустила материнскую плату P6X58 Premium, у которой есть два USB 3.0 порта. А компания Gigabyte выпустила первую материнскую плату с поддержкой USB 3.0 и SATA 6Gb/s для процессоров AMD — Gigabyte GA-790FXTA-UD5.Порты USB 3.0 на материнской плате синего цвета.

В блоге разработчика Linux USB subsystem Sarah Sharp объявлено о поддержке USB 3.0 ядром Linux.

Фирмой Intel анонсирована предварительная версия программной модели контроллера USB 3.0 http://www.intel.com/technology/usb/xhcispec.htm Intel анонсировала предварительную версию программной модели контроллера USB 3.0.
Но в октябре 2009 года появилась информация (от EE Times со ссылкой на сотрудника одной из крупнейших компаний по производству персональных компьютеров), что корпорация Intel решила повременить с внедрением поддержки USB 3.0 в свои чипсеты до 2011 г. Это решение приведет к тому, что данный стандарт не станет массовым ещё как минимум год. http://www.telecomnews.ru/news/21/3452/ USB 3.0 под угрозой

Теория

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

Уровень 0. Регистры хост-контроллера.

Драйвер хост-контроллера USB управляет его работой с помощью регистров. Существует два вида регистров хост-контроллера USB:

  • Регистры конфигурационного пространства PCI
  • Регистры пространства ввода/вывода

Работа с регистрами конфигурационного пространства PCI не безопасна, т.к. может привести к зависанию ОС. Поэтому будут рассмотрены только регистры пространства ввода/вывода.

Доступ к регистрам пространства ввода/вывода, осуществляется через группу портов ввода/вывода, базовый адрес которых задан в конфигурационном регистре USBBaseAddress.

Смещение Размер Доступ Мнемоника Наименование регистра
00h WORD R/W USBCMD Регистр команды USB
02h WORD R/WC USBSTS Регистр состояния USB
04h WORD R/W USBINTR Регистр управления прерываниями USB
06h WORD R/W FRNUM Регистр номера кадра USB
08h DWORD R/W FLBASEADD Регистр базового адреса списка кадров USB
0Ch BYTE R/W SOFTMOD Регистр модификатора начала кадра USB
10h WORD R/WC PORTSC0 Регистр состояния и управления порта 0
12h WORD R/WC PORTSC1 Регистр состояния и управления порта 1

Регистр команды USB

Регистр состояния USB

Регистр управления прерываниями USB

Регистр номера кадра USB

Регистр базового адреса списка кадров USB

Регистр модификатора начала кадра USB

Регистр состояния и управления порта 0

Регистр состояния и управления порта 1

Уровень 1. Структуры данных хост-контроллера.

Уровень 2. Запросы к устройствам USB.

Список типов запросов

Стандартные дескрипторы USB

Обзор поддержки USB в различных ОС

Практическая реализация

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

Реализация драйвера хост-контроллера USB

Общая схема работы драйвера

I. Настройка хоста (Setup stage)

  *A. proc detectHC ; (Поиск хост-контроллера)
     **1. Поиск хост-контроллеров (далее ХК) на шине PCI, определение типов
          найденных контроллеров, различной информации о них как о PCI устройствах 
          (в том числе базового адреса ввода/вывода, номера IRQ и т.д.).
     **2. Вызов функции инициализации ХК в зависимости от типа (detectUHCI, detectOHCI,
          detectEHCI, detectXHCI).
     **3. Установить обработчик прерываний для ХК и включить это прерывание.
     **4. Занести все найденные ХК в специальный список хост-контроллеров USB.
  *B. proc detectUHCI ; (Инициализация UHCI ХК)
     **1. Выделить память под ХК.
     **2. Сделать ХК мастером на шине PCI и включить (enable) его.
     **3. Отключить firmware (Disable legacy support).
     **4. Вызов функции установки ХК (setupHC)
  *C. proc usbInterrupt ; (Обработчик IRQ. Вешается на все ХК вне зависимости от номера IRQ)
     **1. Определяем номер сработавшего прерывания (IRQ).
     **2. Находим в списке ХК - владельца этого прерывания.
     **3. Вызываем соответствующую этому ХК функцию-"подобработчика" прерывания.
  *D. proc setupHC stdcall, controller:dword  ; (Установка хост контроллера)
     **1. Сбросить контроллер (stdcall resetHC, [controller]).
     **2. Подождать 1 секунду.
     **3. Проверить регистры состояния портов 0 и 1, если к порту подключено устройство, 
          то включить этот порт (portEnable).
     **4. Установить маску прерываний.
     **5. Выделить память под структуры данных ХК (stdcall allocUHCIMemory, [controller]).
     **6. Установить заголовки очередей (queue heads).
     **7. Установить указатели списка кадров (frame list pointers) на соответствующие
          заголовки очередей.
     **8. Присвоить регистру базового адреса списка кадров ХК (FrameListBase) физический
          адрес списка кадров.
     **9. Дополнительные настройки (Очистить флаг программной отладки (Clear software 
          debug), установить максимальный размер пакет равным 64 байт и т.д.).
     **10. Записать 0 в регистр номера кадра ХК (FrameNum).
     **11. Подождать 1 секунду.
     **12. Стартовать контроллер.
  *E. proc resetHC stdcall, controller:dword  ; (Сброс хост контроллера)
     **1. Остановить контроллер.
     **2. Установить бит Глобального сброса (GRESET) в регистре комманд ХК (USBCMD).
     **3. Подождать 1 секунду.
     **4. Очистить бит Глобального сброса (GRESET) в регистре комманд ХК (USBCMD).
  *F. proc allocUHCIMemory stdcall, controller:dword  ; (Выделение памяти 
                                          ;  под структуры данных хост контроллера)
     **1. Выделить память под список кадров USB.
     **2. Установить все указатели в списке кадров в значение 1, 
          что означает их недействительность. 
     **3. Выделить память под список заголовков очередей.
     **4. Установить все указатели (link pointer) в списке заголовков очередей в значение 1,
          что означает их недействительность. 

II. Конфигурирование устройств ; (Device Configuration)

  *A. proc deviceEnumeration  ; (Инициализация устройств)
     **1. Увеличить счётчик уникального адреса (далее СУА) для устройств на 1.
     **2. Выделить память под данные об устройстве (usbDevice).
     **3. Заполнить часть данных usbDevice (поля: контроллер, порт, флаг низкоскоростного
          устройства и др.). Присвоить полю usbDevice.address значение 0.
     **4. Установить адрес для устройства равным СУА (запрос SetAddress).
     **5. Присвоить usbDevice.address значение равное СУА.
     **6. Получить первые 8 байт дескриптора устройств (запрос GetDescriptor с параметром
          DEVICE). Тем самым узнать максимальный размер пакета, который поддерживает 
          данное устройство.
     **7. Получить дескриптор устойства в полном объёме (запрос GetDescriptor с параметром
          DEVICE), использовав полученную на предыдущем шаге информацию о максимальном
          размере пакета.
     **8. Если устройство стандарта USB 2.0 и выше, то получить дескриптор качества
          обслуживания устройства (запрос GetDescriptor с параметром QUALITY).
     **9. Получить первый пакет дескриптора конфигурации (запрос GetDescriptor с параметром
          CONFIGURATION), при этом размер пакета должен быть не больше, чем максимальный
          размер пакета для конечной точки 0 (Endpoint0). Тем самым узнать полный размер
          дескриптора.
     **10. Если полный размер дескриптора конфигурации больше чем максимальный размер 
           пакета для конечной точки 0, то получить дескриптор конфигурации на этот раз 
           в полном объёме (запрос GetDescriptor с параметром CONFIGURATION), использовав
           информацию о размере дескриптора конфигурации, полученную на предыдущем шаге.

Практическая реализация на основе схемы

Список терминов

  • К
    • Конечная точка (Endpoint) - это часть устройства USB, которая имеет уникальный идентификатор и является получателем или отправителем информации, передаваемой по шине USB.
    • Корневой хаб (Root Hub) - это хаб, который входит в состав хост-контроллера.
  • Л
    • Логическое устройство USB представляет собой набор конечных точек.
  • С
    • Составное устройство (Compound Device) - это периферийное устройство со встроенным хабом.
  • У
    • Устройство (Device) USB может быть хабом или функцией.
  • Ф
    • Функция (Function) - периферийное устройство или отдельный блок периферийного устройства, способный передавать и принимать информацию по шине USB.
  • Х
    • Хаб (Hub) - устройство обеспечивающее дополнительные точки подключения к шине USB.
    • Хост-контроллер (Host Controller) - часть Южного Моста ПК, управляет работой всех устройств на шине USB.


Список литературы

Ссылки