Шины.PCI,.USB.и.FireWire
.pdfCRC — контрольный код;
generation_number — номер генерации карты (увеличивается с каждой ее мо$ дификацией);
node_count — число узлов сети;
self_id_count — число пакетов самоидентификации в карте (может быть боль$ ше числа узлов, поскольку некоторые узлы могут посылать и по несколько па$ кетов самоидентификации;
self_id_packet[i] — собственно пакеты самоидентификации (см. главу 23).
Рис. 21.2. Формат карты топологии
По карте топологии диспетчер шины строит карту скоростей (Speed_Map), кото$ рая позволяет определить максимальную скорость, возможную при обмене между любой парой узлов. Логически карта представляет собой двухмерную матрицу,
вкоторой каждой паре узлов с идентификаторами m и n соответствует байт кода скорости (speed_code). Младшие 3 бита этого байта соответствует коду скорости
вформате поля xspd пакета самоидентификации. Фактически карта — это после$ довательность байтов speed_code[i], где I = 64×m + n. Формат карты скоростей при$ веден на рис. 21.3, ее заголовок аналогичен заголовку карты топологии. Доступ к карте скоростей выполняется аналогично карте топологий, с проверкой поля дли$ ны до и после обращения.
Рис. 21.3. Формат карты скоростей
Сервисы управления шиной
Прикладные драйверы на каждом узле предоставляют специальный интерфейс управления шиной (Bus Management Interface), который взаимодействует с «уров$
нем» управления последовательной шиной (Serial Bus Management Layer). Этот «уровень» проходит по всем этажам архитектуры (рис. 17.4). Он включает:
контроллер узла, управляющий уровнями PHY и LINK;
мастер циклов;
диспетчер изохронных ресурсов;
диспетчер шины.
Взаимодействие происходит через сервисы управления последовательной шиной
(Serial Bus Management Services) при помощи:
запросов управления шиной — SB_CONTROL.request;
подтверждений запросов — SB_CONTROL.confirmation, сообщающих результа$ ты их выполнения;
индикаторов событий шины, происходящих неожиданно для данного узла, —
SB_EVENT.indication.
Запросы и подтверждения сервисов управления
Для функций управления и определения состояния предусмотрен ряд запросов, (SB_CONTROL.request), перечисленных ниже. На все запросы уровень управле$ ния отвечает подтверждениями (SB_CONTROL.confirmation), указывающими на успех или неудачу выполнения запроса. Сервисы управления включают следую$ щие запросы:
сброс шины (Bus Reset) — указание своему PHY подать сигнал сброса и реини$ циализироваться самому; LINK и уровень транзакций отбрасывают все ожида$ ющие транзакции и субакции;
инициализация узла — LINK и уровень транзакций данного узла отбрасывают все ожидающие транзакции и субакции и становятся готовыми к работе;
включение LINK$уровня заданного узла. Этот запрос предоставляет только диспетчер шины и диспетчер изохронных ресурсов;
конфигурирование физического уровня шины, предоставляют только диспет$ чер шины и диспетчер изохронных ресурсов:
принудительное назначение роли корня (Set Root Force) — установка бита RHB в указанном узле и сброс во всех остальных;
установка зазора арбитража (Set Gap Count);
посылка расширенных пакетов физического конфигурирования — пробных пакетов ping, удаленного доступа к регистрам PHY, пакета resume;
Опрос состояния (Present Status), по которому в подтверждениях (SB_CONTROL confirmation) сообщается следующая информация:
идентификатор корневого узла (3Fh — корневой узел не является мастером циклов);
идентификатор (физический адрес) данного узла (0…3Eh);
состояние бита RHB, обеспечивающего победу данному узлу в состязаниях на роль корня;
текущее значение зазора арбитража (gap_cnt);
идентификатор диспетчера шины (3Fh — нет диспетчера);
идентификатор диспетчера изохронных ресурсов (3Fh — нет диспетчера);
идентификатор мастера циклов (3Fh — нет мастера);
значение, которое можно вычесть из содержимого регистра BANDWIDTH_ AVAILABLE при перераспределении полосы между изохронным и асинхрон$ ным трафиком.
Последние четыре параметра доступны только у узла, являющегося диспетчером шины или диспетчером изохронных ресурсов.
Индикация событий управления шиной
Локальное приложение узла получает следующие сообщения об особых событи$ ях, происходящих на шине и в данном узле:
нарушение соглашений о времени занятия шины (регистр 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 не обеспечивает взаимодействия своего узла с ши$ ной (см. главу 22).
Приостановка и возобновление (Suspend и Resume)
Приостановка (suspend) — это переход пары портов, соединенных кабельным сег$ ментом, в состояние малого энергопотребления. В этом состоянии передача тра$ фика по данному сегменту невозможна. Однако приостановленный порт способен определять события отключения и подключения своего партнера. Для того чтобы стала возможной передача данных по приостановленному сегменту, порты долж$ ны выполнить возобновление (resume) нормальной работы. Приостановка и запрет портов меняют конфигурацию шины — она может оказаться разбитой на актив$ ные домены, изолированные друг от друга (в плане трафика). Возобновление опять$ таки меняет конфигурацию. В связи с этим приостановка и возобновление сопро$ вождаются сигнализацией сброса (короткого) и реинициализацией шины.
Приостановка по команде Suspend
Команда Suspend приводит к разделению шины на два фрагмента (домена): актив$ ный и приостановленный. Инициатор этой приостановки всегда остается в актив$ ном домене.
Команда Suspend принимается от удаленного узла с помощью расширенного фи$ зического пакета или от собственного LINK$уровня. В команде указывается иден$ тификатор узла и номер его приостанавливаемого порта. В ответ на эту команду целевой узел приостановки посылает пакет подтверждения. Получив подтверж$ дение команды приостановки, инициатор приостановки посылает сигнал TX_ SUSPEND на тот порт, откуда пришло подтверждение. На остальные порты через
короткий зазор узел посылает префикс данных, а за ним — короткий сигнал сброса шины. Это приводит к реконфигурированию активной части шины.
Получив сигнал приостановки RX_SUSPEND на одном из своих портов, целевой узел (которому посылали команду) прекращает подачу смещения (TpBias, см. гла$ ву 22) на этот порт. На все свои остальные порты этот узел посылает сигнал TX_ SUSPEND, инициируя приостановку и их партнеров. Таким образом, приостанов$ ка распространится на все порты и узлы шины, которые связаны с инициатором приостановки через приостанавливаемый порт.
Узел, обнаруживающий пропадание смещения, также прекращает подачу смеще$ ния на этот порт, что завершает согласование приостановки. С этого момента в приостановленных портах остаются работать только детекторы отключения (см. главу 22).
Приостановка по команде запрета порта
Команда запрета порта (локальная или удаленная) переводит в приостановленное состояние только указанный порт и его партнера. Таким образом, в результате шина может оказаться разбитой на два не связанных между собой активных домена.
Получив пакет с командой запрета порта (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).
Рис. 21.4. Регистры управления питанием узла: а — регистр состояния питания узла
NODE_POWER_STATE; б — регистр управления питанием узла NODE_POWER_CONTROL
ирегистр управления кабельным питанием CABLE_POWER_SOURCE_CONTROL;
в— регистр адреса уведомления NOTIFICATION_ADDRESS; г — регистр состояния кабельного питания CABLE_POWER_SOURCE_STATE;
д— регистр смены состояния потребления POWER_CHANGE
Форматы регистров, относящихся к узлу, приведены на рис. 21.4. На положение этого блока регистров указывает элемент 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 задает конкретный блок или весь узел, для которого требуется смена уровня.
Форматы регистров, относящихся к блоку, аналогичны приведенным на рис. 21.4, а и б. На положение этого блока регистров указывает элемент 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$каталогах могут присутствовать эле$ менты, приведенные на рис. 21.5.
Рис. 21.5. Элементы 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 со следующими полями (рис. 21.6):
capacity — емкость полностью заряженной батареи в ватт$часах;
available — текущий уровень заряженности (в процентах от полной емкости);
voltage — напряжение батареи (в десятых долях вольта);
st — состояние: 0 — батарея отсутствует, 1 — резерв, 2 — батарея установлена и используется, 3 — батарея заряжается.
Рис. 21.6. Регистр состояния батареи
На местоположение регистров состояния батарей указывают элементы Battery_ State, находящиеся в каталогах групп батарей Battery_Group. На каталоги групп батарей имеются ссылки в PM$каталоге узла Node_Power_Directory (для бата$ рей узла) и/или в PM$каталогах блоков Unit_Power_Directory (для индивиду$ альных батарей блоков).