link280 link281 link282 link283 link284 link285 link286 link287 link288 link289 link290 link291 link292 link293 link294 link295 link296 link297 link298 link299 link300 link301 link302 link303 link304 link305 link306 link307 link308 link309 link310 link311 link312 link313 link314 link315 link316 link317 link318 link319 link320 link321 link322 link323 link324 link325 link326 link327 link328 link329 link330 link331 link332 link333 link334 link335 link336 link337 link338 link339 link340 link341 link342 link343 link344 link345 link346 link347 link348 link349 link350 link351 link352 link353 link354 link355 link356 link357 link358 link359 link360 link361 link362 link363 link364 link365 link366 link367 link368 link369 link370 link371 link372 link373 link374 link375 link376 link377 link378 link379 link380 link381 link382 link383 link384 link385 link386 link387 link388 link389 link390 link391 link392 link393 link394 link395 link396 link397 link398 link399 link400 link401 link402 link403 link404 link405 link406 link407 link408 link409 link410 link411 link412 link413 link414 link415 link416 link417 link418 link419

PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

USB

USB

Структуры данных и регистры EHC

Контроллер EHC имеет несколько наборов регистров:

  • конфигурационные регистры PCI — стандартный заголовок и специфические регистры. В заголовке для EHC указывается код класса 0Ch, подкласс 03h, интерфейс 20h;
  • регистры описания структуры контроллера, отображенные на память; на их положение указывает BAR в заголовке конфигурационного пространства;
  • операционные регистры EHC (32-битные), отображенные на память; они расположены вслед за предыдущим набором.

Таблица. Специфические регистры конфигурационного пространства EHC

Смещение (длина) Назначение
60h (8 бит) SBRN (Serial Bus Release Number) — версия шины USB (20h)
61h (8 бит) FLADJ (Frame Length Adjustment Register) — регистр подстройки длительности кадра, используются биты [5:0]. Длительность кадра в битовых интервалах HS определяется по формуле 59488+16× FLADJ, по умолчанию FLADJ=20h (60 000 bt)
62-63h (16 бит) PORTWAKECAP, регистр возможности генерации событий пробуждения для портов корневого хаба. Бит 0 — признак наличия данного регистра (0 — нет регистра), биты [15:1] — маски для портов с теми же номерами. На работу EHC регистр не влияет (это только информация для драйвера)
EECP+0h (32 бита) USBLEGSUP (USB Legacy Support), регистр возможностей поддержки эмуляции старых устройств, адрес определяется в поле EECP регистра HCCPARAMS, отображенного на память. Назначение бит: Биты 31:25 — резерв
Бит 24 — HC OS Owned Semaphore, семафор запроса управления контроллером. ОС устанавливает в «1» как запрос, право считается предоставленным, когда BIOS установит в «0» бит 16;
Биты [23:17] — резерв;
Бит 16 — HC BIOS Owned Semaphore, семафор права управления контроллером. BIOS устанавливает в «1» как признак владения контроллером;
Бит [15:8] — Next EHCI Extended Capability Pointer, указатель на следующий идентификатор расширенных возможностей; [7:0] Capability ID, идентификатор поддержки старых устройств (01h)
EECP+4h (32 бита)

USBLEGCTLSTS (USB Legacy Support Control and Status), регистр управления и состояния эмуляции. BIOS использует этот регистр для разрешения SMI по различным событиям и идентификации событий. Назначение бит: Бит 31 — SMI on BAR, прерывание SMI по смене базового адреса регистров EHC

Бит 30 — SMI on PCI Command, прерывание SMI по записи в регистр команд конфигурационного пространства устройства PCI
Бит 29 — SMI on OS Ownership Change, прерывание SMI по смене состояния права управления для ОС
Биты [28:22] — резерв
Бит 21 — SMI on Async Advance, прерывание SMI по установке бита Async_Advance в регистре USBSTS
Бит 20 — SMI on Host System Error, прерывание SMI по системной ошибке EHC
Бит 19 — SMI on Frame List Rollover, прерывание SMI по полному обороту списка кадров
Бит 18 — SMI on Port Change Detect, прерывание SMI по смене состояния порта
Бит 17 — SMI on USB Error, прерывание SMI по ошибке USB
Бит 16 — SMI on USB Complete, прерывание SMI по завершению передачи
Бит 15 — SMI on BAR Enable, разрешение прерывания SMI по смене базового адреса регистров EHC
Бит 14 — SMI on PCI Command Enable, разрешение прерывания SMI по записи в регистр команд конфигурационного пространства устройства PCI
Бит 13 — SMI on OS Ownership Change Enable, разрешение прерывания SMI по смене состояния права управления для ОС
Биты [12:6] — резерв
Бит 5 — SMI on Async Advance Enable, разрешение прерывания SMI по установке бита Async_Advance в регистре USBSTS
Бит 4 — SMI on Host System Error Enable, разрешение прерывания SMI по системной ошибке EHC
Бит 3 — SMI on Frame List Rollover Enable, разрешение прерывания SMI по полному обороту списка кадров
Бит 2 — SMI on Port Change Enable, разрешение прерывания SMI по смене состояния порта
Бит 1 — SMI on USB Error Enable, разрешение прерывания SMI по ошибке USB
Бит 0 — USB SMI Enable, разрешение прерывания SMI по завершению передачи

Таблица. Регистры описания структуры контроллера EHC

Смещение (длина) Назначение
00h (8 бит)  CAPLENGTH, длина набора регистров описания (определяет положение операционных регистров)
01h (8 бит)  Резерв
02h (16 бит)  HCIVERSION, номер версии интерфейса хост-контроллера (0100h)
04h (32 бита)

HCSPARAMS, параметры структуры:
Биты [31:24] — резерв
Биты [23:20] — Debug Port Number, номер порта, являющегося отладочным (0 — нет такого)
Биты 19:17 — резерв

Бит 16 — P_INDICATOR, признак поддержки управления индикаторами портов
Биты [15:12] — N_CC, число контроллеров-компаньонов (если 0, то к контроллеру можно подключать только HS-устройства)
Биты [11:8] — N_PCC, число портов у каждого контроллера-компаньона
Бит 7 — Port Routing Rules, правило сопоставления портов контроллерамкомпаньоном: 0 — порты распределяются группами по N_PCC по контроллерам с нарастающими номерами, 1 — распределение в соответствии с таблицей HCSP-PORTROUTE
Биты 6:5 — резерв
Бит 4 — PPC (Port Power Control), признак наличия управления питанием портов
Биты [3:0] — N_PORTS, число нисходящих портов (1–Fh)

08h (32 бита) HCCPARAMS, параметры свойств:
Биты [31:16] — резерв.
Биты [15:8] — EECP (EHCI Extended Capabilities Pointer), указатель на положение регистра USBLEGSUP в конфигурационном пространстве
Биты [7:4] — Isochronous Scheduling Threshold, порог планирования изохронных передач. Если бит 7=0, то биты [6:4] определяют минимальную дистанцию (число микрокадров) от текущей позиции, на которой драйвер может менять дескрипторы изохронных передач. Единичное значение бита 7 означает, что контроллер способен удержать в своем кэше дескрипторы для целого кадра
Бит 3 — резерв
Бит 2 — Asynchronous Schedule Park Capability, поддержка режима парковки для заголовков HS-очередей асинхронного плана
Бит 1 — Programmable Frame List Flag, признак поддержки программируемого размера списка кадров (0 — размер только 1024 элемента)
Бит 0 — 64-bit Addressing Capability, способность использования 64-битной адресации памяти
0Ch (64 бита)  HCSP-PORTROUTE, описание распределения портов по контроллерам-компаньонам, массив 4-байтных номеров контроллера-компаньона для каждого нисходящего порта корневого хаба. Вмещает описания для 15 портов (биты [3:0], формально относящиеся к нулевому порту, не используются)

 Таблица. Операционные регистры контроллера EHC

Смещение (длина) Назначение
00h

USBCMD, регистр команд USB
Биты [31:24] — резерв
Биты [23:16] — Interrupt Threshold Control, минимальный интервал (в микрокадрах) генерации прерываний (125 мкс–64 мс). Допустимы значения 2^N, по умолчанию 08h (1 мс)
Биты [15:12] — резерв
Бит 11 — Asynchronous Schedule Park Mode Enable, разрешение режима парковки для заголовков HS-очередей асинхронного плана (необязательно)
Бит 10 — резерв

Биты 9:8 — Asynchronous Schedule Park Mode Count, число успешных транзакций из HS-очереди, которые контроллер может выполнять до продолжения прохода по асинхронному плану
Бит 7 — Light Host Controller Reset, сброс хост-контроллера без затрагивания портов, относящихся к компаньонам (необязательно)
Бит 6 — Interrupt on Async Advance Doorbell, программный запрос контроллеру на выработку прерывания по очередному продвижению по асинхронному плану
Бит 5 — Asynchronous Schedule Enable, разрешение исполнения асинхронного плана
Бит 4 — Periodic Schedule Enable, разрешение исполнения периодического плана
Биты 3:2 — Frame List Size, размер списка кадров: 00 — 1024 элемента, 01 — 512, 10 — 256, 11 — резерв
Бит 1 — HCRESET (Host Controller Reset), программный сброс контроллера (аналогично аппаратному), бит обнуляется контроллером по завершении сброса
Бит 0 — RS (Run/Stop), пуск/останов исполнения транзакций. После обнуления контроллер должен через 16 микрокадров остановить все транзакции

04h USBSTS, регистр состояния USB
Биты [31:16] — резерв
Бит 15 — Asynchronous Schedule Status, реальное текущее состояние разрешения асинхронного плана (может отставать от команды смены)
Бит 14 — Periodic Schedule Status, реальное текущее состояние разрешения периодического плана (может отставать от команды смены)
Бит 13 — Reclamation, признак не пустого асинхронного плана. Обнуляется, когда контроллер встречает заголовок очереди с установленным флагом H, устанавливается в «1» при исполнении любой транзакции асинхронного плана. Если при обнуленном бите Reclamation контроллер встречает заголовок очереди с флагом H, он останавливает обход асинхронного плана
Бит 12 — HCHalted, состояния останова контроллера
Биты [11:6] — резерв
Бит 5 — Interrupt on Async Advance, признак прерывания по продвижению асинхронного плана
Бит 4 — Host System Error, признак системной ошибки контроллера (как устройства PCI)
Бит 3 — Frame List Rollover, признак оборота по списку кадров
Бит 2 — Port Change Detect, обнаружена смена состояния порта
Бит 1 — USBERRINT (USB Error Interrupt), признак завершения транзакции по ошибке USB
Бит 0 —USBINT (USB Interrupt), признак завершения транзакции, для которой предписана генерация прерывания
08h

USBINTR, регистр разрешения прерываний USB:
Биты [31:6] — резерв
Бит 5 — Interrupt on Async Advance Enable, разрешение прерывания по продвижению асинхронного плана
Бит 4 — Host System Error Enable, разрешение прерывания по системной ошибке контроллера
Бит 3 — Frame List Rollover Enable, разрешение прерывания по обороту списка кадров

Бит 2 — Port Change Interrupt Enable, разрешение прерывания по смене состояния порта
Бит 1 — USB Error Interrupt Enable, разрешение прерывания по ошибке USB
Бит 0 — USB Interrupt Enable, разрешение прерывания по выполнению транзакций

0Ch FRINDEX, индекс кадра. Инкрементируется с каждым микрокадром, биты [N:3] используются как текущий индекс в списке кадров
10h CTRLDSSEGMENT, старшие биты 64-битного адреса (адрес 4G-сегмента, содержащего все структуры данных и регистры EHC)
14h PERIODICLISTBASE, базовый адрес списка кадров (биты [11:0] нулевые — список должен быть выровнен по границе станицы 4 Кб)
18h ASYNCLISTADDR, очередной адрес асинхронного списка, указывает на следующий заголовок очереди в асинхронном плане (биты [4:0] — резерв)
1C-3Fh Резерв
40h CONFIGFLAG, флаг конфигурирования: бит 0 устанавливается в 1, когда ПО завершает конфигурирование EHC (по этому флагу включается управление маршрутизацией портов от EHC, при нулевом значении порты безусловно подключены к своим контроллерам-компаньонам). Биты [31:1] не используются
44h…
…40h+4×n

PORTSC(n), управление и состояние n-го порта корневого хаба:

Биты [31:23] — резерв
Бит 22 — WKOC_E (Wake on Over-current Enable) — разрешение реакции на перегрузку по току как на пробуждающее событие
Бит 21 — WKDSCNNT_E (Wake on Disconnect Enable) — разрешение пробуждения по отключению
Бит 20 —WKCNNT_E (Wake on Connect Enable) — разрешение пробуждения по подключению устройства
Биты [19:16] — Port Test Control, управление режимом тестирования: 0000 — рабочий режим, 0001 — Test J_STATE, 0010 — Test K_STATE, 0011 — Test SE0_NAK, 0100 — Test Packet, 0101 — Test FORCE_ENABLE
Биты 15:14 — Port Indicator Control, управление индикатором порта: 00 — отключен, 01 — янтарный, 10 — зеленый, 11 — неопределено
Бит 13 — Port Owner, признак владельца порта: 1 — порт подключен к контроллеру-компаньону (определено подключение устройства не HS или EHC не сконфигурирован)
Бит 12 — PP (Port Power), питание порта (если PPC=1): 0 — выключено, 1 — включено
Биты [11:10] — Line Status, текущее состояние логических уровней на линиях D+ (бит 11) и D- (бит 10)
Бит 9 — резерв
Бит 8 — Port Reset, сбос порта, устанавливается программно, сбрасывается контроллером
Бит 7 — Suspend, приостановка порта
Бит 6 — Force Port Resume, возобновление порта
Бит 5 — Over-current Change, признак срабатывания токовой защиты (сбрасывается записью «1»)
Бит 4 — Over-current Active, состояние защиты (1 — питание отключено по перегрузке)
Бит 3 — Port Enable/Disable Change, признак отключения порта по ошибке, зафиксированной хабом (сбрасывается записью «1»)
Бит 2 — Port Enabled/Disabled, разрешение-запрет порта (программно можно только запретить, разрешается по сбросу)
Бит 1 — Connect Status Change, признак смены состояния подключения
Бит 0 — Current Connect Status, текущее состояние подключения

Формат элемента списка кадров (Frame List Element Pointer) приведен на рисунке ниже.Здесь Frame List Link Pointer — указатель на дескриптор изохронной передачи или заголовок очереди (для прерываний); если бит T = 1 (Terminate), то указатель не используется. Поле Typ описывает тип структуры, на которую ссылается указатель: 00 — iTD, 01 — QH, 10 — siTD, 11 — FSTN.

Дескриптор изохронной передачи iTD (Isochronous Transfer Descriptor) относится к точкам HS-устройств, его формат приведен на рисунке ниже. Первое двойное слово по формату совпадает с элементом списка кадров. Далее следует 8-элементный список дескрипторов транзакций, выполняемых в каждом из восьми микрокадров (серым цветом выделены поля, модифицируемые хост-контроллером). В следующих семи двойных словах содержатся адреса физических страниц, в которых может располагаться буфер для транзакций, и описание конечной точки. В этом описании:

  • поле Status отражает состояние выполнения транзакции:
  • бит 31 — Active, активность, устанавливается драйвером как признак необходимости исполнения, сбрасывается контроллером по исполнении транзакции;
  • бит 30 — Data Buffer Error, ошибка буфера данных (несвоевременность доставки данных в/из памяти);
  • бит 29 — Babble Detected, «болтливость», обнаруженная при исполнении транзакции;
  • бит 28 — Transaction Error (XactErr), ошибка USB при выполнении транзакции (только для транзакций IN).
  • поле Transaction X Length задает число переданных байтов (0–3072). Для транзакций IN драйвер устанавливает ожидаемое число, контроллер его меняет на реальное число принятых байтов;
  • бит IOC (Interrupt On Complete) заказывает прерывание по исполнению;
  • поле PG (Page Select) задает номер страницы буфера (0–6), из которого берутся старшие (31:12) биты адреса для формирования стартового адреса буфера данной транзакции;
  • поле Transaction X Offset задает смещение начала буфера X-транзакции относительно выбранной страницы;
  • поля Buffer Pointer (Page n) задают физические адреса страниц 0–7;
  • поле EndPt задает номер конечной точки;
  • поле I/O задает направление: 0 — OUT, 1 — IN;
  • поле Device Address задает адрес устройства;
  • поле Maximum Packet Size — максимальный размер пакета для точки (1–1024), в транзакции IN используется как порог для определения «болтливости» устройства;
  • поле Mult задает число транзакций за один микрокадр (00 — резерв).

Дескриптор расщепленной изохронной транзакции siTD (Split-transaction Isochronous Transfer Descriptor) относится к точкам FS-устройств, его формат приведен на следующем рисунке. Первое двойное слово по формату совпадает с элементом списка кадров. Поля I/O, EndPt, Device Address описывают координаты и направление конечной точки.

Поля Hub Addr и Port Number задают адрес расщепляющего транзакцию хаба и номер порта.

Битовые поля μFrame S-mask и μFrame C-mask задают маски для микрокадров, в которых планируются транзакции SS и CS (транзакция в микрокадре выполняется при единичном значении маски). В поле μFrame C-prog-mask контроллер отмечает кадры, в которых произошли транзакции завершения.

Адрес буфера для начала транзакции задается полями Buffer Pointer (Page 0) и Current offset, при переходе на другую физическую станицу в качестве ее адреса используется поле Buffer Pointer (Page 1). Бит P определяет номер используемой страницы. Ожидаемый размер пакета задается в поле Total Bytes to Transfer, контроллер этот размер заменит реальным. Бит IOC (Interrupt On Complete) заказывает прерывание по исполнении.

Поле TP (Transaction Position) — позиция текущей HS-транзакции: 00 — All, HSтранзакция содержит все данные FS-транзакции (не более 188 байт), 01 — Begin, первый пакет для FS-транзакции, 10 —Mid, промежуточный, 11 — End, последний HS-пакет для FS-транзакции.

Поле T-Count (Transaction Count), число HS-транзакций, необходимых для выполнения FS-транзакции (1–6).

Состояние выполнения транзакции определяется полем Status:

  • бит 7 — Active, активность, устанавливается драйвером как признак необходимости исполнения, сбрасывается контроллером по исполнении или по ошибке;
  • бит 6 — ERR, признак получения одноименного ответа от транслятора транзакций;
  • бит 5 — Data Buffer Error, ошибка буфера данных (несвоевременность доставки данных в/из памяти);
  • бит 4 — Babble Detected, «болтливость», обнаруженная при исполнении транзакции;
  • бит 3 — Transaction Error (XactErr), ошибка USB при выполнении транзакции (только для транзакций IN);
  • бит 2 — Missed Micro-Frame, пропуск микрокадра (по вине контроллера), в котором должно было быть завершение;
  • бит 1 — SplitXstate (Split Transaction State), состояние (фаза) расщепленной транзакции: 0 — SS, 1 — CS;
  • бит 0 — резерв.

Поле si-TD Back Pointer является обратным указателем на декриптор si-TD (если в том же двойном слове бит T = 1, указатель не используется).

Дескриптор передачи — элемент очереди qTD (Queue Element Transfer Descriptor) имеет формат, приведенный на следующем рисунке. Поле Next qTD Pointer указывает на следующий qTD (если T = 0), к которому следует перейти после нормальной отработки передачи. Поле Alternate Next qTD Pointer позволяет указать на qTD, к которому следует перейти в случае приема короткого пакета. Ожидаемая длина передачи задается полем Total Bytes to Transfer, по окончании в этом поле окажется реальная длина. Адрес буфера для начала транзакции задается полями Buffer Pointer (Page 0) и Current offset, по мере продвижения контроллер меняет значение поля C_Page, определяющего номер физической страницы. Бит IOC задает прерывание по выполнению. Поле PID задает тип маркера в транзакциях: 00 — OUT, 01 — IN, 10 — SETUP, 11 — резерв. Бит DT — текущее значение Data Toggle для данной передачи, В поле CErr драйвер заносит допустимое число повторов (из-за ошибок) в каждой транзакции данной передачи (0 — число повторов неограниченно). Поле Status отражает состояние текущей транзакции передачи:

  • бит 7 — Active, активность, устанавливается драйвером как признак необходимости исполнения, сбрасывается контроллером по исполнении или по достижении лимита повторов;
  • бит 6 — Halted — признак получения ответа STALLl;
  • бит 5 — Data Buffer Error, ошибка буфера данных (несвоевременность доставки данных в/из памяти);
  • бит 4 — Babble Detected, «болтливость», обнаруженная при исполнении транзакции;
  • бит 3 — Transaction Error (XactErr), ошибка USB при выполнении транзакции (только для транзакций IN);
  • бит 2 — Missed Micro-Frame, пропуск микрокадра (по вине контроллера), в котором должно было быть завершение (только для FS- и LS-точек);
  • бит 1 — SplitXstate (Split Transaction State), состояние (фаза) расщепленной транзакции (только для FS- и LS-точек): 0 — SS, 1 — CS;
  • бит 0 — P/ERR, для HS-точек при PID Code = 00 (OUT) — состояние протокола Ping (Ping State): 0 — выполнять транзакцию OUT, 1 — PING. Для не-HS точек — ERR, признак получения подтверждения ERR на расщепленную периодическую транзакцию.

Заголовок очереди QH имеет формат, приведенный на рисунке ниже. Здесь Queue Head Horizontal Link Pointer указывает на следующую структуру по горизонтали, которая может быть заголовком очереди или любым дескриптором изохронной передачи. В последующих двух двойных словах описывается конечная точка, а для точек LS/FS еще и дополнительные параметры, требуемые для расщепления транзакций. Поля Device Address, EndPt и Maximum Packet Length задают адрес устройства, номер точки и максимальный размер пакета. Поле EPS задает скорость: 00 — LS, 01 — FS, 10 — HS, 11 — резерв. Бит H (Head of Reclamation List Flag) — флаг, которым драйвер помечает один из заголовков очередей из асинхронного плана для определения опустошения всех очередей этого плана (этот флаг вызывает обнуление бита Reclamation в регистре состояния контроллера). Бит DTC управляет переключателем Toggle Bit: 0 — использовать бит DT из данного заголовка очереди QH, 1 — из qTD. Флаг C — признак управляющей точки HS-устройства. Флаг I (Inactivate on Next Transaction) — программный запрос контроллеру обнулить бит активности при следующей транзакции. Используется только в заголовке очереди периодических транзакций FS/LS-устройств для обеспечения возможности программной коррекции значений полей S-mask и C-mask в данном заголовке. Поле RL (Nak Count Reload) задает значение счетчика ответов NAK, загружаемое в поле Nak Cnt. Поле Mult задает число транзакций в микрокадре для широкополосных точек (0 — резерв). Поля Port Number, Hub Addr, μFrame S-mask и μFrame C-mask требуются для точек FS/LS-устройств, по назначению они совпадает с одноименными полями siTD.

Поле Current qTD Pointer содержит адрес текущего обрабатываемого qTD, последующие 8 двойных слов являются оверлейной областью передачи (Transfer Overlay), в которую контроллер загружает требуемые параметры для обрабатываемого элемента. Большинство полей по назначению (и положению) совпадает с одноименными полями qTD, здесь перечислим только особые. Поле NakCnt (Nak Counter) — счетчик ответов NAK или NYET. В поле C-prog-mask контроллер отмечает микрокадры, в которых происходили транзакции завершения расщепленных транзакций. В поле FrameTag контроллер записывает тег кадра, в котором производится расщепленная транзакция прерывания. В поле S-bytes контроллер указывает число байтов, переданных в расщепленных транзакциях IN и OUT.

Формат узла FSTN (Periodic Frame Span Traversal Node) приведен на последнем рисунке. Здесь Normal Path Link Pointer может указывать на любую структуру данных, а обратный указатель Back Path Link Pointer может указывать только на заголовок очереди.



USB без ПК — расширение On-The-Go

Протокол шины USB ориентирован на сугубо подчиненные отношения: всеми транзакциями со всеми подключенными устройствами управляет хост — как правило, это компьютер (ПК) с контроллером USB. Никакого равноправия в отношениях на шине USB быть не может, однако в ряде случаев хотелось бы обойтись и без компьютера. Так, например, напрашивается непосредственное соединение цифровой фотокамеры и фотопринтера, обеспечивающее печать снимков без участия ПК. Практически все периферийные устройства USB имеют встроенные микроконтроллеры, и функциональные возможности этих микроконтроллеров неуклонно растут. Периферийное устройство, имеющее хотя бы простейшие средства диалога с пользователем (дисплей, отображающий пару строк текста, и несколько кнопок управления), вполне может взять на себя управляющие функции в плане организации транзакций USB. Функции такого мини-хоста можно упростить, если ориентироваться на двухточечное соединение пары устройств без промежуточных хабов. В этом случае мини-хосту остается лишь идентифицировать одно подключенное устройство, и, если ему известно, как это устройство можно использовать, сконфигурировать его. Задача планирования транзакций лишь с одним устройством гораздо проще общей задачи «большого» хоста и хост-контроллера. Именно на создание таких упрощенных связей пары устройств нацелено расширение OTG (On-The-Go).

Документ On-The-Go Supplement to USB 2.0 Specification (версия 1.0 вышла в июне 2003 года) определяет дополнения к USB 2.0, необходимые для организации упрощенных соединений пары устройств. Большая часть документа посвящена описанию разъемов, и терминология OTG тоже привязана к типам разъемов (собственно, пользователь видит разъемы на устройствах и просто пытается соединить их доступными кабелями). В OTG принято следующее деление устройств:

  • устройство-A (A-Device) — устройство, в гнездо которого вставлена вилка типа A (или mini-A). Это устройство подает питание (Vbus) на шину и играет роль хоста, по крайней мере, в первое время после подключения к другому устройству. По ходу сеанса связи устройство-A может передать функции хоста своему партнеру, а само стать периферийным (в терминах USB);
  • устройство-B (B-Device) — устройство, в гнездо которого вставлена вилка типа B (или mini-B). Это устройство при подключении к другому устройству играет роль периферийного (ведомого) устройства USB. Если это устройство является двухролевым, то по ходу сеанса связи ему могут быть переданы функции хоста;
  • двухролевое устройство (Dual-role device) — устройство с единственным гнездом типа mini-AB, обеспечивающее питание шины с током не менее 8 мА, поддерживающее FS (дополнительно может поддерживать и HS, а в роли периферийного устройства — и LS). Это устройство имеет усеченные возможности хоста, список поддерживаемых периферийных устройств, средства диалога с пользователем. Для управления связью устройство должно поддерживать протоколы запроса сессий (SRP) и согласования роли хоста (HNP).

Двухролевое устройство может поддерживать и хабы (это усложняет его задачи); однако стандартные хабы USB не позволяют работать протоколам SRP и HNP.

В основной спецификации USB фигурируют три типа разъемов (гнезд и вилок): стандартные 4-контактные A и B, а также 5-контактный mini-B. Здесь допустимы кабели с вилкой A на одном конце и вилкой (mini)B на другом, а также неотсоединяемые от устройства кабели с вилкой A. В OTG введены 5-контактные вилки mini-A и универсальное 5-контактное гнездо mini-AB. Внутри вилки mini-A контакты 4 и 5 электрически соединены, в вилке mini-B контакт 4 свободен. Для облегчения различения разъемов принята цветовая маркировка: разъемы mini-A должны быть белого цвета, mini-B — черного, а гнезда mini-AB — серого.

В гнездо mini-AB двухролевого устройства может вставляться как вилка mini-A, так и вилка mini-B. При этом контакт 4 (ID) используется для идентификации типа подключенного устройства:

  • если контакт 4 (ID) соединен с линией GND (сопротивление <10 Ом), то вставлена вилка mini-A — значит, подключено устройство-B; следовательно, двухролевое устройство должно стать хостом;
  • если контакт 4 (ID) не соединен с линией GND (сопротивление >10 Ом), то вставлена вилка mini-B — значит, подключено устройство-A; следовательно, двухролевое устройство должно стать периферийным.

Протокол запроса сеанса, SRP (Session Request Protocol), предназначен для дополнительного энергосбережения: когда устройство-A не нуждается в обмене по шине, оно может снять питание Vbus. При этом устройство-B все-таки может «попросить внимания» — запросить сеанс связи. Здесь сеансом называется интервал времени, в течение которого двухролевое устройство подает достаточное (для работы) напряжение питания. Запрос может выполняться подачей положительных импульсов либо по линии Vbus, либо по сигнальным линиям (D+ или D-). Устройство-B должно использовать оба метода подачи запроса, устройство-A может распознавать любой из них (как удобнее его разработчику).

Протокол согласования роли хоста, HNP (Host Negotiation Protocol), позволяет устройству-A и устройству-B поменяться ролями во время сеанса связи (если они оба двухролевые). Протокол может быть инициирован, только если устройство-A пошлет устройству-B специальный разрешающий запрос, предварительно убедившись, что устройство-B протокол HNP поддерживает. Возможность поддержки протоколов HNP и SRP сообщается устройством-B в специальном дескрипторе OTG-устройства.

Устройство-B может запросить управление шиной (стать хостом на время), когда устройство-A прекращает активность (переводит шину в состояние покоя). Для этого устройство-B отключается от шины (отключает свой «подтягивающий» резистор от линии D+). Устройство-A расценивает это как запрос смены роли и подключает свой «подтягивающий» резистор к линии D+. Теперь устройство-B может начинать транзакции, управляя шиной. Когда оно захочет отдать управление шиной, оно прекращает активность и подключает свой «подтягивающий» резистор к линии D+. Устройство-A это расценивает как возврат управления и отключает свой «подтягивающий» резистор от линии D+ — исходные роли, определенные по типу разъема, восстановлены.

Дескриптор OTG (длина 3, тип 9) должен присутствовать во всех конфигурациях OTG-устройства, он считывается обычным запросом Get_Descriptor. Дескриптор OTG содержит лишь один байт атрибутов, в котором бит 0 указывает на поддержку SRP, бит 1 — на поддержку HNP (остальные биты — нулевые).

Убедившись в поддержке протокола HNP, устройство-A, еще до выбора конфигурации устройства-B, должно сообщить ему свое отношение к HNP. Для этого служат запросы к устройству Set_Feature (bmRequestType = 00000000b, bRequest = 3):

  • запросом Set b_hnp_enable (wValue = 3) устройство-A разрешает устройствуB запрашивать роль хоста;
  • запросом Set a_hnp_support (wValue = 4) устройство-A только информирует устройство-B о том, что оно подключено к порту, поддерживающему HNP, и запрос роли хоста может быть разрешен позже;
  • запросом Set a_alt_hnp_support (wValue = 5) устройство-A информирует устройство-B о том, что оно (устройство-B) подключено к порту, не поддерживающему HNP, но у устройства-A имеется другой порт, на котором HNP поддерживается.


Подкатегории