Шина IEEE 1394 — FireWire
- Подробности
-
Родительская категория: Шина IEEE 1394 — FireWire
-
Категория: Взаимодействие с физическим уровнем шины IEEE 1394
Физический уровень сам является источником и конечным получателем специальных пакетов, используемых для ряда целей:
- самоидентификации узлов шины;
- физического конфигурирования узлов;
- удаленного управления узлами;
- тестирования портов на образование петель в топологии (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 — значение, используемое для сравнения переданного и принятого пакетов.