USB/ru

From KolibriOS wiki
Jump to navigation Jump to search

Шина USB

USB (Universal Serial Bus — «универсальная последовательная шина») — последовательный интерфейс передачи данных для среднескоростных и низкоскоростных периферийных устройств в вычислительной технике. Символом 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

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.
В настоящее время большинство выпускаемых материнских плат содержат контроллеры 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

Предназначен для передачи команд хост-контроллеру. Выполнение команды начинается сразу после её записи в регистр. Регистр доступен для чтения и записи.

Значение битов регистра:

  • 0 RS - запуск/остановка работы хост-контроллера.
  • 1 HCRESET - сброс хост-контроллера.
  • 2 GRESET - глобальный сброс.
  • 3 EGSM - переключение в глобальный режим ожидания.
  • 4 FGR - выход из режима ожидания.
  • 5 SWDBG - переключение в режим отладки.
  • 6 CF - флаг завершения конфигурирования контроллера.
  • 7 MAXP - максимальный размер пакета завершения кадра (0 - 32 байта, 1 - 64 байта).
  • 8-15 -зарезервированы (всегда должны быть сброшены в ноль).

После аппаратного или программного сброса регистр содержит значение 0x0000.

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

Отражает текущее состояние хост-контроллера. Регистр доступен для чтения и сброса.

Значение битов регистра:

  • 0 USBINT - признак прерывания USB, при получении запроса на прерывание после завершения транзакции или при обнаружении короткого пакета.
  • 1 - признак прерывания из-за ошибки во время выполнения транзакции.
  • 2 RSM_DET - признак поступления сигнала пробуждения от USB устройства.
  • 3 - признак системной ошибки.
  • 4 - признак обнаружения ошибки в работе контроллера.
  • 5 - признак останова контроллера.
  • 6-15 -зарезервированы (всегда должны быть сброшены в ноль).

После аппаратного или программного сброса контроллера регистр содержит значение 0x0020.

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

Управляет(разрешает или запрещает) генерацией различных видов прерывания хост-контроллером. Позволяет заблокировать генерацию любых прерываний хост-контроллера кроме прерываний, которые генерируются при обнаружении сбоев в работе самого контроллера. Регистр доступен для чтения и записи.

Значение битов регистра:

  • 0 - прерывание по тайм-ауту и обнаружению ошибок CRC
  • 1 - прерывание по сигналу пробуждения
  • 2 - прерывание по завершению транзакции IOC
  • 3 - прерывание по обнаружению короткого пакета
  • 4-15 - зарезервированы (всегда должны быть сброшены в ноль)

После аппаратного или программного сброса регистр содержит значение 0x0000.

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

Содержит текущий номер кадра USB. Регистр доступен для чтения и записи. Запись в регистр возможна лишь в то время, когда работа контроллера приостановлена (бит RS в регистре команды сброшен).
Значение в битах 0-10 автоматически увеличивается на еденицу после завершения каждого кадра.

Значение битов регистра:

  • 0-10 - текущий номер кадра
  • 11-15 - зарезервированы (всегда должны быть сброшены в ноль).

После аппаратного или программного сброса регистр содержит значение 0x0000.

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

Содержит физический адрес начала списка кадров в оперативной памяти. Регистр доступен для чтения и записи. Базовый адрес списка кадров должен быть выровнен на границу в 4Кб.

Значение битов регистра:

  • 0-11 - зарезервированы (всегда должны быть сброшены в ноль)
  • 12-31 - физический адрес списка кадров

После аппаратного или программного сброса регистр содержит неопределенное значение и перед запуском контроллера необходимо создать в оперативной памяти список кадров и загрузить его физический адрес в данный регистр.

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

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

Значение битов регистра:

  • 0-6 - модификатор, складывается с числом 11936, в результате чего формируется делитель частоты кварцевого резонатора генератора тактовой чатоты.
  • 7 - зарезервирован (всегда должен быть сброшен в ноль).

Частота кварцевого резонатора составляет 12 МГц, а значение, устанавливаемое в регистре после сброса контроллера равно 64, поэтому частота генерации кадров равна 1 кГц. Изменяя значение регистра, можно осуществлять подстройку частоты кадров USB в пределах ±0,5%.

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

Позволяет контролировать режим работы хост-контроллера. Регистр доступен для чтения и записи.

Значение битов регистра:

  • 0 - текущий статус подключения. Бит доступен только для чтения и служит для определения наличия подключения устройства к данному порту.
  • 1 - признак изменения статуса подключения. Бит доступен для чтения и сброса.
  • 2 PORT_EN - включение и отключение порта. Бит доступен для чтения и записи. Блокировка порта может выполняться как программно, так и аппаратно (при возникновении сбоя в работе порта), а включение производится только программным обеспечением.
  • 3 - признак включения и отключения порта. Бит доступен для чтения и сброса.
  • 4 - состояние линии D+. Бит доступен только для чтения.
  • 5 - состояние линии D-. Бит доступен только для чтения.
  • 6 RSM_DET - признак обнаружения сигнала пробуждения. Бит доступен для чтения и записи.
  • 7 - зарезервирован (доступен только для считывания и всегда равен 1).
  • 8 - признак подключения низкоскоростного усройства. Бит доступен только для чтения. Устанавливается в 1 если к порту подключено низкоскоростное усройство.
  • 9 - сброс порта. В современных контроллерах доступен только для чтения. Установлен в 1 во время процедуры сброса порта.
  • 10 - признак активности линии "Overcurrent". Бит доступен только для чтения и используется только в современных контроллерах.
  • 11 - признак изменения состояния линии "Overcurrent". Бит доступен для чтения и сброса. Используется только в современных контроллерах. Устанавливается при переходе линии "Overcurrent" из неактивного состояния в активное.
  • 12 - признак режима ожидания. Бит доступен для чтения и записи. Может использоваться для перевода в режим ожидания отдельного порта.
  • 13-15 - зарезервированы.

После аппаратного или глобального сброса регистр содержит значение 0x0080. После сброса контроллера (HCRESET) могут быть установлены биты 1 и 3. В современных контроллерах после сброса бит 11 также может быть установлен.

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

Позволяет контролировать режим работы хост-контроллера. Регистр доступен для чтения и записи.

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

Уровень 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.


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

Ссылки