Контроллер OHC обеспечивает возможность идентификации со стороны хоста двояко:
Идентифицировать себя со стороны шины IEEE 1394 контроллер позволяет, обеспечивая доступ к своей памяти конфигурации.
На шине PCI контроллер IEEE 1394 с интерфейсом OHCI представляется устройством (функцией) с кодом класса 0Ch (контроллеры последовательных шин), кодом подкласса 00h кодом и интерфейса 10h.
Версия и функциональность OHCI определяются регистром Version (000h, рис. 1, а). Поля version и revision определяют старшую и младшую части номера версии, бит GUID_ROM указывает на реализацию одноименного регистра и автоматическую загрузку уникального идентификатора.
Уникальный идентификатор хранится в энергонезависимой памяти (ПЗУ). В этом ПЗУ содержится описание контроллера в формате, определенном разработчиком. Там же может присутствовать область miniROM со структурами данных, похожими на память конфигурации узла IEEE 1394. Доступ к ПЗУ идентификатора обеспечивает регистр GUID_ROM (004h, рис. 1, б). К данным ПЗУ идентификатора возможен только последовательный доступ. Для получения данных из ПЗУ программа первым делом должна обнулить адрес считывания, установив бит addr-Reset. Сбросом этого бита контроллер сигнализирует о выполнении данной операции. Далее, установкой бита rdStart хост инициирует чтение байта; по завершении чтения бит сбрасывается контроллером и программа может считать данные из поля rdData. Очередная операция чтения инкрементирует внутренний счетчик адреса данных ПЗУ, что позволяет последовательно считать все данные. Поле miniROM определяет положение одноименной области в ПЗУ, нулевое значение поля означает отсутствие структуры MiniROM.
Память конфигурации реализуется отображением ее адресов на блок в памяти хоста; начальная область памяти конфигурации отображается регистрами контроллера. Запросы со стороны шины на чтение памяти конфигурации отрабатываются аппаратно. К памяти конфигурации узла относятся следующие регистры:
Общее управление контроллером обеспечивает регистр HCControl (рис. 2). Отдельные биты регистра устанавливаются и сбрасываются установкой соответствующих бит в регистрах HCControlSet (050h) и HCControlClear (054h). Назначение битов:
Прерывания для процессора хоста вызываются по событиям каналов DMA (асинхронных и изохронных), событиям LINK-уровня и по ошибкам. Для наблюдения и управления источниками прерываний в контроллере имеется регистр запросов и регистр масок прерываний. События, вызывающие аппаратное прерывание процессора хоста, отражаются в регистре IntEvent. Этот регистр считывается через регистр IntEventSet (080h), биты запросов сбрасываются при записи единиц в соответствующие биты регистра IntEventClear (084h). Чтение регистра IntEvent-Clear показывает незамаскированные запросы — результат функции И (IntEvent & IntMask). Маски событий задаются регистром IntMask, установка — через регистр IntMaskSet (088h), сброс — через IntMaskClear (08Ch). Назначение бит регистров запросов и масок раскрыто в таблице.
Бит | Назначение |
0 | reqTxComplete, передача пакета запроса с командой OUTPUT_LAST* |
1 | respTxComplete, передача пакета ответа с командой OUTPUT_LAST* |
2 | ARRQ, завершение команды из контекста AR_Request |
3 | ARRS, завершение команды из контекста AR_Response |
4 | RQPkt, прием пакета в контекст AR_Request |
5 | RSPkt, прием пакета в контекст AR_Response |
6 | isochTx, признак запроса прерываний от какого-либо контекста изохронной передачи |
7 | isochRx, признак запроса прерываний от какого-либо контекста изохронного приема |
8 | postedWriteErr, ошибка отправленной записи |
9 | lockRespErr, невозможность отправки результата блокированной транзакции из-за превышения допустимого числа повторов |
10–14 | Резерв |
15 | selfIDcomplete2, завершение фазы самоидентификации (не обнуляется по сбросу шины) |
16 | selfIDcomplete, завершение фазы самоидентификации (обнуляется по сбросу шины) |
17 | busReset, индикация состояния сброса PHY, при этом запись в регистры фильтров и управляющий регистр контроллера не вызывает никаких эффектов |
18 | regAccessFail, отказ операции обращения к регистрам PHY из-за отсутствия сигнала синхронизации SCLK |
19 | Phy, запрос прерывания от PHY |
20 | cycleSynch, начало нового изохронного цикла (по внутреннему таймеру) |
21 | cycle64Seconds, признак изменения бита 7 счетчика секунд |
22 | cycleLost, признак потери пакета начала цикла (он не принят между двумя событиями cycleSynch) |
23 | cycleInconsistent, признак приема пакета начала цикла, в котором значения полей счетчиков не соответствуют внутреннему таймеру |
24 | unrecoverableError, признак неисправимой ошибки какого-либо блока (например, состояние dead для какого-либо контекста) |
25 | cycleTooLong, слишком длинный изохронный цикл (через 115–120 мкс после начала цикла не встретился зазор для асинхронного арбитража) |
26 | phyRegRcvd, прием байта данных регистра PHY |
27 | ack_tardy, при установленном бите ackTardyEnable регистра HCControl имеет место одно из условий: в приемном FIFO имеются данные для доставки хосту; блок аппаратного ответа занят обслуживанием запроса или посылкой ответа; хост-контроллер послал пакет квитирования ack_tardy |
28 | Резерв |
29 | softInterrupt, программно вызываемое прерывание |
30 | vendorSpecific, специфическое прерывание |
31 | Резерв |
Идентификацию и маскирование контекстов изохронной передачи, вызывающих прерывания, обеспечивают регистры IsoXmitIntEvent и IsoXmitIntMask. Каждый бит этих регистров соответствует событию прерывания и маске для своего контекста изохронной передачи. Все запросы считываются через регистр IsoXmit-IntEventSet (090h); биты запросов сбрасываются при записи единиц в соответствующие биты регистра IsoXmitIntEventClear (094h). Чтение регистра Iso-XmitIntEventClear показывает запросы незамаскированных контекстов. Маски контекстов устанавливаются через регистр IsoXmitIntMaskSet (098h), сбрасываются — через IsoXmitIntMaskClear (09Ch).
Идентификацию и маскирование контекстов изохронного приема, вызывающих прерывания, аналогичным образом обеспечивают регистры IsoRecvIntEvent и IsoRecvIntMask. Эти регистры доступны через IsoRecvIntEventSet (0A0h), IsoRecvIntEventClear (0A4h), IsoRecvIntMaskSet (0A8h) и IsoRecvIntMaskClear (0ACh). Каждый бит этих регистров соответствует событию прерывания и маске для своего контекста изохронного приема.
Для поддержки изохронного режима шины контроллер имеет специальные регистры:
CSR-архитектура допускает модификацию автономных регистров только через блокированные транзакции compare_swap. Контроллер OHC аппаратно реализует эти блокированные транзакции по запросам от других узлов шины. Со стороны хоста выполнить блокированные транзакции compare_swap позволяют специальные регистры доступа к автономным ресурсам. Для этих транзакций данных записи помещаются в регистр CSRData (00Ch), данные сравнения — в регистр CSRCompareData (010h). Записью в регистр CSRControl (014h, рис. 3) выбирается автономный ресурс и инициируется операция. Признаком завершения операции является бит csrDone (при записи в регистр CSRControl он должен обнуляться). Ресурс выбирается полем csrSel: 0 — BUS_MANAGER_ID, 1 — BANDWIDTH_AVAILABLE, 2 — CHANNELS_AVAILABLE_HI, 3 — CHANNELS_AVAILABLE_LO. После выполнения операции регистр CSRData содержит данные, которые были в выбранном регистре до начала операции. Таким образом обеспечивается чтение автономных регистров. Об успешности выполнения операции можно судить по совпадению этих считанных данных с данными, записанными в регистр CSRCompareData. Чтение автономных регистров возможно и по их прямым адресам в пространстве регистров хоста: InitialBandwidthAvailable (0B0h) и InitialChannelsAvailableHi , InitialChannelsAvailableLo (0B4h, 0B8h). Регистр BUS_MANAGER_ID не имеет прямого отображения.
Управления LINKуровнем обеспечивает регистр LinkControl (рис. 4, а), биты которого могут устанавливаться и сбрасываться через регистры LinkControlSet (0E0h) и LinkControlClear (0E8h). Регистр содержит следующие биты:
Для управления приоритетным арбитражем (1394a) служит регистр Fairness-Control (0DCh, необязательный). Его поле pri_req (биты [7:0]) задает число приоритетных запросов, которые LINK-уровень имеет право послать за один интервал справедливости.
Физический идентификатор и состояние узла определяются по регистру NodeID (0E8h, рис. 4, б):
Программный доступ к регистрам PHY предоставляется через регистр PhyControl (0ECh, рис. 4, в). Для чтения адрес регистра указывается в поле rdAddr и устанавливается признак rdReg. Завершение чтения определяется по биту rdDone (установится контроллером), считанные данные будут в поле rdData. Для записи адрес и данные задаются в полях regAddr и wrData, признак операции — бит wrReg. К PHY-регистру с номером 0 следует обращаться только через регистр NodeID.
Для питания узлов постоянным током в кабелях IEEE 1394 предусмотрена отдельная пара проводов — VG (общий провод, GND) и VP (положительный полюс питания) с напряжением 8–40 В при токе до 1,5 А. В 1394a диапазон напряжений сужен до 8–33 В. Узлы могут быть источниками, потребителями питания или не пользоваться питанием от шины; их отношение к питанию сообщается в поле pwr пакета самоидентификации. В узлах-повторителях линии питания всех портов объединены. Узлы-источники питания подают напряжения на линию питания через ограничитель тока и диод, так что мощность, подаваемая от нескольких узлов, суммируется. При подключении узел сначала может потреблять от шины не более 1 Вт (1394a — 3 Вт), при этом обязательно должен быть включен уровень PHY. Уровни LINK и выше, как и прикладная часть устройства, могут потреблять дополнительную мощность, заявленную в поле pwr. Однако эти уровни будут включаться только по команде от диспетчера шины или диспетчера изохронных ресурсов. Каждый узел контролирует питание от шины: при напряжении выше 7,5 В он устанавливает бит PS (power status), сообщаемый в пакете самоидентификации. При падении уровня напряжения ниже 7,5 В физический уровень должен обнулить бит PS и уведомить об этом событии управляющее ПО.
Понятие классов питания (Power Class) относится к питанию узлов от кабельной шины IEEE 1394. Класс питания узла сообщается им в поле pwr пакета самоидентификации. В соответствии с классом питания возможны следующие конфигурации узла:
Характеристики классов питания приведены в таблице. В 1394a и 1394b параметры потребления несколько отличаются от первоначальных определений 1394– 1995 и зарезервирован класс 5. Для класса 4 поставляемая мощность указывается в памяти конфигурации узла.
Клас (pwr) | Поставляет, Вт | Потребляет, Вт (1394–1995) | Потребляет, Вт (1394a, b) | ||
PHY | LINK | PHY | LINK | ||
0 | 0 | 0 | 0 | 0 | 0 |
1 | 15 | 0 | 0 | 0 | 0 |
2 | 30 | 0 | 0 | 0 | 0 |
3 | 45 | 0 | 0 | 0 | 0 |
4 | 01 | 1 | 0 | 3 | 0 |
5 | 0 | 1 | 2 | Резерв | Резерв |
6 | 0 | 1 | 5 | 3 | 3 |
7 | 0 | 1 | 9 | 3 | 7 |
{1 Для класса 4 поставляемая мощность указывается в памяти конфигурации узла.}
Каждой конфигурации соответствует своя схема соединения линий питания портов, собственного PHY и внутреннего (батарейного или сетевого) источника питания. Обобщенная схема питания узла приведена на рисунке ниже, для каждой из вышеприведенных конфигураций на схеме будут отсутствовать те или иные элементы.
Общие идеи следующие:
На рисунке в качестве ограничителей тока условно изображены плавкие предохранители. Реально, конечно же, используются или электронные ограничители, или самовосстанавливающиеся полупроводниковые предохранители.
Возможность гальванической развязки узлов шины IEEE 1394 позволяет решить ряд проблем, связанных с объединением «схемных земель» соединяемых устройств. В аудиотехнике из-за наводок в контуре заземления возникают помехи, неприемлемые для работы высококачественной аппаратуры, на которую и ориентирована шина.
В первых спецификациях, в которых используется только DS-сигнализация, гальваническая развязка возможна только в интерфейсе PHY-LINK. Этот параллельный интерфейс содержит значительное число сигнальных цепей, по которым передаются сигналы с уровнями логики КМОП или ТТЛ. Большая часть этих сигналов имеет весьма высокую частоту переключения (около 50 МГц), что не позволяет применить дешевую оптронную развязку1. Оптроны удобно применять только для медленных сигналов LinkOn и LPS. Кроме того, ряд сигнальных цепей используется для двунаправленной передачи, что осложняет схему развязки. Самый простой и дешевый способ развязки — введение разделительных конденсаторов. Однако при этом развязка осуществляется только по постоянному току (типичное напряжение развязки до 60 В); высокочастотные помехи, вызывающие пульсации на общем проводе, будут воздействовать на интерфейс. Полную развязку обеспечивают только импульсные трансформаторы (1:1), устанавливаемые в каждой цепи; при этом достижимо напряжение изоляции развязки до 500 В. Однако это слишком дорогой и громоздкий вариант, который используется редко. И конденсаторы, и трансформаторы фактически выполняют дифференцирование сигналов (передают только перепады). Специально для этого и LINK, и PHY имеют конфигурирующие сигналы Direct, по которым интерфейсные цепи настраиваются на прием непосредственных сигналов (без развязки) или дифференцированных (с развязкой).
В приложении стандарта IEEE 1394 и в основном тексте IEEE 1394a приводится довольно громоздкая схема конденсаторной развязки (рис. а), содержащая большое число резисторов, «подтягивающих» уровни сигналов. В IEEE 1394b приведена более элегантная схема установки привязки состояний входов, использующая КМОП-вентили (повторители) с высокоомной обратной связью (рис. б). На рисунках изображены цепи развязки для одной из десяти сигнальных линий.
Для портов, работающих в бета-режиме (IEEE 1394b), полная гальваническая развязка стала возможной в цепях сигналов внешнего электрического интерфейса. Параметры этой развязки приводятся в начале данной главы. Использование оптоволоконной связи позволяет обеспечить бескомпромиссную развязку с любым требуемым напряжением изоляции.
Гальваническая развязка сигнальных цепей подразумевает и развязку для кабельного питания. Эта развязка осуществляется с помощью импульсных преобразователей напряжения (DC/DC Converter).
1 — Обычные оптроны слишком инерционны, быстродействующие оптические приемники, применяемые, например, в сетях передачи данных, слишком дороги.