Шина IEEE 1394 — FireWire

Шина IEEE 1394 — FireWire

Базовый механизм арбитража

Узел, желающий передать пакет, посылает вверх по дереву сигнал запроса арбитража TX_REQUEST. Узел имеет право на передачу пакета запроса или ответа, когда он получит «сверху» сигнал предоставления RX_GRANT. Если несколько узлов запрашивают шину одновременно, то доступ получит то устройство, которое пошлет сигнал арбитража раньше. Запрос арбитража узел имеет право послать, лишь наблюдая состояние покоя шины (Bus Idle) в течение некоторого промежутка времени — зазора арбитража. Таким образом, более приоритетным окажется узел, использующий для задержки запроса арбитража меньшее значение зазора и находящийся ближе к корню — его запрос дойдет быстрее. В связи с этим мастер циклов должен находится в корне дерева, чтобы иметь приоритет посылки пакетов начала цикла по отношению к асинхронным пакетам других узлов. Для шины IEEE 1394 различают две длительности зазора:

  • изохронный зазор (Isochronous gap), длительность которого лежит в пределах 40–50 нс;
  • зазор асинхронных транзакций (subaction gap) — более длительный (0,3–10,6 мкс), величина которого подбирается так, чтобы не слишком затягивать арбитраж и не конфликтовать с задержками посылок пакетов квитирования. Длительность зазора должна быть не меньше, чем время оборота по шине для самой удаленной друг от друга пары узлов.

Немедленный и изохронный арбитраж используют одинаковую (самую маленькую) длительность зазора — 40–50 нс. Однако это не вызывает проблем с приоритетом изохронных пакетов: немедленный арбитраж выполняется только для пакетовквитанций, которыми узлы отвечают только на асинхронные пакеты запросов-ответов. Пакеты запросов-ответов требуют приоритетного или справедливого арбитража, так что они могут передаваться только после всех изохронных пакетов данного цикла. Следовательно, немедленный арбитраж никогда не происходит в изохронной части цикла.

Справедливый арбитраж для асинхронных передач предохраняет шину и ее узлы от возможных перегрузок. Для этого на шине устанавливается интервал справедливости (fairness interval) — период времени, в течение которого узел имеет право выполнить лишь одну субакцию — послать один асинхронный пакет запроса или ответа. Длительность интервала справедливости зависит от числа активных узлов (у которых включен уровень LINK) и от загруженности шины изохронным трафиком. Справедливость обеспечивает PHY, у которого имеется специальный бит разрешения арбитража. Физический уровень будет посылать запрос арбитража только при установленном бите разрешения. Этот бит изначально устанавливается после самоидентификации устройств. Далее, как только физический уровень (по запросу от канального) посылает запрос арбитража, бит сбрасывается. Повторно он установится только после того, как PHY будет видеть шину в покое в течение интервала arb_reset_gap — зазора сброса арбитража (по умолчанию 21 мкс). Этот интервал гораздо больше изохронного и асинхронного зазора; такое длительное «молчание» всех устройств означает, что у них больше нет асинхронных пакетов, разрешенных к передаче в этом интервале справедливости. Таким образом, интервал справедливости — это время между соседними зазорами сброса арбитража, и его длительность неопределенна (см. рисунок).

Сброс шины (Bus Reset)

Сброс шины приводит к ряду эффектов:

  • все узлы переводятся в исходное состояние;
  • передача трафика прерывается, незавершенные транзакции отбрасываются;
  • вся информация о топологии разрушается;
  • все узлы переходят в состояние инициализации.

Сброс шины может быть вызван любым устройством. Сброс распространяется всеми узлами беспрепятственно, поскольку его сигнал по праву доминирования единиц превалирует над всеми другими сигналами. После сигнала сброса, длительность которого Treset = 167 мкс (или 1,4 мкс — короткий сброс, см. ниже), узлы выдерживают паузу Twait = 0,16 мкс, после чего начинается процесс идентификации дерева.

Сигнал сброса вырабатывается по ряду причин:

  • сброс при включении питания PHY (состояние питания LINK не важно);
  • сброс при подключении узла к порту и его отключении (обнаруживается узлом по изменению напряжения смещения);
  • сброс по тайм-ауту арбитража, предотвращающий «зависание» шины. Он вырабатывается узлом при длительном нахождении шины в одном состоянии по истечении MAX_ARB_STATE_TIME = 200–400 мкс. Контроль длительности не распространяется на состояния покоя (bus idle), старта идентификации дерева и состояния, контролируемые своими счетчиками тайм-аутов;
  • программно-инициируемый сброс, выполняемый по запросу приложения на каком-либо узле.

В случае изменения топологии сброс вырабатывается по крайней мере два раза подряд. Первый раз его сигнализирует узел-новичок, подключаемый к шине. Второй раз сброс подаст узел, к которому он подключился, поскольку он обнаружит изменение состояния порта. Два сброса подряд — это сигнал к установке стандартного зазора арбитража (gap_cnt=63); новое оптимальное значение зазора должно определяться по новой топологии.

При подключении/отключении устройств в разъемах возникает дребезг контактов — серия замыканий и размыканий, которая может длиться десятки и сотни миллисекунд. В 1394 это порождает так называемый шторм сбросов, что парализует работу шины на длительное время (сотни миллисекунд). В 1394a эту проблему решили введением защиты от дребезга: узел посылает сброс по обнаружении смены состояний не сразу, а через 330–350 мс (когда дребезг закончится).

Соединяемые узлы воспринимают факт смены состояния не одновременно — разница в моментах определения изменения может составлять десятки миллисекунд (они проверяют замыкание разных цепей). В 1394a приняты меры, чтобы устройство, определившее факт смены позднее, не давало лишнего сброса. Порт, который во время выжидания интервала защиты от дребезга обнаружил сигнал сброса (от более быстрого устройства), должен прекратить выжидание и начать трансляцию сигнала сброса.

Из-за особенностей интерфейса PHY–LINK сигнал сброса должен быть весьма длительным, чтобы уведомление о нем получили LINK-уровни всех узлов. Сигнал сброса приходит в любой момент времени. В узле, ведущем передачу пакета, интерфейсом PHY–LINK владеет LINK. Таким образом, PHY не имеет возможности сигнализировать LINK’у о сбросе, пока передача пакета не будет завершена. Из-за этого длительность сигнала сброса должна быть больше длительности максимального пакета, поэтому принято Treset = 166,7 мкс. Поскольку во время сброса трафик по шине передаваться не может, такой длинный сброс приводит к потерям изохронных данных (может быть потерян целый 125-микросекундный цикл шины). В 1394a эту проблему решили, введя новый вариант сброса — короткий сброс (Short Bus Reset) длительностью 1,3–1,4 мкс. Короткий сброс узел может подать, только выиграв арбитраж (Arbitrated Bus Reset), — это гарантия того, что ни один узел в это время не передает пакет. Однако применение короткого сброса имеет свою специфику:

  • если обнаруживается отключение на p-порте, то арбитраж попросту невозможен (корень уже недоступен);
  • если при попытке арбитража срабатывает тайм-аут, сброс должен быть длинным;
  • одиночный узел при подключении должен задержать подачу сброса на 1 с, чтобы дать возможность другому узлу подать короткий сброс (по обнаружении подключения). Если сброс не приходит, то узел генерирует обычный сброс, если приходит — генерировать дополнительный сброс уже не надо.

Три различных варианта сброса шины по факту подключения узла приведены на рисунке. Из диаграммы видно, как усовершенствование механизма сброса позволяет сократить время простоя шины с сотен миллисекунд (1394) до 167 мкс (1394a) и даже до 1,56 мкс (короткий сброс в 1394a).

Диспетчер изохронных ресурсов

Диспетчер изохронных ресурсов, IRM (Isochronous Resources Manager), — узел, ведающий распределением номеров каналов и полосы шины для изохронных передач. Диспетчер требуется, когда на шине появляется хоть одно устройство, способное к изохронной передаче. Диспетчер выбирается в процессе самоидентификации узлов из числа узлов, претендующих на эту роль. Претендентами являются узлы, которые сообщают в своем пакете самоидентификации единичные значения битов L (LINK активен) и C (Contender — участник состязания). Все узлы, интересующиеся диспетчерами, слушают пакеты самоидентификации и запоминают идентификатор победителя — претендента с наибольшим номером узла. Узел-претендент «сдается», если его идентификатор меньше запомненного идентификатора победителя. Победитель (единственный «не сдавшийся» узел) становится диспетчером изохронных ресурсов. Через него можно будет найти и диспетчера шины.

Победителем, скорее всего, станет корневой узел (если он способен к этой роли). На роль диспетчера изохронных ресурсов годится узел, удовлетворяющий следующему набору требований:

  • поддержка изохронных обменов (как источник или приемник);
  • активность канального уровня и уровня транзакций во время процесса конфигурирования;
  • наличие в памяти конфигурации блока BUS_INFO_BLOCK, в котором установлен бит IRMC (способность исполнять роль IRM);
  • наличие регистра BUS_MANAGER_ID, поддерживающего блокированную транзакцию (условную запись);
  • наличие регистров доступных каналов и пропускной способности (CHANNELS_AVAILABLE и BANDWIDTH_AVAILABLE).

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

При отсутствии диспетчера шины IRM отвечает за назначение мастера циклов: если текущий корень не исполняет эту роль, то IRM для этой цели выбирает иной узел (в том числе и себя). Механизм смены корня по этому поводу описан в предыдущем параграфе. При отсутствии диспетчера шины на IRM ложатся еще и минимальные обязанности по управлению питанием — отправка команды на включение LINK-уровня всем узлам. Отсутствие диспетчера шины IRM определяет по своему регистру Bus_Manager_ID (смещение 2C1h, используются только 6 младших бит): если через 625 мс после сброса его значение не отличается от 3Fh, значит, диспетчера шины нет.

После сброса устройства, нуждающиеся в изохронной передаче, запрашивают у диспетчера изохронных ресурсов выделение номера канала и полосы пропускания. Для распределения каналов служит 64-битный регистр CHANNEL_AVAILABLE (смещение 224h), представляющий собой битовую карту, в которой каждому возможному изохронному каналу ch# соответствует свой бит (ch0 — в младшем бите).

Единичное значение бита соответствует доступности (незанятости) данного канала. Начальное значение регистра — FFFF FFFFh (все каналы доступны). При запросе выделения канала бит сбрасывается, при освобождении — устанавливается.

Запрос и освобождение канала выполняются одинаково. Узел, запрашивающий выделение или освобождение канала, первым делом считывает значение регистра CHANNEL_AVAILABLE, чтобы определить текущую ситуацию, и формирует свое предложение по новому значению этого регистра. Далее, он обращается к регистру CHANNEL_AVAILABLE блокированной транзакцией compare_swap, в которой в качестве аргумента (arg_value) передает прежнее (считанное) значение, а в качестве значения (data_value) — свое новое предложение. Данная транзакция в случае совпадения текущего значения регистра с аргументом заменяет его значение на новое, то есть регистр CHANNEL_AVAILABLE принимает новое значение. При этом транзакция возвращает запрашивающему узлу значение регистра, считанное на момент начала выполнения блокированной транзакции. Если это значение совпадает с ранее считанным значением, значит, диспетчер принял новое назначение каналов — выделил узлу или освободил запрошенный канал (можно и группу каналов одновременно). Если совпадения нет, это значит, что какой-то другой узел между нашими двумя транзакциями успел изменить содержимое регистра — занять или освободить канал. В этом случае запрашивающий узел должен повторить попытку, при этом новое текущее значение регистра он уже знает.

Для распределения полосы пропускания служит регистр BW_AVAILABLE (смещение 220h), в котором младшие 13 бит (bw_remaining) содержат число единиц распределения полосы шины (bus allocation units), оставшееся доступным. Единица распределения соответствует времени передачи одного квадлета на скорости 1600 Мбит/с (20,345 нс). В 125-микросекундном цикле теоретически доступно 6144 единиц. Как минимум 25 мкс цикла резервируется под асинхронный трафик, поэтому суммарная распределяемая полоса изохронного трафика (начальное значение bw_remaining) по умолчанию составляет 4915 единиц. Сервисным запросом SB_CONTROL диспетчеру изохронных ресурсов (или диспетчеру шины) можно урезать полосу, выделяемую под изохронный обмен. Выделение полосы по времени учитывает возможность совместной работы устройств с различными скоростями — в одном цикле соседние пакеты могут передаваться на разных скоростях. Для цифрового видео, например, требуется полоса 30 Мбит/с (25 Мбит/с на видеоданные и 3–4 Мбит/с на аудиоданные, синхронизацию и заголовки пакетов). В S100 такие устройства цифрового видео запрашивают около 1800 единиц, в S200 — около 900. Запрашиваемая полоса должна учитывать не только передаваемые данные, но и накладные расходы на заголовок и на зазор арбитража. Выделение и освобождение полосы выполняется аналогично выделению и освобождению канала — с помощью чтения и блокированного обращения compare_swap к регистру BW_AVAILABLE. При сбросе шины передача трафика прекращается и все ресурсы освобождаются, так что узлы, вещавшие в изохронном режиме, должны снова запросить себе ресурсы. Для стабилизации работы шины узлы-новички, не вещавшие до сброса, задерживают свои запросы на 1 с — это позволит прежним вещателям не потерять ресурсы из-за появления новичков и не прерывать передачу.

Кабели и коннекторы для DS-режима

Разъемы, используемые в кабельной шине IEEE 1394, специально разработаны для обеспечения «горячего» подключения/отключения. Контакты, используемые для цепей земли и питания (VG и VP), длиннее других — они при подключении соединяются раньше, а при отключении разъединяются позже сигнальных. На портах устанавливаются гнезда, на кабелях — вилки.

Стандарт IEEE 1394 определяет малогабаритный 6-контактный разъем для подключения устройств. Его экранирующий кожух используется как дополнительный контакт и связывается с оплетками витых пар и контактом цепи VG.

В IEEE 1394a дополнительно определен миниатюрный 4-контактный разъем: вилка (на кабель) с плоскими контактами и розетка с пружинными контактами. В качестве дополнительного контакта (цепь VG) используется экранирующий кожух. Подача питания через такой разъем не предусмотрена. Существуют кабели-адаптеры с 4-контактной и 6-контактной вилками на разных концах.

В IEEE 1394b определен миниатюрный 9-контактный разъем: вилка с пружинными контактами и розетка с плоскими контактами. Разъемы имеют две модификации:

  • для бета-портов с широким ключом на кожухе;
  • для «двуязычных» портов с узким ключом.

На вилках имеются соответствующие ключи; к бета-порту можно подключить кабель только с бета-вилкой, к «двуязычному» — с любой вилкой 1394b. Кабель с «двуязычной» вилкой может на противоположном конце иметь вилку любого типа (4-, 6- или 9-контактную). Контакт 7 (SC, Status Contact) пока не используется (остается неподключенным).

Стандартный 6-проводный кабель 1394 содержит две экранированные витые пары для передачи сигналов (TPA и TPB) и, дополнительно, два провода для питания устройств. Все эти провода помещаются в общий экран. Сигнальные пары проводников соединяются перекрестно. При необходимости могут использоваться адаптеры-переходники с разъемами разных типов.

Таблица. Соединительные кабели FireWire

Разъем А Разъем B
4-конт. 6-конт. 9-конт. Цепь Цепь 9-конт. 6-конт. 4-конт.
- 1 8 VP VP 8 1 -
Экран 2 6 VG VG 6 2 Экран
1 3 1 TPB– TPA– 3 5 3
2 4 2 TPB+ TPA+ 4 6 4
3 5 3 TPA– TPB– 1 3 1
4 6 4 TPA+ TPB+ 2 4 2
- - 5 TPA(R) TPB(R) 9 - -
- - 9 TPB(R) TPA(R) 5 - -
- - 7 SC (не соединен) SC (не соединен) 7 - -
Экран Экран Экран Экран Экран Экран Экран Экран

В IEEE 1394b для борьбы с помехами по земляным проводам предпринят ряд мер, возможных с применением 9-контактного разъема. Обратные (общие) провода — экранные оплетки пар TPA(R) и TPB(R) — выведены на отдельные контакты (5 и 9). Цепь TPB(R) соединяется со схемной землей и проводом VG непосредственно, а TPA(R) соединяется со схемной землей через параллельно соединенный резистор (1 МОм) и конденсатор (0,1 мкФ). Общий экран соединяется со схемной землей через такую же RC-цепочку. Схему соединения «земель» узлов иллюстрирует рисунок ниже.

 

Интерфейс PHY-LINK 1394 и 1394a

Интерфейс PHY–LINK изображен на рисунке ниже, назначение сигналов раскрыто в следующей таблице. Интерфейс содержит небольшое количество сигналов, и именно для этих сигналов и возможно введение гальванической развязки.

На рисунке приведены сигналы для обоих вариантов шины — кабельной и кроссшины. Описание интерфейса, приведенное ниже, относится к самому распространенному варианту — кабельной шине. В этом варианте не используются (отсутствуют) сигналы Clk25 и Bacкlplane.

Для кросс-шины в интерфейсе LINK-PHY сигнал SClk имеет пониженную частоту (24,756 или 12,288 МГц для S50 и S25 соответственно); для идентификации используемой частоты введен сигнал Clk25 (0 — 12,288 МГц, 1 — 24,576 МГц). Признаком подключения LINK-уровня к Backplane PHY является дополнительный сигнал Backplane (от PHY к LINK’у).

Таблица. Сигналы интерфейса LINK-PHY

Сигнал Назначение
D[0:7] Двунаправленная шина данных. На S100 используются только линии D[0:1], на S200 — D[0:3], на S400 — D[0:7]
Ctl[0:1] Состояние интерфейса
LReq Link Request, последовательный интерфейс, по которому LINK инициирует запрос к PHY (для передачи пакетов и обращения к регистрам)
SClk Синхронизация (49,152 МГц) для вышеприведенных сигналов. Источник меняет состояние сигнала по спаду SClk, приемник фиксирует состояние по фронту SClk
LPS Link Power Status, признак активности (включения) LINK-уровня
LinkOn Сигнал для включения LINK-уровня
Direct Признак непосредственного соединения LINK-PHY (нет дифференцирования сигналов)

Интерфейсом управляет PHY; LINK может посылать запросы только в определенных состояниях интерфейса. Право передачи информации по двунаправленным линиям данных LINK получает от PHY. Текущее состояние интерфейса (использование шины данных) определяется сигналами Ctl[0:1] в соответствии с со следующей таблицей.

Таблица. Состояние интерфейса LINK-PHY

Ctl[0:1] Состояние интерфейса
  Линиями Ctl[0:1] управляет PHY:
00 Idle — нет активности (LINK может посылать запрос)
01 Status — PHY по шине данных посылает информацию о событиях или ответ на запрос чтения регистра
10 Receive — PHY передает LINK-уровню пакет, принимаемый с шины, или генерируемый им (PHY-пакет), или пакет ответа на запрос к регистрам PHY
11 Grant — PHY передает LINK’у право использования шины данных
   Линиями Ctl[0:1] управляет LINK:
00  Idle — нет активности: LINK завершил передачу и отдает управление интерфейсом уровню PHY
01  Hold — LINK удерживает шину, готовясь к передаче пакета (или после передачи пакета, собираясь послать следующий без повторного арбитража)
10  Transmit — LINK передает данные PHY (для передачи в шину или обращения к регистрам PHY)
11  Не используется

В состоянии Status PHY по линиям данных D[0:1] за два такта передает 4 бита состояния (Stat[0:1] в первом такте и Stat[2:3] во втором

Таблица. Состояние, сообщаемое PHY

Бит Значение
0 ARB_RESET_GAP — обнаружение зазора сброса арбитража (указание на начало нового интервала справедливости)
1 SUBACTION_GAP — обнаружение нормального зазора арбитража (можно запрашивать право посылки очередного асинхронного пакета)
2 BUS_RESET_START — обнаружение сброса на шине
3 PHY_INTERRUPT — прерывание от PHY, причина уточняется чтением PHY-регистра 0101b. Возможные события: обнаружение петли во время идентификации дерева; обнаружение снижения питающего напряжения (ниже 7,5 В); обнаружение тайм-аута арбитража; обнаружение изменения напряжения смещения

 

Доступ к регистрам PHY

Обращение к регистрам PHY (см. далее) через запросы от LINK разрешено в любом состоянии интерфейса, за исключением времени, когда PHY занят обработкой предыдущего запроса чтения. Запросы обращения к регистрам выполняются всегда, их может отменить только сигнал сброса. Запрос передается в последовательном коде по линии LReq. Для запросов обращения к регистрам PHY в теле передается адрес регистра, а в запросе записи — и сами данные записи. В запросе чтения в битах [4:7] передается адрес запрашиваемого регистра, бит 8=0 — стоп бит. В запросах записи после адреса в битах [8:15] передается записываемый байт. Ответ на запрос чтения регистра передается по линиям D[0:1] в состоянии Status за 8 тактов (передаются 16 бит). За первые 2 такта передается текущее значение состояния, далее передается 4-битный адрес регистра и 8 бит считанных данных.

Параллельный интерфейс B PHY-LINK 1394b

В IEEE 1394b параллельный интерфейс между физическим уровнем и LINK-уровнем модифицирован для поддержки высоких скоростей и бета-режима, и этот вариант интерфейса называется B PHY-LINK. Схема интерфейса приведена на следующем рисунке, назначение сигналов — в следующей таблице. Этот интерфейс обеспечивает передачу данных на скоростях вплоть до S800. Здесь в шине данных всегда используются все 8 бит, а при передаче на более низких скоростях байты данных растягиваются до 2, 4 или 8 тактов. Интерфейс может работать и в традиционном режиме (1394/1394a), при этом он синхронизируется от линии PClk (она будет играть роль SCLK), частота этого сигнала становится 49,152 МГц. Сигналы LClk и PInt при этом не используются.

 

Таблица. Сигналы интерфейса LINK-PHY 1394b

Сигнал Назначение
D[0:7] Двунаправленная шина, по которой передаются данные, код скорости и тип запроса. Данные от PHY синхронизируются по PClk, данные от LINK — по LClk
Pint PHY Interrupt, линия для последовательной передачи информации о состоянии PHY, содержимого регистров и прерываний по событиям
Ctl[0:1] Состояние (фаза) интерфейса синхронизируется по PClk, когда интерфейсом управляет PHY, и по LClk, когда интерфейсом управляет LINK
LReq Link Request, последовательный интерфейс, по которому LINK инициирует запрос к PHY (для передачи пакетов и обращения к регистрам) Синхронизируется по LClk
PClk Синхронизация (98,304 МГц) для сигналов, передаваемых от PHY. Источник синхронизации — PHY
LClk Синхронизация для сигналов, передаваемых от LINK. Сигнал вырабатывается LINK’ом из PClk и совпадает с ним по частоте
LPS Lint Power Status, признак активности (включения) LINK-уровня
LinkOn Сигнал для включения LINK-уровня
Beta_Mode_link Признак работы интерфейса в режиме 1394b (при отсутствии сигнала интерфейс работает в режиме 1394a)
Direct Признак непосредственного соединения LINK-PHY (нет дифференцирования сигналов)

Интерфейсом управляет PHY или LINK, текущее состояние интерфейса (использование шины данных) определяется сигналами Ctl[0:1] в соответствии с таблицей ниже. По сравнению с 1394a интерфейс изменен в том, что все обращения к регистрам PHY происходят без использования шины данных: записываемые данные передаются по линии LReq, а считываемые данные и прерывания от PHY приходят по линии PInt.

Таблица. Состояние интерфейса B PHY-LINK (1394b)

Ctl[0:1] Состояние интерфейса
  Линиями Ctl[0:1] управляет PHY:
00 Idle — нет активности (дежурное состояние)
01 Status — PHY по шине данных посылает информацию о состоянии шины
10 Receive — PHY передает LINK-уровню пакет, принимаемый с шины
11 Grant — PHY передает LINK’у право использования шины данных
  Линиями Ctl[0:1] управляет LINK:
00 Idle — нет активности: LINK завершил передачу и отдает управление интерфейсом уровню PHY
01 Transmit — LINK передает данные PHY
10 Не используется
11 Hold/More_Info — LINK удерживает шину, готовясь к передаче пакета. В конце передачи пакета указывает на передачу следующего запроса

Данные, принимаемые и передаваемые по параллельной шине, растягиваются на n-тактов, в зависимости от скорости передачи: для S100 n = 8, для S200 n = 4, для S400 n = 2, для S800 каждый байт передается только в одном такте (n = 1). Более высокие скорости данным интерфейсом не поддерживаются.

Яндекс.Метрика