link0 link1 link2 link3 link4 link5 link6 link7 link8 link9 link10 link11 link12 link13 link14 link15 link16 link17 link18 link19 link20 link21 link22 link23 link24 link25 link26 link27 link28 link29 link30 link31 link32 link33 link34 link35 link36 link37 link38 link39 link40 link41 link42 link43 link44 link45 link46 link47 link48 link49 link50 link51 link52 link53 link54 link55 link56 link57 link58 link59 link60 link61 link62 link63 link64 link65 link66 link67 link68 link69 link70 link71 link72 link73 link74 link75 link76 link77 link78 link79 link80 link81 link82 link83 link84 link85 link86 link87 link88 link89 link90 link91 link92 link93 link94 link95 link96 link97 link98 link99 link100 link101 link102 link103 link104 link105 link106 link107 link108 link109 link110 link111 link112 link113 link114 link115 link116 link117 link118 link119 link120 link121 link122 link123 link124 link125 link126 link127 link128 link129 link130 link131 link132 link133 link134 link135 link136 link137 link138 link139

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

Шина IEEE 1394 — FireWire

Шина IEEE 1394 — FireWire

Распознавание подключения-отключения устройств и состояние порта. Сигнализация арбитража

Распознавание подключения-отключения устройств и состояние порта

Каждый порт через резисторы-терминаторы (55 Ом) подает от источника смещения TpBias напряжение 1,6–2 В на линии пары A и измеряет среднее значение на линиях пары B (приемник состояния Port_Status). Если измеренное напряжение превышает 1 В, это означает, что на противоположном конце кабеля имеется подключенное устройство. Уровень напряжения ниже 0,6 В является признаком отключения устройства. Поскольку кабель соединяет линии A и B пары устройств перекрестно, оба устройства видят присутствие или отсутствие друг друга. Подключение партнера определяется сигналом Port_Status, вырабатываемым детектором состояния (линейным приемником пары B).

В 1394a введена возможность приостановки узла, которая подтверждается снятием напряжения смещения. Для узла 1394 это будет означать отключение устройства. В 1394a введена дополнительная схема обнаружения подключения/отключения: в приемопередатчик пары A введен источник маленького тока Icd (не более 76 мкА) и детектор отключения. Когда противоположный узел подключен, этот ток проходит в землю через нагрузку около 5 кОм (терминаторы на противоположном узле и заземляющий резистор), так что на входе детектора отключения напряжение не превышает 0,4 В. При отсоединении противоположного узла нагрузка снимается и напряжение на входе детектора поднимается выше 0,4 В. Эта схема обнаружения отключения включается только после согласования перехода в режим Suspend, когда снимается подача напряжения смещения. В состоянии покоя шины (Bus Idle State), когда активные порты двух узлов соединены друг с другом, на обоих парах A и B присутствует напряжение смещения (TpBias).

В 1394a введены дополнительные состояния порта:

  • Disabled — работа порта запрещена, он не передает никаких сигналов (но смещение подает) и не воспринимает сигналы;
  • Suspended — порт приостановлен, при этом он не подает напряжение смещения и включает детектор отключения.

Сигнализация арбитража

Каждый порт может по своим линиям передавать сигналы Arb_A(Tx) и Arb_B(Tx) и принимать сигналы Arb_A(Rx) и Arb_B(Rx), принимающие значения 0, 1 или Z. Сигнал, передаваемый узлом-1 по линии A, приходит на соседний узел-2 по линии B; при этом он может «сталкиваться» с сигналом, передаваемым узлом-2 по линии B. Для сигнала, передаваемого по линии B, действует симметричное правило. Таким образом, принимаемый сигнал является функцией от передаваемых сигналов двух передатчиков: Arb_A1(Rx) зависит от Arb_A1(Tx) и Arb_B2(Tx), Arb_B1(Rx) зависит от Arb_A2(Tx) и Arb_B1(Tx). Если один из передатчиков находится в состоянии Z, то приемник видит сигнал от другого передатчика без изменений. Если оба передатчика передают один и тот же сигнал, то приемник его так и воспринимает.

При декодировании сигналов арбитража действуют следующее правило доминирования единицы:

  • если порт передает сигнал 0, а принимает Z (это значит, что соседний узел передает 1), то это состояние декодируется как «1»;
  • если порт передает сигнал 1, а принимает Z (это значит, что соседний узел передает 0), то это состояние тоже декодируется как «1».

Сигналы арбитража используются для сброса шины, конфигурирования и собственно арбитража. Состояние передаваемых (Arb_A(Tx), Arb_B(Tx)) и принимаемых (Arb_A(Rx), Arb_B(Rx)) сигналов в различных фазах работы шины приведено в табице. В качестве принимаемых значений здесь указаны декодированные состояния (с учетом посылаемых сигналов и правила доминирования единицы).

Таблица. Сигналы арбитража в различных фазах шиныф

Передаваемое состояние Arb_A(Tx), Arb_B(Tx) Принимаемое состояние Arb_A(Rx), Arb_B(Rx)
Сброс шины
Bus Reset [1 1] Bus Reset [1 1]
Идентификация дерева
Tx_Parent_Notify, поиск родителей [0 Z] Rx_Parent_Notify [Z 0]
Tx_Child_Notify, подтверждение родительских прав [1 Z] Rx_Parent_Handshake [0 1]
Снятие Tx_Parent_Notify [Z Z] Rx_Child_Handshake [1 Z]
Оба узла посылают Tx_Parent_Notify [0 Z] Rx_Root_Contention — состязание за роль корня [0 0]
Самоидентификация
Tx_Self_ID_Grant, предоставление права самоидентификации [Z 0] Rx_Self_ID_Grant [0 0]
Tx_Ident_Done, завершение самоидентификации [1 Z] Rx_Ident_Done [Z 1]
Нормальный арбитраж
Tx_Request, узел посылает запрос передачи через p-порт [Z 0] Rx_Request [0 Z]
Tx_Grant, узел разрешает передачу через c-порт [Z 0] Rx_Grant [0 0]
Узел снимает запрос [Z Z] Rx_Request_Cancel —узел видит снятие запроса [Z 0]
Префикс данных Tx_Data_Prefix [0 1] Rx_Data_Prefix [1 0]
Конец пакета данных Tx_Data_End [1 0] Rx_Data_End [0 1]
Tx_Disable_Notify, сигнал на запрещение порта [Z 1] Rx_Disable_Notify [1 Z]
Tx_Suspend, сигнал приостановки порта [0 0] Rx_Suspend [0 0]

 Сброс шины (Bus Reset) может быть сигнализирован в любой момент любым устройством. Сигнал сброса имеет приоритет над всеми сигналами (благодаря правилу доминирования единиц). Сигнал сброса, сгенерированный или обнаруженный узлом, распространяется на все его порты (кроме запрещенных). Длительность генерируемого сигнала сброса составляет 167 мкс, в 1394a введен и короткий сброс длительностью 1,4 мкс. По сигналу сброса узел инициализируется и переводит все свои порты в состояние покоя (Bus Idle). После этого начинается фаза идентификации дерева.

Во время фазы идентификации дерева (Tree Identification) с помощью сигналов арбитража «дети» ищут своих «родителей» и выстраивается дерево шины. Во время фазы самоидентификации (Self Identification) с помощью сигналов арбитража узлам поочередно предоставляется право передать пакет(ы) самоидентификации и сообщить о завершении передачи этих пакетов. Подробнее о процессах идентификации см. в главе 20. Во время нормальной работы сигналы арбитража используются для запроса и предоставления права на передачу пакетов.

Прием состояния PHY, прерываний и результатов чтения регистров

Состояние PHY, результаты чтения регистров и прерывания передаются последовательно по линии Pint (см. рисунок). Значения кодов индикации состояния раскрыты в таблице. Поля адреса считываемого регистра (RA) и считанных данных (RD) используются только при индикации результатов чтения. Индикация результатов чтения может быть как запрошенной LINK’ом, так и неожиданной для него (чтение по инициативе PHY).

Таблица. Посылки состояния PHY

Код индикации состояния
ST[0:2]
Назначение Требуемые поля
000 NOP, нет индикации состояния
001 PHY_INTERRUPT, прерывание от PHY (тайм-аут конфигурирования из-за петли, пропадание кабельного питания, событие порта или тайм-аут арбитража)
010 PHY_REGISTER_SOL, результат чтения регистра по запросу LINK’а RA, RD
011 PHY_REGISTER_UNSOL, результат неожидаемого чтения регистра RA, RD
100 PH_RESTORE_NO_RESET, инициализация интерфейса с сообщением об отсутствии сбросов шины, о которых не было сообщено LINK’у (или PHY начал процесс восстановления интерфейса)
101 PH_RESTORE_RESET, инициализация интерфейса с сообщением о сбросе шины, происшедшем за время пребывания интерфейса в состоянии Standby
110 Не используется (игнорируется LINK’ом)
111 Резерв

Фильтрация асинхронных запросов

Каждый приходящий асинхронный запрос, не относящийся к 1-килобайтной области памяти конфигурации, фильтруется трехступенчатым фильтром. Первая ступень фильтра по идентификатору узла-источника определяет судьбу запроса:

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

Запросы чтения памяти конфигурации принимаются от любых источников и отрабатываются аппаратно (если в хост-контроллере определен корректный образ памяти конфигурации).

Фильтрацией асинхронных запросов управляют 64-битные регистры AsynchronousRequestFilter и PhysicalRequestFilter, каждый из которых представлен регистрами установки и сброса старшей (Hi) и младшей (Lo) половин. Первая ступень фильтрации выполняется в соответствии с содержимым регистра AsynchronousRequestFilter. В этом 64-битном регистре единица в старшем бите (asynReqResourceAll) разрешает отработку асинхронных запросов от всех источников. При его нулевом значении остальные биты разрешают отработку запросов от узлов с PHY_ID, соответствующих номерам бит (младший бит соответствует PHY_ID = 0). Управление данным фильтром осуществляется через регистры AsynchronousRequestFilterHiSet (100h), AsynchronousRequestFilterHiClear (104h), AsynchronousRequestFilterLoSet (108h), AsynchronousRequestFilterLoClear (10Ch).

Вторая ступень фильтрует прошедшие запросы по адресу смещения, указанному в пакете запроса. Кандидатами на физическую отработку являются запросы, адресованные к нижней области памяти и к автономным регистрам. Граница нижней области задается регистром PhysicalUpperBound (120h) — в нем содержатся старшие 32 бита 48-разрядного адреса начала средней области памяти, которая уже не попадает в кандидаты на физическую отработку запросов. Младшие 16 бит считаются нулевыми. Если данный регистр отсутствует в OHC, то его чтение дает нули, что должно трактоваться как указание на размер нижней области 4 Гбайт.

Последний фильтр, управляемый регистром PhysicalRequestFilter, определяет способ обработки запроса-кандидата на физическую обработку. В этом 64-битном регистре единица в старшем бите (physReqResourceAllBuses) разрешает физическую обработку запросов от узлов всех шин. Остальные биты относятся к узлам локальной шины (на которой находится узел с OHC), они разрешают физическую отработку запросов от узлов с соответствующими номерами. Запросы, не прошедшие через данный фильтр, направляются в контекст AR_Request DMA и обрабатываются программно. Управление данным фильтром осуществляется через регистры PhysicalRequestFilterHiSet (110h), PhysicalRequestFilterHi-Clear (114h), PhysicalRequestFilterLoSet (118h), PhysicalRequestFilter-LoClear (11Ch).

Конфигурирование шины

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

  • сброс (Bus Reset) — приведение всех узлов в исходное (несконфигурированное) состояние;
  • идентификация дерева — построение иерархической структуры шины;
  • самоидентификация узлов — назначение физических адресов и сообщение ими своих свойств, относящихся к шине. На этом этапе выбирается (не обязательно) и узел-диспетчер изохронных ресурсов.

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

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

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

Протоколы повторов при занятости

Для организации повторов из-за занятости используется один из двух протоколов, который выбирает целевое (занятое) устройство: однофазный или двухфазный. Первая попытка посылки пакета (запроса или ответа) выполняется всегда одинаково: в заголовке пакета поле rt = 00. Если на этот пакет приходит квитанция с одним из кодов, означающим занятость — 4 (ack_busy_x), 5 (ack_busy_A) или 6 (ack_busy_B), то узел организует последующие попытки передачи этого пакета, устанавливая в поле rt значение: 01 (Retry_x), 10 (Retry_A) или 11 (Retry_B) соответственно. Попытки повторов выполняются с обычным (справедливым) арбитражем, «предел терпения» определяется в зависимости от используемого протокола повторов.

Протокол однофазных повторов (Single Phase Retry) использует только код квитирования 4 (ack_busy_x), в ответ на который повторные попытки передачи делаются с кодом rt = 01 (Retry_x). Максимальное число повторов одного пакета ограничено 4-битным полем retry_limit регистра BUSY_TIMEOUT (смещение 210h в пространстве регистров CSR, см. рисунок). По достижении этого лимита повторные попытки прекращаются, и уровень транзакций сообщает драйверу о невозможности посылки данного пакета из-за занятости адресуемого узла.

Протокол двухфазных повторов (Dual Phase Retry) позволяет несколько упорядочить обслуживание занятым (перегруженным) узлом пакетов разных транзакций. Для этого вводится чередование двух фаз — фазы A и фазы B. Если занятый узел получает пакет первой попытки (rt = 00), он на него отвечает кодом квитирования 5 (ack_busy_A) и ожидает его повторного прихода с кодом rt = 10 (Retry_A). Теперь этот узел находится в фазе A и будет пытаться обслуживать только пакеты с rt = 10. На все первые попытки других транзакций узел будет отвечать кодом квитирования 6 (ack_busy_B), что заставит узлы, их посылающие, делать попытки повторов с rt = 11 (Retry_B), в данной фазе не обслуживаемые. Только после того, как наш узел сумеет обслужить пакет с rt = 10 и в течение четырех подряд интервалов справедливости не будет получать другие пакеты с rt = 10 (Retry_A), он перейдет в фазу B и начнет обслуживать пакеты с rt = 11 (Retry_B). При этом на новые первичные пакеты он будет отвечать кодом квитирования 5 (ack_busy_A). После обслуживания пакетов фазы B узел снова перейдет в фазу A — получается подобие игры в пинг-понг. Предел «терпения» узла, посылающего повторные пакеты по двухфазному протоколу, определяется уже по времени: ограничивается время, отсчитываемое от момента первой попытки передачи. Это время не должно превышать значение, заданное полями seconds_limit и cycle_limit в том же регистре BUSY_TIMEOUT. 13-битный счетчик, соответствующий полю cycle_limit, считает по модулю 8000 (полный оборот за 1 секунду).