Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шины.PCI,.USB.и.FireWire

.pdf
Скачиваний:
66
Добавлен:
19.03.2016
Размер:
6 Мб
Скачать
☆

Рис. 20.9. Форматы содержимого памяти конфигурации: а — минимальный формат;

б— общий формат

Вминимальном формате память конфигурации содержит только 24$битный иден$ тификатор производителя vendor_id (рис. 20.9 а). В общем формате (рис. 20.9, б) память содержит следующие элементы:

заголовок (1 квадлет), содержащий три поля:

info_length — длина информационного блока последовательной шины в квадлетах (01 — признак минимального формата);

crc_length — длина блока памяти (в квадлетах), защищаемого CRC (255 — весь объем памяти, 1020 байт после заголовка);

rom_crc_value — значение CRC тела памяти (объявленного числа квадле$ тов после заголовка);

bus_info_block — информационный блок последовательной шины;

root_directory — корневой каталог, содержащий элементы описаний узла или ссылки на эти описания;

unit_directories — каталоги блоков;

root_leaves и unit_leaves — элементы$«листья», на которые ссылаются ка$ талоги;

vendor_dependent_information — специфическая информация (по усмотре$ нию разработчика).

Информационный блок последовательной шины

Информационный блок последовательной шины (bus_info_block) занимает 4 квад$ лета (рис. 20.10). Назначение его полей:

bus_name — имя шины («1394» в ASCII);

irmc — признак способности к роли диспетчера изохронных ресурсов;

cmc — признак способности к роли мастера циклов;

isc — признак способности к изохронным передачам;

bmc — признак способности к роли диспетчера шины;

pmc — признак способности к управлению питанием (введено в 1394a);

cyc_clk_acc — точность генерации интервалов циклов (в миллионных долях, ppm, допустимо 0–100), только для узлов с cmc = 1;

max_rec — указатель максимального размера поля данных, равного 2max_rec + 1. Допустимо max_rec = 1…13 (длина пакета 4, 8, 16… 16 384 байт);

node_vendor_id — идентификатор производителя (то же, что и vendor_id в минимальном формате);

chip_id_hi, chip_id_lo — две составные части 40$битного идентификатора микросхемы LINK$уровня, который в совокупности с node_vendor_id дает гло$ бально уникальный идентификатор узла;

gen — номер генерации содержимого памяти, инкрементируется с каждой его модификацией (введено в 1394a). Позволяет конфигурационному ПО сокра$ тить объем запрашиваемой информации, если считанное значение номера пос$ ле сброса совпадает с предыдущим;

link_speed — максимальная скорость, поддерживаемая LINK$уровнем; может не совпадать со скоростью PHY, сообщаемой в пакете самоидентификации (вве$ дено в 1394a).

Рис. 20.10. Информационный блок последовательной шины

Корневой каталог

Корневой каталог содержит элементы, состоящие из двух полей:

key (8 бит) — ключ элемента, в котором можно выделить:

key_type (2 бита) — тип ключа: 0 — непосредственный параметр, 1 — сме$ щение (в начальном пространстве регистров), по которому находится пара$ метр; 2 —смещение (в памяти конфигурации), по которому находится струк$ тура данных (лист); 3 — смещение, по которому находится каталог;

key_value (6 бит) — значение ключа, по которому определяется назначение элемента.

value или offset (24 бита) — значение элемента или смещение ячейки памя$ ти, с которой начинается данный элемент. Смещение указывается в квадлетах относительно положения данного элемента каталога.

Элементы корневого каталога приведены в табл. 20.1. Для всех узлов шины обяза$ тельны первые три элемента из приведенных в таблице. Структура элемента, со$ держащего уникальный 64 битный идентификатор узла, приведена на рис. 20.11. Этот идентификатор, называемый EUI$64 (Extended Unique Identifier), состоит из идентификаторов производителя узла и идентификатора микросхемы LINK$ уровня. Он может использоваться для идентификации программного драйвера дан$ ного узла. В CSR определен еще и 88$битный глобальный идентификатор GUI (Globally Unique Identifier), в котором к EUI$64 в качестве старших 24 бит добав$ лен идентификатор Company_Id. Идентификатор GUI уникально определяет узел во всем мире всех шин, отвечающих CSR$архитектуре.

Рис. 20.11. Элемент с уникальным идентификатором узла

Таблица 20.1. Элементы корневого каталога

Ключ

Смещение или значение

03h Module_Vendor_Id, значение идентификатора производителя модуля (может совпадать с идентификатором производителя узла)

0Ch Node_Capabilities, значение свойств узла (рис. 20.12):

spt — признак наличия регистра SPLIT_TIMEOUT, должен быть единичным у узла, способного участвовать в транзакциях

ms — признак наличия регистров Messaging Passing

int — признак наличия регистров Interrupt_Traget и Interrupt_Mask ext — признак наличия регистра TEST_ARGUMENT

bas — признак наличия регистров TEST_START и TEST_STATUS prv — признак наличия приватного пространства узла

64 — признак поддержки

64 битной адресации (в IEEE 1394 всегда установлен)

fix — признак фиксированной (а не расширенной) адресации (в IEEE 1394 всегда установлен)

lst — признак наличия бита Lost в регистрах State_Clear и State_Set drq — признак наличия бита Dreq в регистрах State_Clear и State_Set

elog — признак наличия регистра Error_Log и бита Elog в регистрах State_Clear

и State_Set

atn, off — признак наличия одноименных битов в регистрах State_Clear и State_Set ded — узел поддерживает состояние Dead

init — узел поддерживает состояние Initializing

Ключ

Смещение или значение

8Dh Node_Unique_Id_offset — смещение элемента листа с уникальным идентификатором узла. Смещение (в квадлетах) задается относительно положения данного ключа в памяти конфигурации. Формат элемента приведен на рис. 20.11

82h Bus_Dependent_Info_Offset — смещение элемента информации, относящейся к шине C2h Bus_Dependent_Info_Offset — смещение каталога информации, относящейся к шине 04h Module_Hw_Version, значение версии аппаратных средств модуля

05h Module_Spec_Id, значение идентификатора спецификации модуля 06h Module_Sw_Version, значение версии программных средств модуля

87h Module_Dependent_Info_Offset — смещение элемента информации, относящейся к модулю

C7h Module_Dependent_Info_Offset — смещение каталога информации, относящейся к модулю

08h Node_Vendor_Id, идентификатор производителя узла

09h Node_Hw_Version, значение версии аппаратных средств узла 0Ah Node_Spec_Id, значение идентификатора спецификации узла 0Bh Node_Sw_Version, значение версии программных средств узла

90h Node_Dependent_Info_Offset — смещение элемента информации, относящейся к узлу D0h Node_Dependent_Info_Offset — смещение каталога информации, относящейся к узлу D1h Unit_Directory_Offset — смещение каталога информации, относящейся к блоку

F0h Node_Power_Directory_Offset — относительное смещение каталога управления потреблением, относящегося к узлу (введено в 1394a)

Рис. 20.12. Свойства узла (Node_Capabilities), серым цветом выделены обязательные элементы

Содержимое каталогов блоков применительно к одной из разновидностей уст$ ройств 1394 описано в главе 26, посвященной протоколу SBP$2.

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

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

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

частично управляемая шина, которая в дополнение к корню должна иметь узлы, выполняющие роль мастера циклов и диспетчера изохронных ресурсов. Их ра$ бота обеспечивает возможность использования шины для изохронных передач;

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

Мастер циклов

Мастер циклов (Cycle Master) отвечает за регулярную передачу пакетов начала цикла (см. главу 19). Для этого он должен быть устройством с поддержкой изо$ хронных обменов, иметь регистры CYCLE_TIME и BUS_TIME. В информационном блоке BUS_INFO_BLOCK его памяти конфигурации (см. главу 20) должен быть уста$ новлен бит cmc (Cycle Master Capable) — признак способности к исполнению этой роли. Текущим мастером циклов является узел, у которого в регистре состояния (STATE) установлен бит cmstr (Cycle Master). Все узлы, кроме корневого, во вре$

мя идентификации дерева (после сброса) должны обнулить у себя этот бит; корне$ вой узел должен сохранять значение, которое было до сброса.

Если выбранный корневой узел не способен быть мастером циклов, а требуются изохронные передачи, то из узлов, способных быть мастером (судя по биту cmc), выбирается новый кандидат на роль корня. Для этого посылается широковеща$ тельный PHY$пакет конфигурирования с идентификатором нового кандидата и установленным битом R. Этот узел установит у себя бит RHB, а остальные его сбро$ сят, что и обеспечит выбор данного узла новым корнем во время идентификации, вызванной посылкой этого пакета.

Мастер циклов является источником системного времени; для этого он имеет ре$ гистры CYCLE_TIME и BUS_TIME. Текущее значение регистра CYCLE_TIME передает$ ся мастером циклов в пакетах начала цикла. Сброс на шине (в любой форме) на значения этих регистров не влияет.

Рис. 21.1. Регистры отсчета времени: а — CYCLE_TIME, б — BUS_TIME

Регистр CYCLE_TIME (32 бита, рис. 21.1, а) состоит из трех полей, соответствую$ щих значениям трех счетчиков, соединенных каскадно:

cycle_offset — 12$битный счетчик по модулю 3072 (максимальное значение 3071, после него обнуляется), считающий импульсы с частотой 24,576 МГц. Период этого счетчика соответствует номинальной длительности цикла — 125 мкс;

cycle_count — 13$битный счетчик по модулю 8000, считающий циклы. Пери$ од этого счетчика — 1 с;

second_count — 7$битный счетчик, считающий секунды; период счета — 128 с.

Регистр BUS_TIME (32 бита, рис. 21.1, б) содержит значение системного времени в секундах. Его младшие 7 бит (second_count_lo) отображают поле second_count предыдущего регистра. Остальные 25 бит (second_count_hi) отсчитывают 128$секундные интервалы. Период счетчика составляет 232 = 4 294 967 296 с (око$ ло 136 лет).

Диспетчер изохронных ресурсов

Диспетчер изохронных ресурсов, IRM (Isochronous Resources Manager), — узел, ве$ дающий распределением номеров каналов и полосы шины для изохронных пере$ дач. Диспетчер требуется, когда на шине появляется хоть одно устройство, спо$

собное к изохронной передаче. Диспетчер выбирается в процессе самоидентифи$ кации узлов из числа узлов, претендующих на эту роль. Претендентами являются узлы, которые сообщают в своем пакете самоидентификации единичные значения битов L (LINK активен) и C (Contender — участник состязания). Все узлы, интере$ сующиеся диспетчерами, слушают пакеты самоидентификации и запоминают иден$ тификатор победителя — претендента с наибольшим номером узла. Узел$претен$ дент «сдается», если его идентификатор меньше запомненного идентификатора победителя. Победитель (единственный «не сдавшийся» узел) становится диспет$ чером изохронных ресурсов. Через него можно будет найти и диспетчера шины. Победителем, скорее всего, станет корневой узел (если он способен к этой роли).

На роль диспетчера изохронных ресурсов годится узел, удовлетворяющий следу$ ющему набору требований:

поддержка изохронных обменов (как источник или приемник);

активность канального уровня и уровня транзакций во время процесса конфи$ гурирования;

наличие в памяти конфигурации блока BUS_INFO_BLOCK, в котором установлен бит IRMC (способность исполнять роль IRM);

наличие регистра BUS_MANAGER_ID, поддерживающего блокированную транзак$ цию (условную запись);

наличие регистров доступных каналов и пропускной способности (CHANNELS_ AVAILABLE и BANDWIDTH_AVAILABLE).

Специальные регистры диспетчера изохронных ресурсов находятся в области реги$ стров последовательной шины начального пространства регистров узла (см. главу 20).

При отсутствии диспетчера шины IRM отвечает за назначение мастера циклов: если текущий корень не исполняет эту роль, то IRM для этой цели выбирает иной узел (в том числе и себя). Механизм смены корня по этому поводу описан в пре$ дыдущем параграфе. При отсутствии диспетчера шины на IRM ложатся еще и ми$ нимальные обязанности по управлению питанием — отправка команды на вклю$ чение LINK$уровня всем узлам (см. главу 23). Отсутствие диспетчера шины IRM определяет по своему регистру Bus_Manager_ID (смещение 2C1h, используются только 6 младших бит): если через 625 мс после сброса его значение не отличается от 3Fh, значит, диспетчера шины нет.

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

Для распределения каналов служит 64$битный регистр CHANNEL_AVAILABLE (сме$ щение 224h), представляющий собой битовую карту, в которой каждому возмож$ ному изохронному каналу ch# соответствует свой бит (ch0 — в младшем бите). Единичное значение бита соответствует доступности (незанятости) данного кана$ ла. Начальное значение регистра — FFFF FFFFh (все каналы доступны). При за$ просе выделения канала бит сбрасывается, при освобождении — устанавливается. Запрос и освобождение канала выполняются одинаково. Узел, запрашивающий выделение или освобождение канала, первым делом считывает значение регистра

CHANNEL_AVAILABLE, чтобы определить текущую ситуацию, и формирует свое пред$ ложение по новому значению этого регистра. Далее, он обращается к регистру CHANNEL_AVAILABLE блокированной транзакцией compare_swap, в которой в каче$ стве аргумента (arg_value) передает прежнее (считанное) значение, а в качестве значения (data_value) — свое новое предложение. Данная транзакция в случае совпадения текущего значения регистра с аргументом заменяет его значение на новое, то есть регистр CHANNEL_AVAILABLE принимает новое значение. При этом транзакция возвращает запрашивающему узлу значение регистра, считанное на момент начала выполнения блокированной транзакции. Если это значение совпа$ дает с ранее считанным значением, значит, диспетчер принял новое назначение каналов — выделил узлу или освободил запрошенный канал (можно и группу ка$ налов одновременно). Если совпадения нет, это значит, что какой$то другой узел между нашими двумя транзакциями успел изменить содержимое регистра — за$ нять или освободить канал. В этом случае запрашивающий узел должен повто$ рить попытку, при этом новое текущее значение регистра он уже знает.

Для распределения полосы пропускания служит регистр BW_AVAILABLE (смеще$ ние 220h), в котором младшие 13 бит (bw_remaining) содержат число единиц рас пределения полосы шины (bus allocation units), оставшееся доступным. Единица распределения соответствует времени передачи одного квадлета на скорости 1600 Мбит/с (20,345 нс). В 125$микросекундном цикле теоретически доступно 6144 единиц. Как минимум 25 мкс цикла резервируется под асинхронный трафик, поэтому суммарная распределяемая полоса изохронного трафика (начальное зна$ чение bw_remaining) по умолчанию составляет 4915 единиц. Сервисным запро$ сом SB_CONTROL диспетчеру изохронных ресурсов (или диспетчеру шины) можно урезать полосу, выделяемую под изохронный обмен. Выделение полосы по време$ ни учитывает возможность совместной работы устройств с различными скоростя$ ми — в одном цикле соседние пакеты могут передаваться на разных скоростях. Для цифрового видео, например, требуется полоса 30 Мбит/с (25 Мбит/с на видеодан$ ные и 3–4 Мбит/с на аудиоданные, синхронизацию и заголовки пакетов). В S100 такие устройства цифрового видео запрашивают около 1800 единиц, в S200 — око$ ло 900. Запрашиваемая полоса должна учитывать не только передаваемые данные, но и накладные расходы на заголовок и на зазор арбитража. Выделение и освобож$ дение полосы выполняется аналогично выделению и освобождению канала — с помощью чтения и блокированного обращения compare_swap к регистру BW_ AVAILABLE. При сбросе шины передача трафика прекращается и все ресурсы осво$ бождаются, так что узлы, вещавшие в изохронном режиме, должны снова запро$ сить себе ресурсы. Для стабилизации работы шины узлы$новички, не вещавшие до сброса, задерживают свои запросы на 1 с — это позволит прежним вещателям не потерять ресурсы из$за появления новичков и не прерывать передачу.

Диспетчер шины

Диспетчер шины (Bus Manager) обеспечивает полное управление шиной. Им мо$ жет стать любой узел, способный (и обязанный после избрания диспетчером) вы$ полнять следующие функции:

назначение (при необходимости) мастера циклов: если текущий корень не ис$ полняет эту роль, то диспетчер шины выбирает на роль корня иной узел;

управление питанием;

публикация карты топологии;

публикация карты скоростей;

оптимизация трафика шины (изменение значения регистра BW_AVAILABLE в дис$ петчере изохронных ресурсов).

Диспетчер шины может находиться в любом месте шины. Он выбирается из узлов$ кандидатов на роль диспетчера изохронных ресурсов. Из этих кандидатов диспет$ чером шины может стать узел, способный выполнять блокированные транзакции compare_swap с регистром Bus_Manager_ID уже избранного диспетчера изохрон$ ных ресурсов. После самоидентификации каждый узел, претендующий на роль диспетчера шины, пытается с помощью транзакции compare_swap записать свой идентификатор в регистр Bus_Manager_ID. В качестве аргумента (arg_value) этой транзакции передается значение 3Fh, а в качестве значения (data_value) — иден$ тификатор. Значение, полученное в ответ, несет информацию о назначенном дис$ петчере шины: 3Fh — диспетчером стал данный узел, другое значение — иденти$ фикатор узла, успевшего стать диспетчером ранее. Если из$за ошибки передачи транзакция не удалась, узел должен ее автоматически повторить. При этом он мо$ жет получить в ответе свой PHY_ID — это означает, что он стал диспетчером еще в предыдущей попытке, но не получил подтверждения.

Для поиска диспетчера шины узел должен прочитать регистр Bus_Manager_ID диспетчера изохронных ресурсов. Идентификатор диспетчера изохронных ресур$ сов узлы запоминают в ходе самоидентификации (см. предыдущий параграф).

Управление питанием

У каждого узла при подключении к шине должен быть включен физический уро$ вень (PHY) и контроллер шины, обеспечивающие инициализацию, самоиденти$ фикацию и трансляцию сигналов между портами. Остальные компоненты (LINK и прикладная часть) могут быть отключены, об активности (включении) верхних уровней (LINK и уровень транзакций) узел сообщает битом L в пакете самоиден$ тификации. Отношение узла к линиям питания может быть различным, и о нем он сообщает в своем пакете самоидентификации в поле pwr (см. главу 22).

Диспетчер шины во время самоидентификации собирает информацию от всех уз$ лов шины об их отношении к питанию (из поля pwr). Он подсчитывает баланс питания (сумма запрашиваемых мощностей не должна превышать сумму подавае$ мых мощностей). Если баланс не сходится — питания для всех узлов недостаточ$ но, то сервис управления питанием посылает управляющему приложению инди$ кацию события SB_EVENT с указанием на недостаток питания. Дальнейшие действия зависят от приложения: или пользователю предлагается выбрать часть устройств, которые включать, или не включается ни одно устройство (с уведомле$ нием пользователя). Если питания достаточно, то всем узлам с неактивным LINK$

уровнем сервис SB_CONTROL посылает пакет Link_On — директиву на включе$ ние питания (см. главу 23). Если питанием управляет диспетчер изохронных ре$ сурсов (за неимением диспетчера шины), то он лишь посылает пакеты Link_On всем узлам с неактивным LINK$уровнем, не заботясь о бюджете мощности.

Карты топологии и скоростей

Знание топологии шины дает информацию о возможностях ее оптимизации, кото$ рая может быть выполнена путем:

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

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

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

SB_EVENT.

По карте топологии диспетчер шины способен определить максимальное число хопов (кабельных сегментов) между узлами сети. Это позволяет определить ми$ нимальный зазор арбитража (subaction gap), не конфликтующий с пакетами кви$ тирования, и сообщить его всем узлам сети. Минимальный зазор вычисляется че$ рез задержку распространения сигнала в кабельных сегментах и повторителях. Зазор арбитража должен быть больше, чем время оборота по шине: до истечения времени зазора арбитража передающий узел должен успеть получить квитанцию на пакет, посланный самому дальнему узлу. Вместо вычисления задержки диспет$ чер шины может измерить время оборота, посылая выбранному узлу пробный па$ кет Ping (см. главу 23) и измеряя время до прихода ответа — пакета самоиденти$ фикации (или серии этих пакетов). Измерение реальных задержек позволяет использовать кабели длиннее 4,5 м (если у них малое затухание) и узлы$повтори$ тели, вносящие задержку более 144 нс. Задание зазора осуществляется широкове$ щательно пакетом конфигурирования с установленным битом T (см. главу 23).

Карта топологии располагается с адреса 1000h в начальном пространстве узла$дис$ петчера шины, ее формат приведен на рис. 21.2. В карте имеются следующие поля:

length — длина карты (в байтах). Нулевая длина — признак некорректности карты. Длина проверяется до и после чтения информационных элементов. Не$ совпадение этих длин означает, что считанные элементы недостоверны (нужно повторить чтение карты, поскольку она только что изменилась);