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

Шина IEEE 1394 — FireWire

Управление шиной IEEE 1394

Индикация событий управления шиной

Локальное приложение узла получает следующие сообщения об особых событиях, происходящих на шине и в данном узле:

  • нарушение соглашений о времени занятия шины (регистр MAX_BUS_OCCUPANCY, переименованный в MAX_DATA_TIME в IEEE 1394a);
  • начало сброса шины;
  • завершение сброса шины (выполнен сброс, идентификация дерева и самоидентификация всех узлов). При этом сообщается ряд параметров и признаков:
         -----идентификаторы данного узла, корня, мастера циклов, диспетчеров шины и изохронных ресурсов;
         -----ошибки тайм-аута конфигурирования, топологии, самоидентификации, определения зазора, перегрузки питания;
         -----значение зазора арбитража;
         -----значение остатка полосы (bandwidth set-aside);
  • слишком длинный цикл (только для диспетчеров);
  • понижение питания в кабеле (ниже 7,5 В);
  • обнаружение дублирования номеров изохронных каналов;
  • обнаружение ошибки CRC-кода заголовка;
  • обнаружение ошибки CRC-кода данных;
  • отсутствие квитанции на переданный пакет ответа;
  • получение квитанции с указанием на ошибку данных в пакете ответа;
  • ошибка формата ответа (получен пакет квитирования с указанием неверного типа ответа);
  • ошибка повтора ответа (исчерпан предел повторов или ожидания);
  • обнаружен неожиданный канал (диспетчер изохронных ресурсов услышал пакет не выделенного им канала);
  • обнаружен неизвестный код транзакции (не поддерживаемой данным узлом);
  • обнаружен приход ответа, не ожидаемого данным узлом (проверяется по метке транзакции).

Управление энергопотреблением

Возможность питания устройств от кабельной шины требует управления энергопотреблением узлов. В минимальном варианте, заложенном в изначальной спецификации, управление сводится к простому подсчету баланса мощности на основе классов питания узлов и включением LINK$уровня по команде от диспетчера. В IEEE 1394a управление было усовершенствовано, в частности:

  • появилась возможность приостановки и возобновления работы узлов (suspend и resume);
  • появилась возможность управлять уровнем потребления узлов и блоков;
  • расширились возможности расчета баланса мощности с учетом батарейного питания и уровней питания узлов и блоков.

Эти новые возможности потребовали введения дополнительных регистров CSR и элементов в памяти конфигурации.

В дополнении IEEE 1394b введено новое энергосберегающее состояние порта и узла — Standby, в котором PHY не обеспечивает взаимодействия своего узла с шиной.

Приостановка и возобновление (Suspend и Resume)

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

Приостановка по команде Suspend

Команда Suspend приводит к разделению шины на два фрагмента (домена): активный и приостановленный. Инициатор этой приостановки всегда остается в активном домене.

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

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

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

Приостановка по команде запрета порта

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

Получив пакет с командой запрета порта (Disable Port), узел посылает во все порты, кроме запрещенного, пакет подтверждения, а за ним — короткий сигнал сброса. На запрещенный порт узел посылает сигнал TX_DISABLE_NOTIFY. Его партнер, приняв сигнал RX_DISABLE_NOTIFY, посылает на остальные порты префикс данных, а за ним — короткий сброс. Этот порт переводится в приостановленное состояние (снятием смещения, на что ответом будет снятие смещения и у запрещенного порта).

Возобновление нормальной работы

Возобновление работы порта может инициироваться несколькими способами:

  • по приему пакета RESUME, который может быть послан широковещательно (или направленно) от узла, находящегося в активном домене шины. Этот пакет воспринимается и отрабатывается узлами активного домена, у которых имеются приостановленные порты. Все эти порты переводятся в активное состояние;
  • по приему командного пакета с командой Resume Port, с указанием ранее приостановленного или запрещенного порта. Адресованный узел подает на указанный порт смещение, что приведет к возобновлению работы всего приостановленного домена (или возобновит работу запрещенного порта);
  • по событию, обнаруженному портом. Возобновление могут вызывать события смены состояния подключения, смены уровня смещения, перевод в запрещенное состояние и отказ порта. Каждое из этих событий вызывает пробуждение, если для него установлен соответствующий бит в поле разрешения прерываний.

Уровни потребления узла и блоков

В IEEE 1394a введены понятия уровней потребления (Power States), относящиеся к узлу в целом и отдельным его блокам. Узел и блок могут поддерживать до четырех уровней (0…3), из которых нулевой (обязательный) соответствует функционированию в самом полном объеме.

Уровни потребления узла (Node Power States) N0…N3 определяют состояния уровней PHY и LINK:

  • N0 — состояние полной дееспособности узла: PHY-уровень запитан (может принимать, посылать и транслировать пакеты и сигналы), LINK-уровень способен отвечать на транзакции, обращенные к узлу. Контекст узла (все его конфигурационные регистры CSR и PHY) действителен. При этом возможны два варианта:
         -----LINK-уровень полностью запитан — полная функциональность узла (нормальные ответы на все транзакции);
         -----LINK-уровень находится в состоянии Standby (с пониженным потреблением). Узел способен декодировать адрес обращенных к нему транзакций и ответить на них квитанцией Ack_TRDY, что вызовет повтор транзакции инициатором в следующем интервале справедливости. За это время LINKуровень узла успеет включиться, и на следующую попытку узел ответит нормальным образом;
  • N1 — состояние со включенным PHY (узел транслирует сигналы и пакеты) и отключенным LINK-уровнем. Это соответствует состоянию узла после сброса до получения пакета Link-On. Состояние контекста узла стандартом не регламентировано;
  • N2 — состояние с приостановленным (suspended) PHY и отключенным LINKуровнем. Узел не транслирует пакеты и сигналы, он может только реагировать на внешние сигналы, вызывающие возобновление (или на сигнал от своего приложения). Контекст не определен; информация, связанная с топологией, недействительна (после возобновления будет сброс);
  • N3 — полностью обесточенный узел, контекст потерян.

Уровни потребления блока (Unit Power States) D0…D3 отражают функциональность и потребление блока:

  • D0 — состояние полной функциональности и полного потребления, обязательное для всех блоков;
  • D1 — состояние пониженного потребления, контекст блока сохраняется, но функциональность может быть ограничена. Переход D1→D0 может совершаться довольно быстро;
  • D2 — состояние еще меньшего потребления, с меньшей функциональностью и, возможно, потерей контекста блока. Переход в D0 (или D1) может занимать большее время, чем D1→D0;
  • D3 — полное обесточивание блока.

Возможные состояния уровней потребления узла и входящих в него блоков связаны между собой: номер уровня потребления узла должен быть не больше, чем наименьший номер уровня потребления его блоков. Например, если в узле два блока и их текущие уровни потребления D1 и D2, то узел может находиться на уровне N0 или N1. Попытка (запрос) перевода уровня узла с N0 на N2 или N3 приведет к переводу только на уровень N1.

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

Регистры и структуры данных для управления энергопотреблением

Узлы, участвующие в управлении энергопотреблением, должны иметь единичное значение бита pmc в информационном блоке последовательной шины. Новые регистры CSR, введенные для управления энергопотреблением, располагаются в начальном пространстве узла, начиная с адреса FFFF F001 0000h или выше. Регистры делятся на две группы:

  • регистры, относящиеся к узлу (node-specific CSR);
  • регистры, относящиеся к блоку (unit-specific CSR).

Форматы регистров, относящихся к узлу, приведены на первом рисунке. На положение этого блока регистров указывает элемент Node_Power_Management в конфигурационной памяти. Ниже в скобках указано смещение регистров от начала блока. Обязательный регистр состояния питания узла NODE_POWER_STATE (00h) предназначен для сообщения текущего уровня потребления.

Обязательный регистр управления питанием узла NODE_POWER_CONTROL (04h) служит только для управления сменой уровня потребления (поле lvl). Значения поля func: 0 — резерв, 1 (grant) — разрешение смены состояния на последнее запрошенное; 2 (deny) — запрет смены состояния; 3 (wait) — выдержка 5 с перед отработкой последующей команды смены состояния; 4…7 (Set Level 0… Set Level 3) — установка указанного уровня (отразится в поле lvl в регистре состояния питания узла).

Необязательный регистр адреса уведомления NOTIFICATION_ADDRESS (08h) содержит полный адрес, по которому следует посылать уведомление о смене уровня потребления (идентификатор узла в поле destination_node_id, адрес в полях destination_offset_hi и destination_offset_lo). Бит e разрешает узлу генерировать уведомление.

Необязательный регистр состояния кабельного питания CABLE_POWER_SOURCE_STATE (0Ch) имеет следующие поля:

  • power — мощность, отдаваемая узлом в кабель (в десятых долях ватта);
  • voltage — напряжение питания (в десятых долях вольта);
  • rlvl — текущий запрашиваемый уровень потребления (0…3);
  • src — текущее состояние питания узла: 0 — от шины, 1 — от батареи, 2 — от сети, 3 — резерв;
  • v — признак действительности полей power и voltage;
  • lvl — текущий уровень потребления узла (0…3), соответствует состояниям N0…N3.

Необязательный регистр управления кабельным питанием CABLE_POWER_SOURCE_CONTROL (10h) управляет отработкой команд. Значения поля func: 0 — резерв, 1 (grant) — разрешение смены состояния на последнее запрошенное; 2 (deny) — запрет смены состояния; 3 (wait) — выдержка 5 с перед отработкой последующей команды смены состояния; 4…7 (Set Level 0… Set Level 3) — установка указанного уровня (поле lvl в регистре состояния кабельного питания).

Регистр смены уровня потребления POWER_CHANGE, обязательный для узла, управляющего потреблением, позволяет его приложениям управлять состоянием энергопотребления любого узла или блока. Поле lvl задает желаемый (запрашиваемый) уровень потребления узла, заданного полем PHY_ID. Поле csr_offset задает конкретный блок или весь узел, для которого требуется смена уровня.

Форматы регистров, относящихся к блоку, аналогичны приведенным на первом рисунке а и б. На положение этого блока регистров указывает элемент Unit_Power_Management в конфигурационной памяти.

Регистр состояния питания блока UNIT_POWER_STATE (00h) имеет следующие поля:

  • power — мощность, отдаваемая блоком в кабель или потребляемая (в десятых долях ватта);
  • voltage — напряжение питания (в десятых долях вольта);
  • k — признак того, что блок является источником события пробуждения;
  • rlvl — текущий запрашиваемый уровень потребления (0…3);
  • src — текущее состояние питания блока: 0 — от узла, 1 — от собственной батареи, 2 — от сети, 3 — блок подает питание в кабель;
  • v — признак действительности полей power и voltage;
  • lvl — текущий уровень потребления (0…3), соответствует состояниям D0…D3.

Регистр управления питанием блока UNIT_POWER_CONTROL (04h) служит для установки уровня потребления с помощью поля func: 0…3 — резерв; 4…7 (Set Level 0… Set Level 3) — установка указанного уровня (поле lvl в регистре состояния питания блока).

Для описания возможностей управления потреблением узла в корневом каталоге памяти конфигурации введен элемент, ссылающийся на PM-каталог узла Node_Power_Directory. Аналогичный элемент, ссылающийся на PM-каталог блока, может присутствовать в каталоге блока. В PM-каталогах могут присутствовать элементы, приведенные на следующем рисунке.

Описатели уровней потребления узла Node_Power_Level должны присутствовать для всех уровней потребления, поддерживаемых устройством. Аналогичные описатели уровней потребления блока Unit_Power_Level могут присутствовать в PM-каталоге блока. В описателях содержатся следующие поля:

  • power_requrements — мощность, потребляемая узлом или блоком на данном уровне (в десятых долях ватта);
  • voltage — требуемое напряжение: 0 — в соответствии с 1394–1995 (8–40В), 1 — 3,3 В, 2 — 5 В, 3 — 12 В, 4–Fh — резерв;
  • lvl — уровень потребления (0–3), описываемый данным элементом (соответствует N0…N3 для узла и D0…D3 для блока);
  • w — способность приостановки (standby) LINK-уровня (бит действителен только в описателе нулевого уровня);
  • v — признак действительности описателя.

Описатели кабельного питания Cable_Power_Source_Level сообщают возможности поставки питания в шину на каждом уровне потребления. Описатели относятся только к узлу. В них содержатся следующие поля:

  • power_requrements — мощность, подаваемая узлом в кабель на данном уровне (в десятых долях Вт);
  • voltage — подаваемое напряжение: 0 — в соответствии с 1394–1995 (8–40 В), 1 — 12 В, 2–Fh — резерв;
  • lvl — уровень потребления (0–3), описываемый данным элементом;
  • v — признак действительности описателя.

Указатель Node_Power_Management в поле csr_offset содержит смещение в области регистров CSR, по которому находится группа регистров управления энергопотреблением узла.

Указатель Unit_Power_Management в поле csr_offset содержит смещение в области регистров CSR, по которому находится группа регистров управления энергопотреблением блока.

Батареи питания (в том числе и аккумуляторные) могут относиться как к узлу в целом, так и к его отдельным блокам. К каждой батарее относится регистр состояния батареи BATTERY_STATE_REGISTER со следующими полями (см. рисунок ниже):

  • capacity — емкость полностью заряженной батареи в ватт-часах;
  • available — текущий уровень заряженности (в процентах от полной емкости);
  • voltage — напряжение батареи (в десятых долях вольта);
  • st — состояние: 0 — батарея отсутствует, 1 — резерв, 2 — батарея установлена и используется, 3 — батарея заряжается.

На местоположение регистров состояния батарей указывают элементы Battery_State, находящиеся в каталогах групп батарей Battery_Group. На каталоги групп батарей имеются ссылки в PM-каталоге узла Node_Power_Directory (для батарей узла) и/или в PM-каталогах блоков Unit_Power_Directory (для индивидуальных батарей блоков).