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

Шина IEEE 1394 — FireWire

Взаимодействие с физическим уровнем шины IEEE 1394

Последовательный интерфейс PIL-FOP

Последовательный интерфейс подключает к однопортовому узлу с интегрированным портом, называемому PIL (Port Integrated Link), физический разветвитель FOP (Fan-Out PHY). Схема подключения с использованием этого интерфейса приведена на паервом рисунке. Узел PIL содержит один бета-порт, соединяемый с разветвителем FOP двумя дифференциальными однонаправленными сигнальными парами. В этих сигнальных парах может присутствовать и гальваническая развязка (конденсаторная или трансформаторная). Дополнительно от FOP должен передаваться сигнал LinkON, управляющий включением LINK-уровня по приему соответствующего пакета. Узел PIL и разветвитель FOP могут находиться в разных доменах питания. Внешние порты разветвителя FOP могут быть как бета-портами, так и универсальными, поддерживающими DS-сигнализацию.

Логически уровень PHY комбинации PIL-FOP выглядит как один многопортовый PHY, число его портов равно числу портов разветвителя с учетом дополнительного порта, обращенного к PIL. Этому порту назначается самый большой номер; он никогда не представляется как активный порт и его нельзя перевести в режим Standby. В пакетах самоидентификации этот порт отмечается как отсутствующий, удаленное обращение к его регистрам дает тот же результат, как обращение к отсутствующему порту.

PHY, предназначенный для роли FOP, может и не подключаться к PIL, а играть роль автономного повторителя-разветвителя (с отсутствующим LINK’ом). При этом порт, предназначенный для подключения PIL, может работать в традиционном, бета- или «двуязычном» режиме.

PIL и FOP обнаруживают присутствие (включение) друг друга, согласуют скорости и устанавливают синхронизацию так же, как и пара обычных бета-портов. В посылках согласования скоростей FOP будет передавать бит FOP_Capable, а порт интегрированного узла — бит PIL_Capable. Протокол согласования позволяет установить им друг с другом правильные взаимоотношения.

Для того чтобы порты FOP и PIL логически связались в единый набор портов многопортового узла, в интерфейсе PIL-FOP определен специальный двухточечный протокол обмена со своими специальными P2P-пакетами (point-to-point). Пакеты P2P передаются только по интерфейсу между PIL и FOP, на общую шину они не выходят. Пакеты P2P передаются между пакетами основного трафика шины. Если во время передачи пакета P2P требуется передача основного трафика, то пакеты P2P прерываются, а пакеты основного трафика передаются беспрепятственно. Формат пакетов P2P приведен на рисунке ниже, назначение полей приведено ниже:

  • PP1 и PP2 — байты-префиксы пакетов (00011xx1 и 00111xx1 соответственно);
  • D1 — байт, определяющий операцию:
     -0000xxxx — нет операции;
     -0001aaaa — запись в регистр FOP, aaaa — адрес, D2 содержит данные;
     -0010aaaa — чтение регистра aaaa;
     -0011aaaa — неожидаемое (для PIL) чтение регистра aaaa, D2 содержит считанные данные;
     -0100aaaa — ожидаемые (для PIL) результаты чтение регистра aaaa, D2 содержит считанные данные;
     -0101iiii — уведомление о прерывании от FOP, iiii — код прерывания (0001 — прерывание от физического уровня, остальные коды пока не определены);
     -0110xxxx — Cycle Start Due, если в FOP установлен бит enab_accel, PIL посылает это уведомление после начала каждого изохронного периода (по своим часам);
     -0111xxxx — Restore_Notify, уведомление восстановления, посылает FOP, начинающий восстановление как «племянник»;
     -10000000 — 11111111 — резерв;
  • D2 — данные записи или чтения (присутствуют не во всех пакетах);
  • DE1, DE2 — маркеры конца данных DATA_END.

Каждый байт пакета на рисунке представлен в виде одного символа, который после кодирования 8B/10B представляется десятью битами сигнала на шине. Пакеты P2P могут быть прерваны в любом месте управляющими символами префикса данных или кода скорости, что означает начало пакета основного трафика, передаваемого по шине. Если пакет прерывается до DE1, то он повторяется передатчиком и игнорируется приемником. Пакет, прерванный после DE1, используется по назначению, поскольку все его содержательные поля и разделитель уже переданы.

Пакеты PHY

Физический уровень сам является источником и конечным получателем специальных пакетов, используемых для ряда целей:

  • самоидентификации узлов шины;
  • физического конфигурирования узлов;
  • удаленного управления узлами;
  • тестирования портов на образование петель в топологии (1394b).

Пакеты PHY-уровня по формату отличаются от пакетов транзакций и потоков: PHY-пакеты имеют длину 64 бита, первые 32 несут информацию, а в следующих 32 битах содержится инверсное значение информационных бит. Такой способ контроля позволяет отличить PHY-пакет от изохронного пакета с нулевой длиной данных: CRC-контроль для пакета PHY позволит сформировать сигнал об ошибке, что в совокупностью с длиной в 64 бита и является признаком PHY-пакета. Несоответствие контрольных бит информационным заставляет получателя игнорировать пришедший пакет. Адресация PHY-пакетов тоже иная — здесь используется только 5-битный идентификатор узла (PHY-пакеты за пределы шины не выходят). Назначение PHY-пакета определяется по первым двум битам.

Форматы пакетов самоидентификации приведены на рисунке 1. В 1394–1995 допускалось до четырех пакетов (0, 1, 2 и 3), что позволяло описывать свойства до 27 портов одного узла. В 1394a сократили число портов до 16, в результате остались только пакеты 0, 1 и 2. Назначение полей пакетов самоидентификации приведено ниже:

  • phy_ID — идентификатор узла;
  • L (Link Active) — признак активности LINK-уровня;
  • gap_cnt — счетчик для определения зазоров арбитража;
  • sp (PHY Speed) — скорость, поддерживаемая PHY-уровнем данного узла (может быть и выше, чем поддерживает уровень LINK): 00 — S100, 01 — S200, 10 — S400, 11 — скорость определяется по регистру PHY;
  • brdg (bridge) — поле зарезервировано для IEEE 1394.1 (мосты между шинами). В 1394 на этом месте было поле del (PHY Delay) — максимальная задержка повторителя: 00 — ≤ 144 нс, остальные значения зарезервированы;
  • c (contender) — претендент на роль диспетчера;
  • pwr (Power Class) — отношение к питанию;
  • p0…p6 (Port status, 2 бита на порт) — состояние порта: 11 — активен (или в состоянии Standby), подключен к c-узлу, 10 — активен (или в состоянии Standby), подключен к p-узлу, 01 — неактивен (запрещен, не подключен, приостановлен), 00 — нет порта;
  • i (Initiated reset) — признак того, что текущий сброс на шине вызвал этот узел;
  • m (More packets) — признак наличия последующих пакетов самоидентификации;
  • r — зарезервированные поля (на рисунке заштрихованы).

Форматы управляющих пакетов физического уровня приведены на рисунке 2.

Пакеты физического конфигурирования являются широковещательными, их принимают все узлы шины. Пакеты используются двояко:

  • для выборов нового корня (R = 1, T = 0) пакет посылается с указанием в поле root__ID идентификатора узла, которому надлежит стать корнем после грядущего сброса. Этот узел должен установить бит RHB (задержка при идентификации дерева), остальные узлы — его сбросить;
  • для оптимизации зазоров арбитража (R = 0, T = 1) пакет посылается с указанием phy_ID корневого узла. В пакете указывается значение gap_cnt, рассчитанное для текущей топологии.

Длительность зазора арбитража и зазора сброса арбитража определяется через значение gap_cnt по формулам:

TSubaction_gap=(29+16×gap_cnt)/98,304 (мкс), диапазон значений 0,3–10,6 мкс; TArb_reset_gap=(51+32×gap_cnt)/98,304 (мкс), диапазон значений 0,5–21 мкс. По сбросу, связанному с изменением топологии шины (и по включению питания), принимается максимальное значение gap_cnt=63. В зависимости от топологии шины диспетчер шины может вычислить минимально допустимое значение gap_cnt и сообщить его всем узлам. Это новое значение будет действовать до следующего изменения топологии (PHY способен определить, связан ли сброс с подключением/отключением устройства; если не связан — значение gap_cnt сохраняется).

Пакет Link_On является директивой включения питания LINK-уровня (и вышестоящих) узлу, адресованному полем phy_ID.

Расширенные физические пакеты были введены в 1394a для удаленного доступа к PHY-регистрам, посылки пробного пакета и пакета возобновления:

  • пробный пакет (Ping, рис. 3, а) заставляет узел с идентификатором phy_ID послать пакет(ы) самоидентификации. Диспетчер шины посылает эти пакеты всем узлам шины и измеряет время отклика, что позволяет ему рассчитать допустимое (минимальное) значение зазоров арбитража;
  • пакет удаленного доступа (Remote Access Packet, рис. 3, б) позволяет прочитать PHY-регистр удаленного узла. Пакет удаленного ответа (Remote Access Reply, рис. 3, в) возвращает считанные данные;
  • пакет удаленной команды (Remote Command Packet, рис. 3, г) позволяет подать команду узлу. В ответ на него узел через короткий интервал ack_gap посылает пакет подтверждения выполнения, в котором передается и текущее состояние (Remote Confirmation Packet, рис. 3, д);
  • пакет возобновления (Resume Packet, рис. 3, е) предназначен для инициирования возобновления работы всех приостановленных портов адресованного устройства или всех устройств (может передаваться с широковещательным адресом 3Fh). Этот пакет не предполагает подтверждений.

Форматы расширенных физических пакетов 1394a приведены на рис. 3, назначение полей приведено ниже:

  • phy_ID — идентификатор узла;
  • type — тип команды: 0 — пробный пакет, 1 — чтение одного из базовых регистров, 5 — чтение страничного регистра, 8 — удаленная команда, код команды в поле cmd, Ah — удаленное подтверждение, Fh — возобновление;
  • page — номер страницы;
  • port — номер порта;
  • reg — адрес регистра;
  • cmd — код удаленной команды: 0 — NOP (нет операции), 1 — передать уведомление TX_DISABLE_NOTIFY и запретить порт, 2 — инициировать приостановку порта (Suspend Port), 4 — сбросить биты отказа порта (Fault и Standby_Fault), 5 — разрешить порт, 6 — инициировать возобновление работы порта (Resume Port); 7 — расширенная команда (код в поле e_cmnd);
  • e_cmnd (в 1394b) — расширенная команда: 0 — NOP (нет операции), 1 — инициировать переход в Standby для партнера; 2 — инициировать выход из Standby для партнера, 3–7 — резерв;
  • s (standby_fault, 1394b) — состояние одноименного бита страницы состояния порта;
  • f (Fault) — состояние одноименного бита страницы состояния порта;
  • c (Connected) — состояние одноименного бита страницы состояния порта;
  • b (bias) — состояние одноименного бита страницы состояния порта;
  • d (disabled) — состояние одноименного бита страницы состояния порта;
  • ok — состояние команды: 1 — принята, 0 — отвергнута.

В IEEE 1394b для восстановления из состояния Standby используется пакет физического конфигурирования, который передается только от «дяди» к «племяннику» (рис. 4, а). При этом назначение полей становится следующим:

  • phy_ID — идентификатор узла (возможно, изменившийся);
  • R = 1 (игнорируется);
  • бит T содержит копию переменной gap_count_reset_disable «дядиного» узла. Переменная gap_count_reset_disable — запрет сброса счетчика зазора в исходное значение, устанавливается по приему пакета физического конфигурирования, задающего длительность зазора;
  • gap_cnt — новое значение зазора;
  • MLP — восстанавливаемое значение max_Legacy_path_speed;
  • L — признак наличия корня в локальном B-облаке;
  • B (B_bus) — признак отсутствия старых узлов на шине;
  • Q — копия бита R из R0 передающего узла;
  • P — копия бита PS из R0 передающего узла;
  • A — текущая асинхронная фаза: 1 — нечетная, 0 — четная;
  • N — признак сбросов шины, происшедших с момента перехода в состояние Standby.

Пакет тестирования на петли (Loop Test Packet, рис. 4, б), введенный в 1394b, содержит следующие поля:

  • m (mode) — режим: 0 — тест, 1 — идет процесс подключения;
  • G (Generation) — номер генерации, чередующиеся 0 и 1 указывают на изменение значения test_value
  • test_value — значение, используемое для сравнения переданного и принятого пакетов.