OSDev Wiki
Advertisement

В минимальном варианте шина PCI использует 45 сигналов, однако на практике их бывает больше. Полный набор сигналов 32-разрядного варианта шины включает 63 сигнала плюс по паре сигналов REQ# и GNT# для каждого устройства, которое может выступать в роли задатчика. В 64-разрядном варианте к ним добавляется ещё 39 линий.

Роли устройств на шине[]

Спецификация PCI позволяет любому устройству выступать в роли как исполнителя (target), так и задатчика (master). Исполнитель следит за транзакциями, выполняемыми на шине, и когда обнаруживает транзакцию, адресованную ему, приступает к её обработке (транзакции описаны в разделе Функционирование шины PCI). Задатчик инициирует транзакцию и в её фазе адреса указывает, какое устройство будет выступать в роли исполнителя.

Поскольку на шине может быть несколько задатчиков, спецификация предусматривает схему арбитража. Устройство, желающее выступить в роли задатчика, выдаёт связанный с ним сигнал REQ#. Получив ответный сигнал GNT#, оно может начинать транзакцию.

«Центральный ресурс»[]

В спецификации PCI часто используется термин «центральный ресурс» (central resource). Под ним понимается хост-контроллер шины PCI, обычно входящий в состав чипсета. Например, в старых чипсетах, разработанных во времена, когда PCI была главной шиной ПК, роль «центрального ресурса» выполняла микросхема северного моста, а в современных чипсетах, где шина PCI сохраняется для совместимости с ранее выпущенными платами расширения, «центральный ресурс» переместился в южный мост (например, в случае кристалла Intel ICH10 им является мост DMI–PCI, являющийся одним из компонентов этой микросхемы).

«Центральный ресурс» отвечает за:

  • арбитраж запросов на владение шиной PCI (принимает от устройств сигналы REQ# и выдаёт сигналы GNT#);
  • подтягивание линий типов STS и OD к высокому уровню с помощью резисторов;
  • субтрактивное декодирование диапазонов адресов памяти и ввода вывода. На шине PCI может быть только одно устройство, осуществляющее субтрактивное декодирование; обычно им является мост от PCI к какой-либо иной шине расширения (например, PCI-ISA);
  • преобразование генерируемых процессором обращений в конфигурационные транзакции шины PCI;
  • генерацию индивидуальных сигналов IDSEL для каждого устройства, подключенного к шине PCI;
  • управление сигналом REQ64# во время сброса.

Логические уровни и типы линий[]

Активным уровнем для некоторых линий является высокий (логическая единица), для других — низкий (логический нуль). Названия линий, чей активный уровень — низкий, оканчиваются символом #. Например, устройство, желающее захватить управление шиной, выдаёт на свою линию GNT# низкий уровень; когда же устройству управление шиной не требуется, оно поддерживает на линии высокий уровень.

С точки зрения электроники в шине PCI используются следующие типы линий:

  • IN — обычный вход (input). Устройство через такую линию получает сигналы извне, но само ничего не выдаёт;
  • OUT — обычный выход (totem pole output). Устройство использует такие линии только для выдачи сигналов;
  • TSвход-выход с тремя состояниями (tri-state). Когда такая линия используется как выход, устройство устанавливает на ней нужный логический уровень (0 или 1). Когда линия не используется или применяется как вход, устройство переводит выходной буфер этой линии в состояние высокого импеданса (Z); в такой ситуации состояние линии будет определяться значениями, выдаваемыми на неё другими устройствами. В каждый момент времени лишь одно устройство из подключённых к такой линии может использовать её как выход. Если ни одно из устройств не использует эту линию как выход, на ней устанавливается неопределённое состояние;
  • STSвыход или вход-выход с тремя состояниями и подтягиванием линии к высокому уровню (sustained tri-state). Активным уровнем на таких линиях всегда является низкий. В каждый момент времени лишь одно устройство может использовать такую линию как выход. Когда ни одного активного устройства нет, за счёт подтягивающего резистора (он является частью «центрального ресурса») на линии устанавливается высокий (неактивный) уровень. Когда устройство, использующее линию как выход, хочет освободить её, одно должно как минимум на один такт шины выставить на ней высокий уровень и лишь затем может переводить свой выходной буфер в состояние Z (это обеспечивает гарантированную подтяжку линии к высокому уровню). Устройство, которое будет использовать линию как выход, должно выдавать на неё 0 или 1 не раньше, чем через один такт после того, как предыдущий владелец линии перевёл свой буфер в состояние Z;
  • ODвыход с открытым стоком (коллектором; open drain). Активным уровнем на такой линии также всегда является низкий. В отличие от линий типов TS и STS, линии с открытым стоком используются как выходные одновременно несколькими устройствами. «Центральный ресурс» включает в свой состав резистор, подтягивающий линию к высокому уровню. Благодаря этому линия выполняет функцию «проводного ИЛИ» (wired-OR): на ней устанавливается активный (низкий) уровень, если хотя бы одно из устройств выдаёт на линию 0; если же все устройства поддерживают неактивный (высокий) уровень, на линии будет присутствовать 1.

Описание сигналов[]

Шина PCI является синхронной. Состояние большинства её сигналов привязано к линии синхронизации CLK: действующими в течение одного такта считаются значения сигналов, которые находились на линиях в момент прихода фронта сигнала CLK. Асинхронными, т.е. не привязанными к фронту сигнала CLK, являются линии RST#, INTA# — INTD#, PME# и CLKRUN#.

Системные сигналы[]

CLK, IN[]

Линия синхронизации шины, поступает на все устройства. Спецификация определяет три возможных диапазона частот: от 0 до 33 МГц (именно такой вариант шины PCI обычно используется в ПК), от 33 до 66 МГц (в ПК встречается очень редко) и от 50 до 133 МГц (шина PCI-X, применяемая в промышленных системах).

RST#, IN[]

Сигнал сброса. Является асинхронным. Когда на этой линии появляется активный (низкий) уровень, все устройства немедленно переводят свои выходные буферы в неактивное состояние. Для большинства линий неактивным является состояние высокого импеданса. «Центральный ресурс», чтобы не допустить неопределённости на линиях AD, C/BE#, PAR и PAR64, может установить на них низкий уровень (так называемая «парковка шины», bus parking).

Сброс обычно переводит устройства, подключенные к шине PCI, в исходное несконфигурированное состояние. Такие устройства не реагируют на какие-либо операции, выполняемые на шине, за исключением адресованных им конфигурационных циклов. Однако устройства, необходимые для загрузки ОС, могут при сбросе настраивать сами себя каким-то предопределённым образом; в этом случае они отвечают на адресованные им обычные запросы чтения, записи и т.д. Это обеспечивает возможность применения шины PCI в вычислительных системах, не имеющих аналога BIOS, т.е. какого-либо программного кода, выполняемого после сброса до начала загрузки.

Сигналы адреса и данных[]

AD[31:0], TS[]

Линии адреса и данных. Транзакция шины состоит из фазы адреса и фазы данных. В фазе адреса задатчик одновременно с сигналом FRAME# выдаёт 32-разрядный адрес порта ввода-вывода, ячейки памяти или конфигурационного регистра, к которому выполняется обращение. В случае операции чтения или записи порта ввода-вывода это будет адрес байта, в случае доступа к памяти или к конфигурационному регистру это будет адрес двойного слова (таким образом, шина не допускает невыровненные доступы к памяти и конфигурационным регистрам; задатчик должен разбивать такие доступы на две операции). После фазы адреса следует фаза данных, во время которой по линиям AD[31:0] осуществляется обмен данными между задатчиком и исполнителем; для индикации готовности данных используются сигналы TRDY# и IRDY#.

Спецификация PCI позволяет использовать 64-разрядные адреса на 32-разрядной шине; в этом случае фаза адреса состоит из двух тактов шины.

C/BE[3:0]#, TS[]

Линии команды шины и разрешения байтов. Во время фазы адреса по этим линиям задатчик выдаёт код операции, которая будет выполняться на шине (чтение из памяти, запись в порт ввода-вывода и т.д.); во время фазы данных на этих линиях находятся сигналы, показывающие значимость соответствующих байтов на линиях AD[31:0]. Благодаря этому имеется возможность обмениваться произвольными байтами из состава каждого двойного слова.

PAR, TS[]

Сигнал чётности информации на линиях AD[31:0] и C/BE[3:0]#. Общее число единичных разрядов на линиях AD[31:0], C/BE[3:0]# и PAR должно быть чётным, в противном случае фиксируется ошибка шины. В случае фазы адреса линия PAR отражает чётность адреса и кода операции в течение одного такта после окончания фазы адреса; в случае фазы данных она отражает чётность данных и линий разрешения байтов в течение одного такта после появления сигнала TRDY# или IRDY#. Запаздывание сигнала PAR на один такт по отношению к сигналам на линиях AD[31:0] и C/BE[3:0]# обеспечивает время, необходимое приёмнику для вычисления чётности информации, выданной источником.

Сигналы управления интерфейсом[]

FRAME#, STS[]

Этот сигнал выдаётся задатчиком в начале транзакции и определяет её длительность. FRAME# выдаётся одновременно с началом фазы адреса и снимается в последней фазе данных.

Сигнал FRAME# может быть выставлен только при нахождении шины в состоянии бездействия (когда оба сигнала FRAME# и IRDY# неактивны). После выдачи он не может быть снят при неактивном сигнале IRDY#.

IRDY#, STS[]

Сигнал готовности инициатора. Он свидетельствует о готовности инициатора (задатчика) завершить текущую фазу данных.

Сигнал IRDY# используется совместно с сигналом TRDY#: текущая фаза данных завершается, когда оба этих сигнала активны. Во время операции записи наличие сигнала IRDY# означает, что задатчик выставил записываемые данные на линии AD. Во время чтения наличие IRDY# показывает, что задатчик готов принять данные, которые должен выдать исполнитель.

Сигнал IRDY# выдаётся задатчиком в каждой фазе данных, когда он готов её выполнить. Если задатчик не нуждается в тактах ожидания для выполнения каких-то внутренних функций, этот сигнал будет непрерывно активен в течение всех фаз данных. Начиная последнюю фазу данных, задатчик выдаёт IRDY# одновременно со снятием FRAME# либо снимает FRAME# при активном IRDY#. Завершив эту фазу, задатчик снимает IRDY# при снятом ранее FRAME#, и шина переходит в состояние бездействия.

TRDY#, STS[]

Сигнал готовности исполнителя, свидетельствующий о готовности исполнителя завершить текущую фазу данных. Он используется совместно с сигналом IRDY#, как описано выше. В операции записи наличие сигнала TRDY# означает, что исполнитель готов принять от задатчика очередную порцию данных; во время операции чтения он показывает, что исполнитель выдал данные на линии AD[31:0].

STOP#, STS[]

Этот сигнал выдаётся исполнителем, если он хочет остановить текущую транзакцию. Вид завершения (повтор, отсоединение, отмена) определяется состоянием сигналов TRDY# и DEVSEL#, а также номером фазы данных (первая или не первая), в которой был выдан сигнал STOP#.

Выдав сигнал STOP#, исполнитель должен удерживать его до тех пор, пока задатчик не уберёт сигнал FRAME#. Наличие STOP# не препятствует обмену данными, если одновременно активны сигналы IRDY# и TRDY# (это имеет место при завершении транзакции путём отсоединения с данными).

LOCK#, STS[]

Сигнал LOCK# указывает на выполнение атомарной операции. Разрешение начать транзакцию шины не означает разрешения захватить управление сигналом LOCK#; для этого применяется отдельный протокол. Атомарные транзакции могут быть инициированы только мостами, но не обычными устройствами.

IDSEL, IN[]

Этот сигнал (Initialization Device Select) используется для выбора устройства в конфигурационных циклах шины и применяется в процессе настройки, когда обычная адресация невозможна. Каждое устройство, подключенное к шине PCI, имеет свой сигнал IDSEL.

DEVSEL#, STS[]

Сигнал выбора устройства. Когда какое-то устройство опознаёт свой адрес, передаваемый в фазе адреса каждой транзакции, кроме операции «специальный цикл», оно выдаёт на эту линию низкий уровень. Задатчик, контролируя состояние сигнала DEVSEL#, имеет возможность определить, присутствует ли устройство, к которому он пытается обратиться. Если в течение определённого времени после выдачи адреса устройства сигнал на DEVSEL# так и не появился, транзакция отменяется задатчиком (master-abort).

Исполнитель может в фазе данных снять сигнал DEVSEL# с одновременной выдачей STOP#, если он хочет отменить транзакцию (target-abort).

Сигналы индикации ошибок[]

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

PERR#, STS[]

Сигнал ошибки чётности в данных для всех типов транзакций, за исключением специальных циклов. Он выдаётся устройством, осуществляющим приём информации (т.е. исполнителем при выполнении записи или задатчиком при выполнении чтения), если оно обнаружит ошибку чётности на линиях AD[31:0] и C/BE[3:0]# в фазе данных. Выдача сигнала осуществляется в течение двух тактов с момента поступления ошибочной информации, а его минимальная длительность составляет один такт на каждую фазу, в которой обнаружена ошибка.

SERR#, OD[]

Сигнал ошибки чётности в фазе адреса, ошибки чётности в фазе данных специального цикла или какой-нибудь другой ошибки, имеющей катастрофические последствия, т.е. способной оказать влияние на работоспособность системы в целом. Он выдаётся на один такт, однако подтягивание линии к высокому уровню может занять 2 или 3 такта (это зависит от суммарной ёмкости буферов линии SERR# всех устройств на шине). Обычно появление сигнала SERR# вызывает генерацию немаскируемого прерывания (NMI).

Сигналы арбитража шины[]

Сигналы арбитража используются только устройствами, которые могут выступать в роли задатчиков. У каждого такого устройства имеется своя личная пара сигналов REQ# и GNT#.

REQ#, TS[]

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

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

Когда выполняется сброс (сигнал RST# активен), арбитр игнорирует состояние подключенных к нему сигналов REQ#.

GNT#, TS[]

Сигнал разрешения начала транзакции, приходящий от арбитра шины устройству, выдавшему сигнал REQ#.

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

Когда выполняется сброс (сигнал RST# активен), устройство должно игнорировать состояние подаваемого на него сигнала GNT#.

Сигналы прерываний[]

Сигналы прерываний необязательны и являются асинхронными.

INTA#, OD[]

INTB#, OD[]

INTC#, OD[]

INTD#, OD[]

Все четыре сигнала запроса прерываний функционально одинаковы. Устройство, запрашивающее прерывание, выдаёт низкий уровень на связанную с ним линию INTx# и удерживает его до тех пор, пока программно запрос прерывания не будет снят. Каждая линия может использоваться произвольным числом устройств, однако спецификация PCI накладывает одно ограничение: устройство, в состав которого входит только одна функция, обязано использовать линию INTA#, и лишь многофункциональные устройства могут использовать все четыре линии.

Альтернативным методом генерации запросов прерываний является использование механизма MSI (Message Signaled Interrupt).

Дополнительные сигналы[]

Все эти сигналы являются необязательными.

PRSNT[1:2]#, IN[]

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

CLKRUN#, IN/OD/STS[]

Этот асинхронный сигнал используется только в мобильных системах и выполняет несколько функций. Устройство использует его как входной, чтобы определить состояние линии CLK (работает тактовый генератор шины или нет). Устройство использует его как выходной с открытым коллектором, если хочет запросить запуск или увеличение частоты синхронизации.

«Центральный ресурс» рассматривает эту линию как имеющую три состояния с подтягиванием к высокому уровню (тип STS). Он использует её, чтобы получить разрешение на уменьшение частоты или останов синхронизации шины.

M66EN, IN[]

Этот сигнал сообщает устройству, может ли шина работать на частоте 66 МГц.

PME#, OD[]

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

Устройство может выдать на линию PME# низкий уровень только тогда, когда это было разрешено программно. Выдав запрос PME#, устройство должно удерживать его до тех пор, пока запрос не будет программно снят.

Подробно использование этого сигнала обсуждается в разделе Управление электропитанием PCI.

3.3Vaux, IN[]

Дополнительное напряжение питания 3,3 В, подаваемое на платы расширения, чтобы обеспечить им возможность генерации сигнала PME# даже при отключенном общем питании. Подробнее это обсуждается в разделе Управление электропитанием PCI.

Сигналы 64-разрядной шины[]

Эти сигналы присутствуют только 64-разрядном варианте шины PCI.

AD[63:32], TS[]

Линии старших 32 разрядов адреса и данных. Во время фазы адреса при использовании команды DAC (двойной цикл адреса) и наличии сигнала REQ64# по ним выдаётся старшая половина 64-разрядного адреса; если указанные условия не соблюдаются, состояние этих линий не определено. Во время фазы данных по ним передаются старшие 4 байта данных при условии, что обмен выполняется учетверёнными словами (были выставлены сигналы REQ64# и ACK64#).

C/BE[7:4]#, TS[]

Линии команды и разрешения байтов. Во время фазы адреса при использовании команды DAC и наличии сигнала REQ64# по этим линиям выдаётся реальная команда шины; в противном случае состояние этих линий не определено. Во время фазы данных при наличии сигналов REQ64# и ACK64# по этим линиям передаются сигналы разрешения соответствующих байтов на линиях AD[63:32].

REQ64#, STS[]

Запрос 64-разрядного обмена. Выдаётся и удерживается задатчиком одновременно с сигналом FRAME#, когда он желает выполнять обмен учетверёнными словами. Кроме того, этот сигнал используется при завершении последовательности сброса.

ACK64#, STS[]

Подтверждение 64-разрядного обмена. Выдаётся и удерживается одновременно с сигналом DEVSEL#, если исполнитель транзакции согласен осуществлять её в 64-разрядном режиме.

PAR64, TS[]

Чётность линий AD[63:32] и C/BE[7:4]#. Аналогичен сигналу PAR, но предназначен для контроля правильности передачи информации по старшей половине линий AD и C/BE#.

Сигналы JTAG[]

Спецификация PCI предусматривает разводку стандартных сигналов интерфейса JTAG — линий TDI, TDO, TCK, TMS и TRST#. Интерфейс JTAG предназначен для проверки оборудования, установленного на системной плате или в её гнёзда расширения, но не используется при функционировании в обычном режиме, поэтому описываться не будет. Заметим лишь, что, если плата расширения не поддерживает интерфейс JTAG, она должна обеспечить сквозную передачу сигнала TDI на линию TDO.

Сигналы шины управления системой[]

Спецификация PCI допускает наличие двух линий шины SMBus — SMBCLK и SMBDAT. Поскольку они не имеют прямого отношения к шине PCI, подробно рассматриваться они не будут.

Литература[]

Advertisement