link0 link1 link2 link3 link4 link5 link6 link7 link8 link9 link10 link11 link12 link13 link14 link15 link16 link17 link18 link19 link20 link21 link22 link23 link24 link25 link26 link27 link28 link29 link30 link31 link32 link33 link34 link35 link36 link37 link38 link39 link40 link41 link42 link43 link44 link45 link46 link47 link48 link49 link50 link51 link52 link53 link54 link55 link56 link57 link58 link59 link60 link61 link62 link63 link64 link65 link66 link67 link68 link69 link70 link71 link72 link73 link74 link75 link76 link77 link78 link79 link80 link81 link82 link83 link84 link85 link86 link87 link88 link89 link90 link91 link92 link93 link94 link95 link96 link97 link98 link99 link100 link101 link102 link103 link104 link105 link106 link107 link108 link109 link110 link111 link112 link113 link114 link115 link116 link117 link118 link119 link120 link121 link122 link123 link124 link125 link126 link127 link128 link129 link130 link131 link132 link133 link134 link135 link136 link137 link138 link139

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

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