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

Все о подвале своими руками.

Шина IEEE 1394 — FireWire

Конфигурирование шины и узлов IEEE 1394

Общая информация о конфигурировании шины и узлов IEEE 1394

Конфигурирование шины IEEE 1394 выполняется в различных ситуациях:

  • автоматически при изменении конфигурации — при подсоединении и отсоединении устройств, а также включении/выключении их PHY-уровня;
  • при обнаружении каким-либо узлом фатальной ошибки — «зависания» шины;
  • по инициативе какого-либо узла, желающего, например, изменить топологию (сменить корневой узел).

Конфигурирование состоит из трех последовательных этапов.

  1. Сброс (Bus Reset), с момента которого прекращается передача полезного трафика.
  2. Идентификация дерева (Tree Identification), во время которой узлы выстраиваются в иерархическую структуру.
  3. Самоидентификация узлов (Self Identification), во время которой узлы присваивают себе уникальные физические идентификаторы.

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

В первоначальной версии шины самое большое время во всей процедуре конфигурирования занимал сброс. В физический уровень 1394 вносились усовершенствования, направленные на минимизацию потерь времени при сбросе. Остальные этапы конфигурирования происходят быстрее, но в случае образования петлевого соединения идентификация дерева никогда не закончится. Эта ситуация обнаруживается любым узлом, и сообщение о ней доводится до пользователя. В 1394b приняты меры по автоматическому исключению петлевых соединений.

Свойства любого узла сконфигурированной шины наблюдаемы и управляемы через его архитектурные регистры и память конфигурации. Они доступны со стороны шины через асинхронные транзакции к определенным адресам. Архитектурные регистры определяют поведение узла на шине. Память конфигурации раскрывает «прикладную ценность» узла и обеспечивает его уникальную идентификацию, не зависящую от непостоянного физического идентификатора.

Сброс шины (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).

Идентификация дерева

Во время идентификации дерева узлы выстраиваются в иерархическую структуру и выбирается корень шины. Для узлов идентификация дерева сводится к определению статуса активных портов: присвоение им типов: c-порт (к которому подключен дочерний узел) или p-порт (которым он подключается к родительскому). Этап идентификации дерева начинается после сброса. Для идентификации используется сигнализация арбитража.

В начале идентификации дочерние узлы ищут своих родителей, посылая им сигнал уведомления Parent_Notify, а родители признают свои дочерние узлы сигналом Child_Notify. Сигнал Parent_Notify безусловно посылают узлы-листья (имеющие всего по одному порту). Узлы-ветви могут послать сигнал Parent_Notify только на один из своих портов, при условии, что на все остальные активные порты пришли аналогичные сигналы. При этом порты, на которые пришел сигнал Parent_Notify, помечаются как c-порты. На эти порты посылается уведомление Child_Notify, но не раньше, чем когда сигнал Parent_Notify будет обнаружен на всех активных портах, кроме одного. Порт, на который пришел сигнал Child_Notify, помечается как p-порт; он перестает посылать сигнал Parent_Notify, что является подтверждением приема сигнала Child_Notify.

Узел, у которого на все порты приходят сигналы Parent_Notify, становится корнем. Все его порты становятся c-портами. Он посылает на эти порты сигнал Child_Notify, а получив подтверждение (снятые сигналы Parent_Notify), и сам прекращает подавать сигналы Child_Notify. На этом идентификация дерева заканчивается, и шина переходит к этапу самоидентификации узлов.

Возможна ситуация, когда два соединенных узла пытаются друг в друге найти своих родителей, посылая сигнал Parent_Notify. При этом столкновение данных сигналов приводит к приему каждым портом состояния Root_Contention — признака состязания за роль корня. В этом случае оба узла перестают подавать сигнал на эти порты и через случайный интервал проверяют их состояние. Узел, обнаруживший состояние покоя на данном порте, посылает сигнал Parent_Notify. Узел, обнаруживший этот сигнал, посылает сигнал Child_Notify и становится корнем. В начале состязания каждый узел случайным образом устанавливает для себя время задержки из двух вариантов:

  • ROOT_CONTEND_FAST (0,24–0,26 мкс) — быстрый участник;
  • ROOT_CONTEND_SLOW (0,57–0,6 мкс) — медленный участник.

Тот узел, который окажется быстрее, корнем не станет (он раньше начнет искать родителя). Если оба участника выберут одинаковое время, то они опять столкнутся и повторят состязание с новыми значениями задержки.

На том, что в состязании за роль корня побеждает самый медленный участник, построен механизм принудительного назначения корня. У каждого PHY есть бит RHB, единица в котором заставляет этот узел задерживать подачу сигнала поиска родителей на 83–167 мкс от начала идентификации дерева. Специальный пакет физического конфигурирования позволяет установить этот бит у заданного узла и сбросить у всех остальных, что обеспечит победу данному узлу в последующих выборах корня по ближайшему сигналу сброса. Если вдруг окажется, что бит RHB установлен у нескольких узлов, то они разыграют право стать корнем по вышеописанному правилу случайных состязаний.

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

  • бесконфликтный (рис. а);
  • с состязанием между узлами B и C (рис. б);
  • с принудительным назначением роли корня для узла E (рис. в). В этом примере показано, как благодаря выдержке узла E из той же топологии соединений, что была и на рис. а, вырастает иное дерево.

В случае образования петли процесс идентификации дерева «зависает». Эта ситуация выявляется по срабатывании тайм-аута арбитража (167 мкс); она сигнализируется через LINK приложению и пользователю, который должен принять меры к разрыву петли (физическим переключением кабелей). В 1394b приняты меры по автоматической борьбе с петлями путем запрещения работы какого-либо порта по результатам проверки.

Самоидентификация узлов

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

Промежуточные узлы-ветки и корневой узел организуют передачу права самоидентификации всем узлам по порядку. Порядок, в котором узлы выполняют самоидентификацию, определяется нумерацией портов в промежуточных узлах (ветках и корне). Первым будет самоидентифицироваться конечный узел (лист), который подключен к порту корня с наименьшим номером и путь к которому лежит в узлах-ветках через порты с наименьшими номерами. Этот узел получит PHY_ID=0. Последним идентифицируется корень — он получает наибольший идентификатор.

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

Право на самоидентификацию получает узел, которому по p-порту приходит сигнал Self_ID_Grant, а все его c-порты (если таковые есть) уже сконфигурированы. В ответ на предназначенный ему Self_ID_Grant узел отвечает передачей (вверх) префикса данных. Когда в ответ на это узел увидит снятие сигнала Self_ID_Grant, он посылает пакет(ы) самоидентификации. Пакет самоидентификации всегда передается на скорости S100. Пакет содержит информацию, описывающую физические свойства узла:

  • идентификатор (PHY_ID), который узел назначает себе сам равным числу услышанных им пакетов самоидентификации (пакетов-0). Самый первый идентифицирующийся узел возьмет PHY_ID=0, корень получает наибольший идентификатор;
  • число портов и их состояние: неактивен, c-порт или p-порт. Эту информацию узел получает на предшествующем этапе — при конфигурировании дерева;
  • зазор арбитража, взятый по умолчанию (при смене топологии) или сохраненный с прошлого сеанса работы (до сброса);
  • доступная скорость работы (определяется свойствами узла, заложенными разработчиком);
  • отношение к питанию от шины, определяется аналогично;
  • состояние LINK-уровня (бит L, определяется по факту включения);
  • претензии на роль диспетчера (бит C), определяемые с участием прикладного ПО.

При числе портов более трех узел посылает серию пакетов самоидентификации. Пакеты самоидентификации слышат все узлы, по ним они могут строить карту топологии и карту скоростей. Прослушивая пакеты самоидентификации, узлы определяют диспетчера изохронных ресурсов — им станет узел с максимальным номером PHY_ID, у которого в пакете самоидентификации установлены биты C и L. Завершив передачу пакетов самоидентификации, узел посылает в p-порт сигнал Ident_Done. На это родительский узел отвечает префиксом данных и помечает свой соответствующий c-порт как сконфигурированный. При подаче сигнала Ident_Done узел с помощью смещения уровней сообщает доступную ему скорость работы; его родитель при передаче префикса данных аналогичным образом сообщает свою. Таким образом, на завершающем этапе самоидентификации узла его p-порт и соединенный с ним c-порт родительского узла согласуют и устанавливают максимально возможную скорость обмена друг с другом.

Промежуточный узел-ветка, получивший сверху сигнал Self_ID_Grant, транслирует его на свой несконфигурированный c-порт с наименьшим номером; на остальные порты он посылает префикс данных. Получив префикс данных с c-порта, промежуточный узел прекращает подачу сигнала Self_ID_Grant (вниз) и транслирует префикс данных вверх. Далее, если после прохождения пакета самоидентификации на c-порт приходит сигнал Ident_Done, узел ответит ему префиксом данных с указанием своей скорости и пометит данный порт как сконфигурированный. Когда промежуточный узел, у которого все c-порты сконфигурированы, снова получит сигнал Self_ID_Grant, он сам отправит пакет(ы) самоидентификации (во все активные порты), а затем и сигнал Ident_Done.

Корневой узел посылает сигнал Self_ID_Grant в порт с наименьшим номером из числа активных несконфигурированных. На остальные порты он посылает префикс данных. Как только с порта, на который корень посылает Self_ID_Grant, он получит префикс данных, подача сигнала Self_ID_Grant прекращается. Когда корень обнаружит покой шины (после прохождения пакетов самоидентификации от узла, которому досталось это право), он снова пошлет сигнал Self_ID_Grant, опять же на несконфигурированный порт с наименьшим номером. Если самоидентифицировался узел, подключенный к корню, то корень получит сигнал Ident_Done и пометит данный порт как сконфигурированный. Теперь корень пошлет Self_ID_Grant на следующий порт. Как только все порты перейдут в сконфигурированное состояние, корень пошлет свой пакет самоидентификации, на чем процесс самоидентификации и закончится — шина переходит в фазу нормального арбитража.

Архитектурные регистры CSR

Шина IEEE 1394 основана на стандарте ISO/IEC13213, известном под названием «CSR-архитектура», и наследует его основные регистры и структуры данных в памяти конфигурации. Архитектурные регистры CSR занимают первые 512 байт в начальном адресном пространстве узла. Часть регистров CSR-архитектуры в IEEE 1394 не используется, их описание здесь опущено.

Регистр состояния и управления STATE (см. рисунок ниже) доступен для чтения по двум адресам — State_Clear (000h) и State_Set (004h). Некоторые биты доступны лишь для чтения (RO), другие биты допускают программный сброс (записью единиц в биты State_Clear) и аналогичную установку (через регистр State_Set). Назначение полей регистра состояния и управления:

  • unit_depended — биты, специфичные для устройства;
  • bus_depended — биты, специфичные для шины:
    -----gone — бит, устанавливаемый по любому сбросу (устройства или шины) или по команде. Запрещает устройству посылку запросов. Обнуляется программно (возможно, и удаленно) при инициализации, когда устройство становится способным отвечать на запросы;
    -----abdicate — бит, предназначенный для смены диспетчера шины. Устанавливается у узла, который должен стать диспетчером шины после грядущего сброса. При этом он не будет ждать положенных 125 мс (как «честные» кандидаты) перед тем, как сделать попытку блокированной транзакции с регистром BUS_MANAGER_ID;
    -----linkoff — состояние питания LINK-уровня, питающегося от шины (1 — отключено). Может быть установлен программно, обнуляется (и включается питание) по приему пакета Link_On;
    -----cmstr — признак мастера циклов. Может быть установлен только у корневого узла.
  • lost — потеря работоспособного состояния (по сбросу питания или фатальной ошибке;
  • dreq (disable request) — запрет генерации запросов транзакций;
  • atn, off — резервные биты в 1394;
  • elog — признак обновления информации в журнале ошибок;
  • state (RO) — состояние узла: 00 — рабочее (running), инициализация завершена; 01 — идет инициализация; 10 — тестирование (по запуску через запись в регистр Test_Start); 11 — фатальная ошибка (узел неработоспособен).

Регистр идентификатора узла NODE_IDS (см. следующий рисунок) содержит поля:

  • bus_id — идентификатор шины (по умолчанию 0), команда сброса на него не влияет; этот идентификатор записывается и считывается программно;
  • PHY_ID — идентификатор узла, устанавливаемый при автоконфигурировании;
  • Bus_dependent — поле, зарезервированное для нужд шины.

Регистр команды сброса Reset_Start (00Ch) служит для подачи команды сброса (операцией записи), при этом значим только бит nt (no test, бит 31), единица в котором отменяет начальное тестирование узла при сбросе.

Регистры тайм-аута расщепленных транзакций позволяют задать предельное время ожидания ответа на запрос транзакции в пределах 8 с с дискретностью 125 мкс. Начальное значение — 100 мс, по сбросу не изменяется. В младших трех битах SPLIT_TIMEOUT_HI (018h) содержится число секунд, в старших 13 битах SPLIT_TIMEOUT_LO (01Ch) содержится число 125-микросекундных интервалов.

Регистры тестирования (необязательные) служат для запуска теста (TEST_START, 028h), передачи параметров теста (ARGUMENT_HI, 020h, ARGUMENT_LO, 022h) и сообщения состояния выполнения (TEST_STATUS, 02Ch).

Регистры прерываний (необязательные) служат для управления прерываниями, вызываемыми транзакциями записи в регистр INTERRUPT_TARGET (050h). Каждый бит этого регистра соответствует одному из условий (событий) прерывания; самый старший бит соответствует прерыванию с самым высоким приоритетом. Регистр INTERRUPT_MASK позволяет селективно выбирать условия, вызывающие сигнализацию прерывания приложению (процессору) данного узла (единичное значение бита маски разрешает прерывание по данному условию). Прерывания по шине могут посылаться широковещательно (адресуясь к регистру INTERRUPT_TARGET при Dest_ID = 63) или направленно, с указанием в целевом адресе идентификатора требуемого узла.

Регистры синхронизации (Clock_Value, Clock_Tick_Period, Clock_Strobe_Arrived, Clock_Info) в IEEE 1394, как правило, не используются — их функции выполняет регистр CYCLE_TIME).

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