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

Шина IEEE 1394 — FireWire

Шина IEEE 1394 — FireWire

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

Идентификация контроллера

Контроллер OHC обеспечивает возможность идентификации со стороны хоста двояко:

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

Идентифицировать себя со стороны шины 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.

Память конфигурации реализуется отображением ее адресов на блок в памяти хоста; начальная область памяти конфигурации отображается регистрами контроллера. Запросы со стороны шины на чтение памяти конфигурации отрабатываются аппаратно. К памяти конфигурации узла относятся следующие регистры:

  • регистр ConfigROMhdr (018h) содержит заголовок памяти конфигурации, определяющий ее размер (см. главу 20);
  • регистр BusID (01Ch) идентифицирует шину — содержит константу 31333934h — «1394» в символах ASCII;
  • регистр BusOptions (020h, рис. 25.15, в) содержит второй квадлет блока Bus_Info_Block. Поле max_rec задает максимальный размер обслуживаемых пакетов запросов, поле link_spd — скорость LINK-уровня узла. Остальные биты допускают программную запись, их значение должно соответствовать описанию данного блока в главе 20;
  • регистры GUIDHi, GUIDLo (024h, 028h) содержат глобально уникальный 64-битный идентификатор узла — 3-й и 4-й квадлеты блока Bus_Info_Block;
  • регистр ConfigROMmap (034h) задает адрес памяти хоста, на которую отображаются обращения со стороны шины к памяти конфигурации (младшие 10 бит — нулевые);
  • регистр Vendor_ID (040h) задает идентификатор фирмы-производителя и назаченный ей идентификатор устройства.

Общее управление контроллером

Общее управление контроллером обеспечивает регистр HCControl (рис. 2). Отдельные биты регистра устанавливаются и сбрасываются установкой соответствующих бит в регистрах HCControlSet (050h) и HCControlClear (054h). Назначение битов:

  • BIBimageValid — признак действительности образа блока Bus_Info_Block и памяти конфигурации, разрешающий доступ к ним со стороны шины;
  • noByteSwapData — управление перестановкой байтов, соотетствует формату данных на хост-шине: 0 — Little Endian (перестановка выполняется), 1 — BigEndian (нет перестановки);
  • ackTardyEnable — разрешение ответа ack_Tardy на обращения к памяти конфигурации;
  • programPhyEnable — признак возможности программного управления расширенными (1394a) свойствами PHY;
  • aPhyEnhanceEnable — признак разрешения использования всех расширений физического уровня, принятых в 1394a;
  • LPS — разрешение взаимодействия по интерфейсу LINK-PHY;
  • postedWriteEnable — разрешение выполнения физических обращений в форме отправленных записей;
  • linkEnable — разрешение работы LINK-уровня (после установки бита необходимо запросить сброс на шине);
  • softReset — программный сброс хост-контроллера (очистка всех FIFO, приведение регистров в исходное состояние), сброс на шине при этом не генерируется. При чтении бит указывает на выполнение сброса (программного или аппаратного). По завершении сброса бит обнуляется.

 

Управление прерываниями

Прерывания для процессора хоста вызываются по событиям каналов 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). Каждый бит этих регистров соответствует событию прерывания и маске для своего контекста изохронного приема.

Специальные регистры для изохронного режима

Для поддержки изохронного режима шины контроллер имеет специальные регистры:

  • таймер циклов, обеспечивающий синхронизацию изохронных операций. Таймер доступен через регистр IsochronousCycleTimer (0F0h). Его поля-счетчики cycleOffset, cycleCount и cycleSeconds описаны в главе 20;
  • автономные регистры диспетчера изохронных ресурсов:
         -----регистр идентификатора диспетчера шины;
         -----регистр доступной полосы;
         -----регистры доступных изохронных каналов.

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 и PHY

Управления LINKуровнем обеспечивает регистр LinkControl (рис. 4, а), биты которого могут устанавливаться и сбрасываться через регистры LinkControlSet (0E0h) и LinkControlClear (0E8h). Регистр содержит следующие биты:

  • cycleSource — источник синхронизации счетчика cycleCount: 0 — внутренний генератор, 1 — внешний источник;
  • cycleMaster — признак мастера циклов. При установленном бите данный узел будет передавать пакеты начала циклов, если он является корневым;
  • cycleTimerEnable — разрешение работы счетчика циклов;
  • rcvPhyPkt — разрешение приема PHY-пакетов и помещения их в контекст AR_Request (на прием пакетов самоидентификации не влияет);
  • rcvSelfID — разрешение приема пакетов самоидентификации;
  • tag1SyncFilterLock — единичное значение бита эквивалентно единицам в поле tag1SyncFilter регистра ContextMatch всех IR-контекстов.

Для управления приоритетным арбитражем (1394a) служит регистр Fairness-Control (0DCh, необязательный). Его поле pri_req (биты [7:0]) задает число приоритетных запросов, которые LINK-уровень имеет право послать за один интервал справедливости.

Физический идентификатор и состояние узла определяются по регистру NodeID (0E8h, рис. 4, б):

  • iDValid — признак действительности идентификатора;
  • root — признак того, что узел — корень шины;
  • CPS — признак нормального питания от кабеля;
  • busNumber — номер шины, устанавливается программно (по умолчанию 3FFh);
  • nodeNumber — номер узла, получаемый автоматически.

Программный доступ к регистрам 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 пакета самоидентификации. В соответствии с классом питания возможны следующие конфигурации узла:

  • узел с автономным питанием (Self-Power), для которого возможно несколько вариантов:
         -----однопортовый узел не питается от шины и не подает питание сам (pwr = 0);
         -----многопортовый узел не питается от шины, не транслирует питание с других портов и не подает питание сам (pwr = 0);
         -----многопортовый узел не питается от шины, но транслирует питание с других портов (pwr = 4);
  • поставщик питания (Power Provider, pwr = 1, 2 или 3) — узел питается самостоятельно и подает на шину питание с указанием минимальной мощности;
  • альтернативный поставщик питания (Alternate Power Provider, pwr = 4) — узел может питаться от шины, а также может поставлять питание;
  • потребитель (Power Consumer, pwr = 5, 6 или 7) — узел (только однопортовый) питается от шины. До завершения конфигурирования мощность потребляет только PHY (не более 1 или 3 Вт). Верхние уровни (LINK и выше), требующие дополнительной мощности, узел включает только по команде от диспетчера.

Характеристики классов питания приведены в таблице. В 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 и внутреннего (батарейного или сетевого) источника питания. Обобщенная схема питания узла приведена на рисунке ниже, для каждой из вышеприведенных конфигураций на схеме будут отсутствовать те или иные элементы.

Общие идеи следующие:

  • для многопортового узла следует предусмотреть питание PHY-уровня до последней возможности — это обеспечивает целостность шины (отключение питания PHY сегментирует шину, поскольку узел не сможет транслировать сигналы и трафик). Питание на PHY может подаваться и от кабеля, и от внутреннего источника (через диоды);
  • поставщик питания должен подавать питание на каждый порт через индивидуальные разделительные диоды и ограничители тока (рис. а). При этом каждый порт представляет отдельный домен питания (Power Domain);
  • альтернативный поставщик, обеспечивающий напряжение ниже 20 В, может и не обеспечивать разделения доменов (но индивидуальные ограничители тока обязательны);
  • узел с автономным питанием, транслирующий питание, при числе портов более двух должен иметь ограничители тока на каждый порт.

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

 

Гальваническая развязка

Возможность гальванической развязки узлов шины 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 — Обычные оптроны слишком инерционны, быстродействующие оптические приемники, применяемые, например, в сетях передачи данных, слишком дороги.