Шина 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.



Sitelinkx by eXtro-media.de
Яндекс.Метрика