Разное

Pci разъем для чего: что это такое: его параметры и как он выглядит?

PCI и PCI-X

Для устройств промышленного назначения в начале 1995 года был принят стандарт Compact PCI. Шина Compact PCI (cPCI) разрабатывалась на основе спецификации PCI 2.1. Этот стандарт принят Организацией производителей промышленных компьютеров PCIMG (PCI Industrial Computer Manufacturers Group). Шина отличается поддержкой большого количества слотов: 8 против 4 в обычной PCI. Как и PCI, шина поддерживает 32-битный и 64-битный обмен. Шина обладает всеми возможностями автоконфигурирования, присущими PCI. Кроме того, шина дает возможность программного прочтения «географического адреса» модуля. Географическая адресация дает дополнительную возможность идентификации физического местоположения модуля (хотя его можно определить и по номерам шины и устройства, пользуясь стандартными конфигурационными функциями PCI). Конструктивно платы Compact PCI представляют собой еврокарты высотой 3U (100×160 мм) с двумя коннекторами (J1 и J2) или 6U (233,35×160 мм) с 4–5 коннекторами (J1…J5).

На шасси разъемы обозначаются P1…P5; платы (модули) устанавливаются с шагом 20,32 мм (0,8 дюйма). Одно посадочное место (слот), как правило крайнее левое, отводится под системный модуль, остальные — под периферийные. В системный слот устанавливается контроллер шины, на который возлагаются функции арбитража и синхронизации. На его коннекторе шиной используется большее число контактов, чем на остальных. Вид шасси и модулей Compact PCI приведен на рисунке, на рисунке видно символическое обозначение места контроллера (номер системного слота — в треугольнике, периферийных — в круге). На шасси может быть несколько сегментов cPCI — независимых шин; если требуется, связь между ними организуется через модули-мосты, устанавливаемые в слоты. В каждом сегменте должен быть собственный контроллер шины.

Коннекторы — 7-рядные экранированные штырьковые разъемы с шагом 2 мм между контактами, на кросс-плате — вилка, на модулях — розетки. Поскольку модули (и разъемы) обычно устанавливаются вертикально, ряды удобнее назвать колонками, что и подразумевается ниже.

Из 7 колонок контактов (z, a, b, c, d, e, f) только 5 (a–e) используются для сигнальных цепей, а колонки z и f — только для экрана (соединяются с шиной GND)1. Контакты коннекторов имеют разную длину: более длинные контакты цепей питания при установке модуля соединяются раньше, а при вынимании разъединяются позже, чем сигнальные. Такое решение позволяет производить «горячую» замену модулей. Собственно шина использует только коннекторы J1 и J2, плотно примыкающие друг к другу (они могут выглядеть как единый 47-позиционный разъем). Контакты J1 используются для сигналов 32-битной шины PCI; периферийная 32-битная плата может и не иметь разъема J2. Ряды 12– 14 используются как ключи для вариантов с уровнями сигналов 5В/3,3В. Здесь возможны универсальные платы, но не допускаются универсальные шасси. Разъем J2 используется по-разному: системный контроллер использует его для сигналов арбитража и синхронизации, разводящихся по периферийным слотам радиально. На периферийных платах он может и отсутствовать.
В 64-разрядных системах J2 используется для расширения шины; в 32-разрядных он может использоваться для сигналов ввода-вывода, разводящихся через шасси. На этот же разъем выведены сигналы географической адресации (которые можно и не использовать). Назначение контактов разъемов J1 и J2 Compact PCI версии 2.1 приведено в таблице ниже. Разъемы J3…J5 отводятся для прикладного использования. Конструкция коннекторов позволяет применять для них специфические модификации (например, с разделяющим экраном и механическими ключами). В шине предусматривается наличие независимых источников питания + 5 В, + 3,3 В и ± 12 В.

Разъем, контакт Ряд
a b c d e
J2 22 GA4 GA3 GA2 GA1 GA0
21 CLK6 GND RSV RSV RSV
20 CLK5 GND RSV GND RSV
19 GND GND RSV RSV RSV
18 BRSVP2A18 BRSVP2B18 BRSVP2C18 GND BRSVP2E18
17 BRSVP2A17 GND PRST# REQ6# GNT6#
16
BRSVP2A16 BRSVP2B16 DEG# GND BRSVP2E16
15 BRSVP2A15 GND FAL# REQ5# GNT5#
14 AD35 AD34 AD33 GND AD32
13 AD38 GND V(I/O) AD37 AD36
12 AD42 AD41 AD40 GND AD39
11 AD45 GND V(I/O) AD44 AD43
10 AD49 AD48 AD47 GND AD46
9 AD52 GND V(I/O) AD51 AD50
8 AD56 AD55 AD54 GND AD53
7 AD59 GND V(I/O) AD58 AD57
6 AD63 AD62 AD61 GND AD60
5 C/BE5# GND V(I/O) C/BE4# PAR64
4 V(I/O) BRSVP2B4 C/BE7# GND C/BE6#
3 CLK4 GND GNT3# REQ4# GNT4#
2 CLK2 CLK3 SYSEN# GNT2# REQ3#
1 CLK1 GND REQ1# GNT1# REQ2#
J1 25 5V REQ64# ENUM# 3. 3V 5V
24 AD1 5V V(I/O) AD0 ACK64#
23 3.3V AD4 AD3 5V AD2
22 AD7 GND 3.3V AD6 AD5
21 3.3V AD9 AD8 M66EN C/BE0#
20

AD12

GND V(I/O) AD11 AD10
19 3.3V AD15 AD14 GND AD13
18 SERR# GND 3.3V PAR C/BE1#
17 3.3V IPMB_SCL (SDONE)1 IPMB_SDA (SBO#)1 GND PERR#
16 DEVSEL# GND V(I/O) STOP# LOCK#
15 3.3V FRAME# IRDY# BD_SEL# (GND)2 TRDY#
12-14 Зона ключа
11 AD18 AD17 AD16 GND C/BE2#
10 AD21 GND 3.
3V
AD20 AD19
9 C/BE3# IDSEL AD23 GND AD22
8 AD26 GND V(I/O) AD25 AD24
7 AD30 AD29 AD28 GND AD27
6 REQ# GND 3.3V CLK AD31
5 BRSVP1A5 BRSVP1B5 RST# GND GNT#
4 IPMB_PWR (BRSVP1A4)1 HEALTHY# (GND)1 V(I/O) INTP INTS
3 INTA# INTB# INTC# 5V INTD#
2 TCK 5V TMS TDO TDI
1 5V -12V TRST# +12V 5V

1 — Назначение в скобках — для старых версий.
2 — На системном слоте — GND.

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

Сигнал Назначение
BD_SEL# Сигнал от модуля о том, что он установлен в слот и питание подано (подается через один из укороченных контактов, который соединяется после всех основных)
BRSVxxxx Зарезервированные на будущее сигналы, шинно разведенные по слотам; xxxx обозначает позиционный номер контакта (BRSVP1A4 — на контакте A4 разъема P1)
CLK[0:6], GNT#[0:6], REQ#[0:6] Сигналы, радиально разводящиеся от разъема J2 системного слота к периферийным (сигналы CLK0, GNT0# и REQ0# расположены на местах CLK, GNT# и REQ# разъема J1)
DEG# Предупреждение о деградации питания
ENUM# Все аппаратные модули установлены, можно производить нумерацию и конфигурирование устройств
FAL# Отказ питания
GA0-GA4 Географический адрес. Коммутацией на «землю» для каждого слота задается его двоичный географический адрес на шасси
SMB_SDA, SMB_SCL, Сигналы шины SMBus (только на системном слоте)
SMB_ALERT# Сигнал прерывания по шине SMBus
HEALTHY# Сигнал от модуля, что он получает нормальное питание (PwrGood) и сигнал его сброса снят
INTP, INTS Прерывания от первичного и вторичного контроллеров IDE
IPMB_PWR, Батарейное питание шины IPMB (Independent Platform Management Bus, независимая последовательная шина управления платформой)
IPMB_SCL, IPMB_SDA Синхронизация и данные шины IPMB
PRST# Push Button Reset, сигнал от кнопки «Сброс»
RSV Резерв на будущее
SYSEN# Идентификация системного слота (на системном слоте контакт заземлен, что позволяет модулю опознать установку в это место)
UNC

PCI и PCI-X

Шины PCI и PCI-X являются основными шинами расширения ввода/вывода в современных компьютерах; для подключения видеоадаптеров их дополняет порт AGP. Шины расширения ввода/вывода (Expansion Bus) являются средствами подключения системного уровня: они позволяют адаптерам и контроллерам периферийных устройств непосредственно использовать системные ресурсы компьютера — пространство адресов памяти и ввода/вывода, прерывания, прямой доступ к памяти. Устройства, подключенные к шинам расширения, могут и сами управлять этими шинами, получая доступ к остальным ресурсам компьютера. Шины расширения механически реализуются в виде слотов (щелевых разъемов) или штырьковых разъемов; для них характерна малая длина проводников, то есть они сугубо локальны, что позволяет достигать высоких скоростей работы. Эти шины могут и не выводиться на разъемы, но использоваться для подключения устройств в интегрированных системных платах. 

Поначалу шина PCI вводилась как пристройка (mezzanine bus) к системам с шиной ISA. Она разрабатывалась в расчете на процессоры Pentium, но хорошо сочеталась и с процессорами i486. Позже PCI на некоторое время стала центральной шиной: она соединялась с шиной процессора высокопроизводительным мостом («северным» мостом), входящим в состав чипсета системной платы. Остальные шины расширения ввода/вывода (ISA/EISA или MCA), а также локальная ISAподобная шина X-BUS и интерфейс LPC, к которым подключаются микросхемы системной платы (ROM BIOS, контроллеры прерываний, клавиатуры, DMA, портов COM и LPT, НГМД и прочие «мелочи»), подключались к шине PCI через «южный» мост. В современных системных платах с «хабовой» архитектурой шину PCI отодвинули на периферию, не ущемляя ее в мощности канала связи с процессором и памятью, но и не нагружая транзитным трафиком устройств других шин.

Шина PCI является синхронной — фиксация всех сигналов выполняется по положительному перепаду (фронту) сигнала CLK. Номинальной частотой синхронизации считается частота 33,3 МГц, при необходимости она может быть понижена. Начиная с версии PCI 2.1 допускается повышение частоты до 66,6 МГц при «согласии» всех устройств на шине. В PCI-X частота может достигать 133 МГц.

В PCI используется параллельная мультиплексированная шина адреса/данных (AD) с типовой разрядностью 32 бит. Спецификация определяет возможность расширения разрядности до 64 бит; в PCI-X версии 2.0 определен также 16-битный вариант шины. При частоте шины 33 МГц теоретическая пропускная способность достигает 132 Mбайт/с для 32-битной шины и 264 Мбайт/с для 64-битной; при частоте синхронизации 66 МГц — 264 Мбайт/с и 528 Мбайт/с соответственно. Однако эти пиковые значения достигаются лишь во время передачи пакета: из-за протокольных накладных расходов реальная средняя пропускная способность шины оказывается ниже.

Сравнительные характеристики шин PCI и PCI-X и других шин расширения PCсовместимых компьютеров приведены в табл. 1.1. Шина ISA из настольных компьютеров уходит, но она сохраняет свои позиции в промышленных и встраиваемых компьютерах, как в традиционном, слотовом, так и в «бутербродном» варианте PC/104. В блокнотных компьютерах широко применяются слоты PCMCIA с шинами PC Card и Card Bus. Шина LPC является современным дешевым средством для подключения нересурсоемких устройств к системной плате.

 

Шина Пиковая пропускная способность Мбайт/с Каналы DMA Bus-Master ACFG Разрядность данных Разрядность адреса Частота МгГц
ISA-8 4 3 8 20 8
ISA-16 8
 
7
 
+
 

 
16
 
24
 
8
 
LPC 6,7
 
7
 
+
 

 
8/16/32
 
32
 
33
 
EISA
 
33,3 7 +
 
+
 
32
 
32
 
8,33
 
MCA-16
 
16
 

 
+
 
+
 
16
 
24
 
10
 
MCA-32
 
20
 

 
+
 
+
 
32
 
32
 
10
 
VLB
 
132
 

 
(+)
 

 
32/64
 
32
 
33-50(66)
 
PCI
 
133-533
 

 
+
 
+
 
32/64
 
32/64
 
33/66
 
PCI-X
 
533-4256
 

 
+
 
+
 
16/32/64
 
32/64
 
66-133
 
PCI Express
 
496-15872
 

 
+
 
+
 
1/2/4/8/12/16/32
 
32/64
 
2,5 ГГц
 
AGP 1x/2x/4x/8x
 
266/533/1066/2132
 

 
+
 
+
 
32
 
32/64
 
66
 
PCMCIA
 
10/22
 
+
 

 
+
 
8/16
 
26
 
10
 
Card Bus 132 + + 32 32 33

ACFG1 -Поддержка автоматического конфигурирования. Для ISA PnP является поздней надстройкой, реализуемой адаптерами и ПО.

На что способен формат Mini PCI-e / Хабр

Мне очень нравится формат Mini PCI-e. Это крохотный форм-фактор, служащий базовым для mSATA и M.2, но в основном он используется для подключения карт WiFi и Bluetooth в ноутбуках или маленьких ПК. Но по сути это просто PCI-e, поэтому с его помощью можно сделать гораздо больше.

Вот, к примеру, обычная беспроводная карта, используемая с его помощью:


Но так как это просто PCI-e, его можно превратить в PCI-e x1 при помощи адаптера. Это чит-код для Mini PCI-e: после этого туда можно подключить всё, что угодно, вплоть до полноразмерного GPU. Работать будет медленно, но будет.

Однако есть множество карточек, разработанных специально для этого формата. К примеру, карта для Ethernet:

Естественно, диагностические инструменты:

Разъём, конечно же, можно использовать для SATA:

А не хотите ли… Firewire? Что, серьёзно??

Ну если уж нам доступен Firewire, то ничто не мешает использовать USB, если кто-то ещё цепляется за этот устаревающий стандарт:

Естественно, существует и последовательный порт. Промышленный мир работает на интерфейсе RS-232:

Мало последовательного порта – для вас есть карточка с последовательным и параллельным портами. Иногда ведь хочется подключить к ноутбуку Epson FX-80:

Есть слоты для CompactFlash:

Башни для USB3 сомнительной ценности:

GPS-приёмник, почему-то с отдельной батареей:

И раз уж это PCI-e, он будет достаточно быстрым для видеокарт. Так что они тоже существуют:

Забавный факт: существуют мосты с PCI-e на PCI. Поэтому, естественно, есть мосты и с Mini PCI-e на PCI – вот, например, такой мост, утыканный звуковыми картами формата PCI:

Как насчёт карточки для приёма сигнала ТВ?

Или SD-слота! Забавно, насколько хорошо слот для SD подходит по размеру для карты Mini PCI-e:

Если вам этого мало, можете взять карту с двумя microSD:

Не желаете ли гигабитного интернета с модулями SFP?

И раз уж есть видеокарты, то есть и звуковые карты:

Или одновременная запись видео с 8 каналов (для камер безопасности):

И, да, гигантская карточка Mini PCI-e со встроенным FPGA:

И двойная шина CAN, если вам вдруг надо будет отладить ваш автомобиль:

А вот вам двойной гигабитный Ethernet, однако в данном случае меня больше веселит, что отдельная дочерняя плата для двух разъёмов Ethernet оказывается больше по размеру платы Mini PCI-e:

А вот адаптер с Mini PCI-e на ExpressCard, чтобы вы могли использовать все эти карточки формата ExpressCard, которых у вас наверняка полно:

Только не путайте его с противоположным переходником с ExpressCard на Mini PCI-e:

А вот такой переходник, с контактами GPIO, специально расположенными в том же порядке, что у Raspberry Pi. Видимо, идея в том, чтобы использовать его с FPGA-компьютерами, оснащёнными Mini PCI-e, совместно с шилдами от Raspberry Pi?

А вот плата с поддержкой VGA и HDMI, только это не видеокарта, а карта для записи видео:

И плата для прототипирования Mini PCI-e, чтобы вы могли разрабатывать собственные карточки для Mini PCI-e:

А если вы устанете от слота Mini PCI-e x1, вы сможете просто перейти на слот x16. Мне кажется, что при этом он работает, как x1, но имеет полный размер… Ну, потому что:

А вот плата с VGA, которая видеокарта. Она приспособлена для 86Duino, удобной встроенной системы x86, которую я всё никак не куплю:

Как работает PCI Express | HowStuffWorks

Слоты Peripheral Component Interconnect (PCI) являются такой неотъемлемой частью архитектуры компьютера, что большинство людей воспринимает их как должное. В течение многих лет PCI был универсальным и функциональным способом подключения звуковых, видео и сетевых карт к материнской плате.

Но у PCI есть недостатки. Поскольку процессоры, видеокарты, звуковые карты и сети становятся быстрее и мощнее, PCI остается прежним.Он имеет фиксированную ширину 32 бита и может одновременно обрабатывать только 5 устройств. Более новая 64-битная шина PCI-X обеспечивает большую пропускную способность, но ее большая ширина усугубляет некоторые другие проблемы PCI.

Новый протокол под названием PCI Express (PCIe) устраняет многие из этих недостатков, обеспечивает большую пропускную способность и совместим с существующими операционными системами. В этой статье мы рассмотрим, чем PCIe отличается от PCI. Мы также рассмотрим, как PCI Express делает компьютер быстрее, потенциально может повысить производительность графики и заменить слот AGP.

Высокоскоростное последовательное соединение

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

Оказывается, у параллельных подключений есть свои проблемы по мере того, как скорости становятся все выше и выше — например, провода могут электромагнитно мешать друг другу — так что теперь маятник качнулся обратно в сторону высокооптимизированных последовательных подключений.Усовершенствования оборудования и процесса разделения, маркировки и повторной сборки пакетов привели к гораздо более быстрым последовательным соединениям, таким как USB 2.0 и FireWire.

PCI Express — это последовательное соединение, которое больше похоже на сеть, чем на шину. Вместо одной шины, которая обрабатывает данные из нескольких источников, у PCIe есть переключатель, который управляет несколькими последовательными соединениями точка-точка. (Подробнее см. В разделе «Как работают коммутаторы LAN».) Эти соединения расходятся от коммутатора, ведущие непосредственно к устройствам, на которые должны передаваться данные. Каждое устройство имеет собственное выделенное соединение, поэтому устройства больше не разделяют пропускную способность, как на обычной шине. Мы посмотрим, как это происходит, в следующем разделе.

Разъемы и выводы блока питания

Лист данных стандартного разъема заголовка ATX с шагом 4,2 мм

ATX 24-контактный разъем основного кабеля питания

24-контактный основной разъем питания был добавлен в ATX12V 2.0 для обеспечения дополнительного питания, необходимого для слотов PCI Express.В старом 20-контактном основном кабеле питания есть только одна линия на 12 В. Новый 24-контактный разъем добавил по одной линии для заземления, 3,3, 5 и 12 вольт. Дополнительные контакты сделали дополнительный кабель питания ненужным, поэтому у большинства блоков питания ATX12V 2.x их нет. 24-контактный разъем поляризован, поэтому его можно вставлять только в правильном направлении.

Распиновка
Контакты с 1 по 12 Контакты с 13 по 24
Описание Цвет провода Номер контакта Номер контакта Цвет провода Описание
+3. 3 вольта оранжевый 1 13 оранжевый +3,3 В
+3,3 В оранжевый 2 14 синий -12 вольт
земля черный 3 15 черный земля
+5 В красный 4 16 зеленый ПС_ОН №
земля черный 5 17 черный земля
+5 В красный 6 18 черный земля
земля черный 7 19 черный земля
PWR_OK серый 8 20 белый -5 вольт (опционально)
VSB +5 В фиолетовый 9 21 красный +5 вольт
+12 В желтый 10 22 красный +5 вольт
+12 В желтый 11 23 красный +5 вольт
+3. 3 вольта оранжевый 12 24 черный земля

Некоторые линии напряжения на соединителе могут иметь меньшие измерительные провода, которые позволяют источнику питания определять, какое напряжение на самом деле видит материнская плата. Они довольно часто встречаются на линии 3,3 В на выводе 13, но иногда используются и для других напряжений. Линия -5 В на выводе 20 была сделана необязательной в ATX12V 1.3 (введен в 2003 г.), потому что -5 годами редко использовался. Новые материнские платы практически никогда не требуют -5 вольт, в отличие от многих старых материнских плат. Большинство новых блоков питания не обеспечивают -5 вольт, и в этом случае белый провод отсутствует.

Номера деталей разъема
Разъем материнской платы

PCI — OSDev Wiki

Шина PCI

Шина PCI (Peripheral Component Interconnect) была определена для создания высокопроизводительной и недорогой локальной шины, которая останется в продуктах нескольких поколений. Благодаря сочетанию прозрачного пути обновления со 132 МБ / с (32-бит на 33 МГц) до 528 МБ / с (64-бит на 66 МГц) и сигнальных сред 5 В и 3,3 В шина PCI удовлетворяет потребности обоих недорогие настольные системы и высокопроизводительные серверы LAN. Компонент шины PCI и интерфейс платы расширения не зависят от процессора, что обеспечивает эффективный переход на будущие процессоры, а также возможность использования с несколькими архитектурами процессоров. Недостатком шины PCI является ограниченное количество электрических нагрузок, которыми она может управлять.Одна шина PCI может управлять максимум 10 нагрузками. (Помните, что при подсчете количества нагрузок на шине коннектор считается одной нагрузкой, а устройство PCI считается другой, а иногда и двумя.)

Пространство конфигурации

Спецификация PCI предусматривает полностью программную инициализацию и настройку каждого устройства (или цели) на шине PCI через отдельное адресное пространство конфигурации. Все устройства PCI, за исключением мостов главной шины, должны предоставлять для этой цели 256 байтов регистров конфигурации.

Циклы чтения / записи конфигурации используются для доступа к пространству конфигурации каждого целевого устройства. Цель выбирается во время доступа к конфигурации, когда заявлен ее сигнал IDSEL. IDSEL действует как классический сигнал выбора микросхемы. Во время фазы адресации цикла конфигурации процессор может адресовать один из 64 32-битных регистров в пространстве конфигурации, помещая требуемый номер регистра в адресные строки 2–7 (AD [7..2]) и строки разрешения байтов. .

Устройства PCI по своей природе имеют прямой порядок байтов, что означает, что все многобайтовые поля имеют наименее значимые значения по младшим адресам.Для этого требуется процессор с прямым порядком байтов, такой как Power PC, для выполнения правильной перестановки байтов данных, считываемых с устройства PCI или записываемых на него, включая любые обращения к адресному пространству конфигурации.

Системы должны обеспечивать механизм, позволяющий получить доступ к пространству конфигурации PCI, так как большинство ЦП не имеют такого механизма. Эту задачу обычно выполняет мост от хоста к PCI (мост хоста). Определены два различных механизма, позволяющих программному обеспечению генерировать необходимые доступы к конфигурации.Механизм №1 конфигурации является предпочтительным методом, а механизм №2 предназначен для обратной совместимости. Здесь будет описан только механизм конфигурации №1, так как это единственный механизм доступа, который будет использоваться в будущем.

Механизм доступа к пространству конфигурации № 1

Используются два 32-битных местоположения ввода-вывода, первое местоположение (0xCF8) называется CONFIG_ADDRESS, а второе (0xCFC) называется CONFIG_DATA. CONFIG_ADDRESS указывает адрес конфигурации, к которому требуется доступ, в то время как доступ к CONFIG_DATA будет фактически генерировать доступ к конфигурации и будет передавать данные в регистр CONFIG_DATA или из него.

CONFIG_ADDRESS — это 32-битный регистр, формат которого показан на следующем рисунке. Бит 31 — это флаг разрешения для определения, когда доступ к CONFIG_DATA должен быть преобразован в циклы конфигурации. Биты с 23 по 16 позволяют программному обеспечению конфигурации выбрать конкретную шину PCI в системе. Биты с 15 по 11 выбирают конкретное устройство на шине PCI. Биты с 10 по 8 выбирают конкретную функцию в устройстве (если устройство поддерживает несколько функций).

Младший байт выбирает смещение в 256-байтовом пространстве конфигурации, доступном с помощью этого метода.Поскольку все операции чтения и записи должны быть как 32-битными, так и выровненными для работы во всех реализациях, два младших бита CONFIG_ADDRESS всегда должны быть нулевыми, а оставшиеся шесть битов позволяют вам выбирать каждое из 64 32-битных слов. Если вам не нужны все 32 бита, вам придется выполнить невыровненный доступ в программном обеспечении, выровняв адрес с последующим маскированием и сдвигом ответа.

31 30–24 23–16 15–11 10–8 7-0
Бит включения Зарезервировано Номер автобуса Номер устройства Номер функции Смещение регистра¹

¹ Смещение регистра должно указывать на последовательные DWORD, т. е.биты 1: 0 всегда равны 0b00 (они все еще являются частью смещения регистра).

Следующий сегмент кода иллюстрирует использование механизма конфигурации # 1 для чтения 16-битных полей из пространства конфигурации. Обратите внимание, что этот сегмент, функции outl (порт, значение) и inl (порт) относятся к инструкциям на языке ассемблера Pentium OUTL и INL.

 uint16_t pciConfigReadWord (шина uint8_t, слот uint8_t, функция uint8_t, смещение uint8_t) {
    адрес uint32_t;
    uint32_t lbus = (uint32_t) шина;
    uint32_t lslot = (uint32_t) слот;
    uint32_t lfunc = (uint32_t) func;
    uint16_t tmp = 0;

    / * создаем адрес конфигурации, как показано на рисунке 1 * /
    адрес = (uint32_t) ((lbus << 16) | (lslot << 11) |
              (lfunc << 8) | (смещение & 0xfc) | ((uint32_t) 0x80000000));

    / * выписываем адрес * /
    outl (0xCF8, адрес);
    / * считываем данные * /
    / * (offset & 2) * 8) = 0 выберет первое слово 32-битного регистра * /
    tmp = (uint16_t) ((inl (0xCFC) >> ((смещение & 2) * 8)) & 0xffff);
    возврат (tmp);
} 

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

 uint16_t pciCheckVendor (шина uint8_t, слот uint8_t) {
    uint16_t vendor, device;
    / * пытаемся прочитать первый регистр конфигурации. Поскольку нет * /
    / * поставщики, которые == 0xFFFF, это должно быть несуществующее устройство. * /
    if ((vendor = pciConfigReadWord (bus, slot, 0,0))! = 0xFFFF) {
       устройство = pciConfigReadWord (шина, слот, 0,2);
       . . .
    } return (поставщик);
} 

Механизм доступа к пространству конфигурации № 2

Этот механизм доступа к пространству конфигурации устарел в PCI версии 2.0. Это означает, что он, вероятно, будет существовать на оборудовании примерно с 1992 года (когда был представлен PCI 1.0) до 1993 года (когда был представлен PCI 2.0), что ограничивает его использование материнскими платами 80486 и ранними Pentium.

Для механизма доступа № 2 порт ввода-вывода по адресу 0x0CF8 является 8-битным портом и используется для включения / отключения механизма доступа и установки номера функции. Он имеет следующий формат:

7–4 3 — 1 0
Ключ (0 = механизм доступа отключен, ненулевое значение = механизм доступа включен) Номер функции Специальный цикл разрешен, если установлен

Порт ввода-вывода в 0x0CFA («регистр пересылки») также является 8-битным портом и используется для установки номера шины для последующих обращений к пространству конфигурации PCI.

После включения механизма доступа; доступы к портам ввода-вывода от 0xC000 до 0xCFFF используются для доступа к пространству конфигурации PCI. Номер порта ввода-вывода имеет следующий формат:

15–12 11–8 7–2 1 — 0
Должно быть 1100b Номер устройства Регистровый индекс Должен быть нулем

Обратите внимание, что это ограничивает систему до 16 устройств на шину PCI.

Доступ к пространству конфигурации PCI с отображением памяти

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

Обратите внимание, что системы, которые предоставляют механизм доступа с отображением памяти, также должны поддерживать механизм доступа PCI №1 для обратной совместимости.

Обнаружение механизма доступа к пространству конфигурации / с

В целом есть 4 корпуса:

  • Компьютер не поддерживает PCI (либо компьютер слишком старый, либо ваша ОС запускается в будущем после замены PCI)
  • компьютер поддерживает механизм №2
  • компьютер поддерживает механизм №1, но не поддерживает механизм доступа с отображением памяти
  • компьютер поддерживает как механизм №1, так и механизм доступа с отображением памяти

Для систем BIOS «int 0x1A, AX = 0xB101 (проверка наличия PCI BIOS)» сообщит вам, использует ли система механизм №1 или механизм №2. Если эта функция не существует, вы не можете быть уверены, поддерживает ли компьютер PCI или нет. Если он говорит, что механизм №1 поддерживается, вы не узнаете, поддерживается ли также механизм доступа с отображением памяти или нет.

Для систем UEFI очень безопасно предположить, что механизм №2 не поддерживается; и вы можете проверить, поддерживает ли компьютер PCI или нет, проверив, существует ли протокол «Поддержка шины PCI». Если поддерживается PCI, нет простого способа определить, поддерживает ли (например) компьютер механизм №1 или нет.

Для систем BIOS и UEFI можно проверить таблицы ACPI, чтобы определить, поддерживается ли механизм доступа с отображением памяти.

Это оставляет несколько случаев невыясненными (например, когда вы не знаете, поддерживается ли механизм №1 или №2, несмотря на попытку всего вышеперечисленного). В этих случаях остается единственный вариант — зондирование вручную. Это означает 2 конкретных теста — поддерживается ли механизм №1 и если нет, поддерживается ли механизм №2. Обратите внимание, что ручное зондирование связано с риском; в том, что если нет PCI (т.е.г. в системе есть только ISA) доступ к порту ввода-вывода может вызвать неопределенное поведение (особенно в системах, где шина ISA игнорирует 6 старших бит адреса порта ввода-вывода, где доступ к порту ввода-вывода 0x0CF8 аналогичен доступу к порту ввода-вывода 0x00F8).

Структура устройства PCI

Спецификация PCI определяет организацию 256-байтовых регистров пространства конфигурации и вводит специальный шаблон для пространства. На рисунках 2 и 3 показана структура 256-байтового пространства конфигурации.Все совместимые с PCI устройства должны поддерживать поля Vendor ID, Device ID, Command and Status, Revision ID, Class Code и Header Type. Реализация других регистров не является обязательной, в зависимости от функциональности устройства.

Следующие описания полей являются общими для всех типов заголовков:

  • ID устройства: Определяет конкретное устройство. Если действительные идентификаторы назначаются поставщиком.
  • ID поставщика: Идентифицирует производителя устройства.Где допустимые идентификаторы выделяются PCI-SIG (список здесь) для обеспечения уникальности, а 0xFFFF — недопустимое значение, которое будет возвращено при доступе для чтения к регистрам пространства конфигурации несуществующих устройств.
  • Состояние: Регистр, используемый для записи информации о состоянии для событий, связанных с шиной PCI.
  • Команда: Обеспечивает контроль над способностью устройства генерировать циклы PCI и отвечать на них. Если единственная функция, которая гарантированно поддерживается всеми устройствами, — это когда в этот регистр записывается 0, устройство отключается от шины PCI для всех обращений, кроме доступа к пространству конфигурации.
  • Код класса: Регистр только для чтения, указывающий тип функции, выполняемой устройством.
  • Подкласс: Регистр только для чтения, который определяет конкретную функцию, которую выполняет устройство.
  • Prog IF: Регистр только для чтения, который задает интерфейс программирования на уровне регистров, который есть у устройства, если он вообще есть.
  • Идентификатор редакции: Задает идентификатор редакции для конкретного устройства. Если действительные идентификаторы назначаются поставщиком.
  • BIST: Представляет это состояние и позволяет управлять устройством BIST (встроенное самотестирование).
  • Тип заголовка: Определяет структуру остальной части заголовка, начиная с байта 0x10 заголовка, а также указывает, имеет ли устройство несколько функций. Если значение 0x00 определяет обычное устройство, значение 0x01 указывает мост PCI-to-PCI, а значение 0x02 указывает мост CardBus. Если бит 7 этого регистра установлен, устройство выполняет несколько функций; в противном случае это однофункциональное устройство.
  • Таймер задержки: Задает таймер задержки в единицах тактовых импульсов шины PCI.
  • Размер строки кэша: Задает размер строки системного кэша в 32-битных единицах. Устройство может ограничить количество поддерживаемых размеров строки кэша. Если в это поле записано неподдерживаемое значение, устройство будет вести себя так, как если бы было записано значение 0.

Эта таблица применима, если Тип заголовка — 00h. (Фигура 2)

регистр смещение бит 31-24 бит 23-16 бит 15-8 бит 7-0
00 00 ID устройства ID поставщика
01 04 Статус Команда
02 08 Код класса Подкласс Прог, IF Идентификатор редакции
03 0C БИСТ Тип заголовка Таймер задержки Размер строки кэша
04 10 Базовый адрес # 0 (BAR0)
05 14 Базовый адрес # 1 (BAR1)
06 18 Базовый адрес # 2 (BAR2)
07 Базовый адрес # 3 (BAR3)
08 20 Базовый адрес # 4 (BAR4)
09 24 Базовый адрес # 5 (BAR5)
0A 28 Cardbus CIS Указатель
0B 2C ID подсистемы ID поставщика подсистемы
0C 30 Базовый адрес ПЗУ расширения
0D 34 Зарезервировано Указатель возможностей
0E 38 Зарезервировано
0F 3C Максимальная задержка мин Грант PIN прерывания линия прерывания

Следующие описания полей применимы, если Тип заголовка равен 0x00:

  • CardBus CIS Pointer: Указывает на структуру информации карты и используется устройствами, которые совместно используют микросхемы между CardBus и PCI.
  • Линия прерывания: Определяет, к какому входу системных контроллеров прерываний подключен вывод прерывания устройства, и реализуется любым устройством, которое использует вывод прерывания. Для архитектуры x86 этот регистр соответствует номерам PIC IRQ 0-15 (а не номерам I / O APIC IRQ), а значение 0xFF не определяет соединение.
  • Вывод прерывания: Указывает, какой вывод прерывания использует устройство. Где значение 0x01 — это INTA #, 0x02 — это INTB #, 0x03 — это INTC #, 0x04 — это INTD #, а 0x00 означает, что устройство не использует вывод прерывания.
  • Макс. Задержка: Регистр только для чтения, который указывает, как часто устройству требуется доступ к шине PCI (в единицах 1/4 микросекунды).
  • Min Grant: Регистр только для чтения, который указывает длину периода пакета в единицах 1/4 микросекунды, которая требуется устройству (при тактовой частоте 33 МГц).
  • Указатель возможностей: точек (т. Е. Смещение в пространстве конфигурации этой функции) к связанному списку новых возможностей, реализованных устройством.Используется, если бит 4 регистра состояния (бит списка возможностей) установлен в 1. Два нижних бита зарезервированы и должны быть замаскированы перед использованием указателя для доступа к пространству конфигурации.

Эта таблица применима, если тип заголовка — 01h (мост PCI-to-PCI) (рисунок 3)

База ввода-вывода
регистр смещение бит 31-24 бит 23-16 бит 15-8 бит 7-0
00 00 ID устройства ID поставщика
01 04 Статус Команда
02 08 Код класса Подкласс Прог, IF Идентификатор редакции
03 0C БИСТ Тип заголовка Таймер задержки Размер строки кэша
04 10 Базовый адрес # 0 (BAR0)
05 14 Базовый адрес # 1 (BAR1)
06 18 Вторичный таймер задержки Номер подчиненной шины Номер вторичной шины Номер первичной шины
07 вторичный статус Предел ввода / вывода
08 20 Предел памяти База памяти
09 24 Предел предварительно загружаемой памяти База памяти с возможностью предварительной загрузки
0A 28 Базовые верхние 32 бита с предварительной выборкой
0B 2C Предел предварительной выборки, верхние 32 бита
0C 30 Верхний предел ввода / вывода 16 бит Верхние 16 бит базы ввода / вывода
0D 34 Зарезервировано Указатель возможностей
0E 38 Базовый адрес ПЗУ расширения
0F 3C Управление мостом PIN прерывания линия прерывания

Вот схема регистра типа заголовка:

Бит 7 Биты с 6 по 0
MF Тип заголовка
  • MF — Если MF = 1, то это устройство выполняет несколько функций.
  • Тип заголовка — 00h Стандартный заголовок — 01h Мост PCI-to-PCI — 02h Мост CardBus
Регистр BIST

Вот схема регистра BIST:

Бит 7 Бит 6 Биты 4 и 5 Биты от 0 до 3
Возможность BIST Старт BIST Зарезервировано Код завершения
  • BIST Capable — вернет 1, устройство поддерживает BIST.
  • Start BIST — Если установлено значение 1, запускается BIST. Этот бит сбрасывается после завершения BIST. Если BIST не завершается через 2 секунды, устройство должно выйти из строя из-за системного программного обеспечения.
  • Код завершения — вернет 0 после выполнения BIST, если тест завершился успешно.

Эта таблица применима, если тип заголовка — 02h (мост PCI-to-CardBus)

регистр смещение бит 31-24 бит 23-16 бит 15-8 бит 7-0
00 00 ID устройства ID поставщика
01 04 Статус Команда
02 08 Код класса Подкласс Прог, IF Идентификатор редакции
03 0C БИСТ Тип заголовка Таймер задержки Размер строки кэша
04 10 Базовый адрес CardBus Socket / ExCa
05 14 Дополнительный статус Зарезервировано Смещение списка возможностей
06 18 Таймер задержки CardBus Номер подчиненного автобуса Номер автобуса CardBus номер шины PCI
07 Базовый адрес памяти 0
08 20 Предел памяти 0
09 24 Базовый адрес памяти 1
0A 28 Предел памяти 1
0B 2C Базовый адрес ввода / вывода 0
0C 30 Предел ввода / вывода 0
0D 34 Базовый адрес ввода / вывода 1
0E 38 Предел ввода / вывода 1
0F 3C Управление мостом PIN прерывания линия прерывания
10 40 ID поставщика подсистемы ID устройства подсистемы
11 44 16-битный базовый адрес устаревшей карты PC Card
Регистр команд

Вот схема регистра команд:

Биты с 11 по 15 Бит 10 Бит 9 Бит 8 Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
Зарезервировано Отключение прерывания Fast Back-to-Back Включить SERR # Включить Зарезервировано Ответ об ошибке четности Палитра VGA Snoop Включение записи в память и недействительности Специальные циклы Bus Master Объем памяти Пространство ввода / вывода
  • Отключение прерывания — Если установлено значение 1, сигнал INTx # устройства отключен; в противном случае утверждение сигнала разрешено.
  • Fast Back-Back Enable — Если установлено в 1, означает, что устройству разрешено генерировать быстрые обратные транзакции; в противном случае быстрые двусторонние транзакции разрешены только одному и тому же агенту.
  • SERR # Enable — Если установлено в 1, драйвер SERR # включен; в противном случае драйвер отключен.
  • Бит 7 — Начиная с версии 3.0 спецификации локальной шины PCI этот бит жестко привязан к 0. В более ранних версиях спецификации этот бит использовался устройствами и мог быть жестко привязан к 0, 1 или реализован как бит чтения / записи.
  • Ответ об ошибке четности — Если установлено значение 1, устройство будет выполнять свои обычные действия при обнаружении ошибки четности; в противном случае при обнаружении ошибки устройство установит бит 15 регистра состояния (бит состояния обнаруженной ошибки четности), но не будет утверждать вывод PERR # (ошибка четности) и продолжит работу в обычном режиме.
  • VGA Palette Snoop — Если установлено в 1, устройство не отвечает на записи в регистр палитры и будет отслеживать данные; в противном случае устройство будет обрабатывать доступ к записи палитры, как и все другие обращения.
  • Разрешение записи и недействительности в память — Если установлено значение 1, устройство может генерировать команду «Запись в память и недействительность»; в противном случае необходимо использовать команду записи в память.
  • Специальные циклы — Если установлено значение 1, устройство может контролировать операции специального цикла; в противном случае устройство их проигнорирует.
  • Bus Master — Если установлено в 1, устройство может вести себя как мастер шины; в противном случае устройство не сможет генерировать доступ к PCI.
  • Пространство памяти — Если установлено в 1, устройство может отвечать на доступы к пространству памяти; в противном случае ответ устройства отключен.
  • Пространство ввода-вывода — Если установлено значение 1, устройство может отвечать на доступы к пространству ввода-вывода; в противном случае ответ устройства отключен.

Если ядро ​​настраивает полосы BAR устройств, ядро ​​также должно активировать биты 0 и 1 для его активации.

Регистр состояния

Вот схема регистра статуса:

Список возможностей
Бит 15 Бит 14 Бит 13 Бит 12 Бит 11 Биты 9 и 10 Бит 8 Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Биты от 0 до 2
Обнаружена ошибка четности Сигнализация системной ошибки Получено прерывание ведущего Получено прерывание цели Сигнал прерывания цели DEVSEL Timing Ошибка четности основных данных Возможность быстрого спина к спине Зарезервировано 66 МГц Состояние прерывания Зарезервировано
  • Обнаружена ошибка четности — этот бит будет установлен в 1 всякий раз, когда устройство обнаруживает ошибку четности, даже если обработка ошибок четности отключена.
  • Сигнальная системная ошибка — Этот бит будет установлен в 1 всякий раз, когда устройство подтверждает номер SERR.
  • Received Master Abort — Этот бит будет установлен в 1 ведущим устройством, когда его транзакция (за исключением транзакций специального цикла) завершается с помощью Master-Abort.
  • Received Target Abort — Этот бит будет установлен в 1 ведущим устройством, когда его транзакция завершается с помощью Target-Abort.
  • Сигнал прерывания цели — Этот бит будет установлен в 1 всякий раз, когда целевое устройство завершает транзакцию с помощью прерывания цели.
  • DEVSEL Timing — Биты только для чтения, которые представляют самое медленное время, в течение которого устройство будет устанавливать DEVSEL # для любой команды шины, кроме чтения и записи пространства конфигурации. Где значение 0x00 представляет быструю синхронизацию, значение 0x01 представляет среднюю синхронизацию, а значение 0x02 представляет медленную синхронизацию.
  • Ошибка четности основных данных — Этот бит устанавливается только при выполнении следующих условий. Агент шины подтвердил PERR # при чтении или наблюдал за подтверждением PERR # при записи, агент, устанавливающий бит, действовал как мастер шины для операции, в которой возникла ошибка, и бит 6 регистра команд (ответ на ошибку четности bit) установлен в 1.
  • Fast Back-to-Back Capable — Если установлено 1, устройство может принимать быстрые двусторонние транзакции, которые исходят от другого агента; в противном случае транзакции могут быть приняты только от одного и того же агента.
  • Бит 6 — Начиная с версии 3.0 спецификации локальной шины PCI, этот бит зарезервирован. В версии 2.1 спецификации этот бит использовался, чтобы указать, поддерживает ли устройство определяемые пользователем функции.
  • 66 МГц Capable — Если установлено значение 1, устройство может работать на частоте 66 МГц; в противном случае устройство работает на частоте 33 МГц.
  • Список возможностей — Если установлено значение 1, устройство реализует указатель для связанного списка новых возможностей со смещением 0x34; в противном случае связанный список будет недоступен.
  • Состояние прерывания — Представляет состояние сигнала INTx # устройства. Если установлено в 1 и бит 10 регистра команд (бит запрета прерывания) установлен в 0, сигнал будет подтвержден; в противном случае сигнал будет проигнорирован.


Напомним, что устройства PCI следуют небольшому порядку ENDIAN.Нижние адреса содержат наименее значимые части поля. Программное обеспечение для управления этой структурой должно уделять особое внимание тому, чтобы порядок следования байтов следовал устройствам PCI, а не процессорам.

Регистры базового адреса

Регистры базового адреса

(или BAR) могут использоваться для хранения адресов памяти, используемых устройством, или смещений для адресов портов. Как правило, полосы BAR адреса памяти должны располагаться в физической оперативной памяти, в то время как полосы BAR пространства ввода-вывода могут располагаться по любому адресу памяти (даже за пределами физической памяти). Чтобы различать их, вы можете проверить значение младшего бита. В следующих таблицах описаны два типа полос:

Макет полосы памяти
31 — 4 3 2 — 1 0
16-байтовый выровненный базовый адрес с возможностью предварительной загрузки Тип Всегда 0
Схема расположения панели пространства ввода / вывода
31 — 2 1 0
4-байтовый выровненный базовый адрес Зарезервировано Всегда 1


Поле «Тип» в структуре полосы памяти указывает размер базового регистра и место его отображения в памяти.Если он имеет значение 0x00, то базовый регистр имеет ширину 32 бита и может быть отображен в любом месте 32-битного пространства памяти. Значение 0x02 означает, что базовый регистр имеет ширину 64 бита и может быть отображен в любом месте 64-битного пространства памяти (64-битный регистр базового адреса потребляет 2 из доступных регистров базового адреса). Значение 0x01 зарезервировано с версии 3.0 Спецификации локальной шины PCI. В более ранних версиях он использовался для поддержки пространства памяти ниже 1 МБ (16-разрядный базовый регистр, который может быть отображен в любом месте 16-разрядного пространства памяти).

Если вы хотите получить фактический базовый адрес BAR, не забудьте замаскировать младшие биты. Для 16-битных полосок пространства памяти вы вычисляете (BAR [x] & 0xFFF0). Для 32-битных полосок пространства памяти вы вычисляете (BAR [x] & 0xFFFFFFF0). Для полос 64-битного пространства памяти вы вычисляете ((BAR [x] & 0xFFFFFFF0) + ((BAR [x + 1] & 0xFFFFFFFF) << 32)). Для полос ввода / вывода вы вычисляете (BAR [x] & 0xFFFFFFFC).

Чтобы определить объем адресного пространства, необходимого для устройства PCI, вы должны сохранить исходное значение BAR, записать значение всех единиц в регистр, а затем прочитать его обратно. Затем объем памяти можно определить путем маскирования информационных битов, выполнения побитового НЕ (‘~’ в C) и увеличения значения на 1. Затем следует восстановить исходное значение BAR. Регистр BAR выровнен естественным образом, и поэтому вы можете изменять только установленные биты. Например, если устройство использует 16 МБ, в нем будет BAR0, заполненный 0xFF000000 (0x01000000 после декодирования), и вы можете изменить только старшие 8 бит. [1]

Когда регистр базового адреса помечен как Prefetchable, это означает, что область не имеет побочных эффектов чтения (чтение из этого диапазона памяти не меняет никакого состояния), и процессору разрешено кэшировать загрузки из этой памяти региона и считывать его пакетами (обычно размер строки кэша).Аппаратному обеспечению также разрешено объединять повторяющиеся хранилища по одному и тому же адресу в одно хранилище самого последнего значения. Если вы используете разбиение по страницам и хотите максимальную производительность, вам следует сопоставить области MMIO с возможностью предварительной загрузки как WT (сквозная запись) вместо UC (некэшируемые). На x86 фрейм-буферы являются исключением, они почти всегда должны быть сопоставлены WC (запись-объединение).

Коды классов

Регистры Class Code, Subclass и Prog IF используются для определения типа устройства, функции устройства и интерфейса программирования на уровне регистров, соответственно.

В следующей таблице подробно описаны большинство известных типов и функций устройств:

Код класса Подкласс Прогр. IF
0x00 — Несекретный 0x00 — устройства, не поддерживающие VGA
0x01 — VGA-совместимое устройство
0x01 — Контроллер запоминающего устройства 0x00 — Контроллер шины SCSI
0x01 — Контроллер IDE 0x00 — контроллер, работающий только в режиме совместимости с ISA
0x05 — контроллер только в собственном режиме PCI
0x0A — контроллер режима совместимости с ISA, поддерживает оба канала, переключенные в собственный режим PCI
0x0F — контроллер собственного режима PCI, поддерживает оба канала, переключенные в режим совместимости с ISA
0x80 — контроллер, работающий только в режиме совместимости с ISA, поддерживает управление шиной
0x85 — контроллер только в собственном режиме PCI, поддерживает управление шиной
0x8A — контроллер режима совместимости с ISA, поддерживает оба канала, переключенные в собственный режим PCI, поддерживает мастеринг шины
0x8F — контроллер в собственном режиме PCI, поддерживает оба канала, переключенные в режим совместимости с ISA, поддерживает управление шиной
0x02 — Контроллер гибких дисков
0x03 — Контроллер шины IPI
0x04 — RAID-контроллер
0x05 — Контроллер ATA 0x20 — одиночный DMA
0x30 — связанный DMA
0x06 — Последовательный ATA 0x00 — интерфейс, зависящий от поставщика
0x01 — AHCI 1. 0
0x02 — последовательная шина хранения
0x07 — SCSI с последовательным подключением 0x00 — SAS
0x01 — последовательная шина хранения
0x08 — Контроллер энергонезависимой памяти 0x01 — NVMHCI
0x02 — NVM Express
0x80 — Другое
0x02 — сетевой контроллер 0x00 — Ethernet-контроллер
0x01 — контроллер Token Ring
0x02 — Контроллер FDDI
0x03 — Контроллер банкомата
0x04 — Контроллер ISDN
0x05 — Контроллер WorldFip
0x06 — PICMG 2.14 Мультикомпьютер
0x07 — Контроллер Infiniband
0x08 — Контроллер ткани
0x80 — Другое
0x03 — Контроллер дисплея 0x00 — VGA-совместимый контроллер 0x00 — Контроллер VGA
0x01 — 8514-совместимый контроллер
0x01 — Контроллер XGA
0x02 — 3D-контроллер (не совместим с VGA)
0x80 — Другое
0x04 — Мультимедийный контроллер 0x00 — Мультимедийный видеоконтроллер
0x01 — Мультимедийный аудиоконтроллер
0x02 — Устройство компьютерной телефонии
0x03 — Аудиоустройство
0x80 — Другое
0x05 — Контроллер памяти 0x00 — Контроллер ОЗУ
0x01 — флэш-контроллер
0x80 — Другое
0x06 — Устройство моста 0x00 — Хост-мост
0x01 — мост ISA
0x02 — мост EISA
0x03 — Мост MCA
0x04 — мост PCI-to-PCI 0x00 — нормальное декодирование
0x01 — Субтрактивное декодирование
0x05 — Мост PCMCIA
0x06 — мост NuBus
0x07 — Мост CardBus
0x08 — Мост RACEway 0x00 — прозрачный режим
0x01 — режим конечной точки
0x09 — мост PCI-to-PCI 0x40 — полупрозрачная, основная шина к центральному процессору
0x80 — полупрозрачный, вторичная шина к центральному процессору
0x0A — Мост хоста InfiniBand-PCI
0x80 — Другое
0x07 — простой коммуникационный контроллер 0x00 — последовательный контроллер 0x00 — Совместимость с 8250 (Generic XT)
0x01 — 16450-Совместимость
0x02 — 16550-совместимый
0x03 — 16650-Совместимость
0x04 — 16750-Совместимость
0x05 — 16850-Совместимость
0x06 — 16950-Совместимость
0x01 — параллельный контроллер 0x00 — стандартный параллельный порт
0x01 — двунаправленный параллельный порт
0x02 — ECP 1. X-совместимый параллельный порт
0x03 — Контроллер IEEE 1284
0xFE — целевое устройство IEEE 1284
0x02 — Многопортовый последовательный контроллер
0x03 — Модем 0x00 — Стандартный модем
0x01 — интерфейс, совместимый с Hayes 16450
0x02 — Интерфейс, совместимый с Hayes 16550
0x03 — Интерфейс, совместимый с Hayes 16650
0x04 — Интерфейс, совместимый с Hayes 16750
0x04 — IEEE 488.Контроллер 1/2 (GPIB)
0x05 — Смарт-карта
0x80 — Другое
0x08 — периферийное устройство базовой системы 0x00 — ПИК 0x00 — общий 8259-совместимый
0x01 — Совместимость с ISA
0x02 — Совместимость с EISA
0x10 — Контроллер прерываний I / O APIC
0x20 — I / O (x) Контроллер прерываний APIC
0x01 — Контроллер DMA 0x00 — общий 8237-совместимый
0x01 — Совместимость с ISA
0x02 — Совместимость с EISA
0x02 — Таймер 0x00 — общий 8254-совместимый
0x01 — Совместимость с ISA
0x02 — Совместимость с EISA
0x03 — HPET
0x03 — Контроллер RTC 0x00 — общий RTC
0x01 — Совместимость с ISA
0x04 — PCI контроллер горячей замены
0x05 — хост-контроллер SD
0x06 — IOMMU
0x80 — Другое
0x09 — Контроллер устройства ввода 0x00 — Контроллер клавиатуры
0x01 — цифровая ручка
0x02 — Контроллер мыши
0x03 — Контроллер сканера
0x04 — Контроллер игрового порта 0x00 — общий
0x10 — Расширенный
0x80 — Другое
0x0A — Док-станция 0x00 — общий
0x80 — Другое
0x0B — процессор 0x00–386
0x01 — 486
0x02 — Pentium
0x03 — Pentium Pro
0x10 — Альфа
0x20 — PowerPC
0x30 — MIPS
0x40 — сопроцессор
0x80 — Другое
0x0C — Контроллер последовательной шины 0x00 — Контроллер FireWire (IEEE 1394) 0x00 — общий
0x10 — OHCI
0x01 — Шина доступа
0x02 — SSA
0x03 — USB-контроллер 0x00 — Контроллер UHCI
0x10 — Контроллер OHCI
0x20 — Контроллер EHCI (USB2)
0x30 — Контроллер XHCI (USB3)
0x80 — Не указано
0xFE — USB-устройство (не хост-контроллер)
0x04 — Fibre Channel
0x05 — шина SMBus
0x06 — InfiniBand
0x07 — Интерфейс IPMI 0x00 — СМИК
0x01 — Стиль контроллера клавиатуры
0x02 — Передача блока
0x08 — Интерфейс SERCOS (IEC 61491)
0x09 — CANbus
0x80 — Другое
0x0D — Беспроводной контроллер 0x00 — совместимый контроллер iRDA
0x01 — потребительский ИК-контроллер
0x10 — RF контроллер
0x11 — Контроллер Bluetooth
0x12 — широкополосный контроллер
0x20 — Ethernet-контроллер (802. 1а)
0x21 — Ethernet-контроллер (802.1b)
0x80 — Другое
0x0E — Интеллектуальный контроллер 0x00 — I20
0x0F — Контроллер спутниковой связи 0x01 — Контроллер спутникового ТВ
0x02 — Контроллер спутникового аудио
0x03 — спутниковый голосовой контроллер
0x04 — спутниковый контроллер данных
0x10 — Контроллер шифрования 0x00 — Сетевое и вычислительное шифрование / дешифрование
0x10 — Шифрование / дешифрование развлечений
0x80 — Другое шифрование / дешифрование
0x11 — Контроллер обработки сигналов 0x00 — Модули DPIO
0x01 — Счетчики производительности
0x10 — Синхронизатор связи
0x20 — Управление обработкой сигналов
0x80 — Другое
0x12 — Ускоритель обработки
0x13 — Неосновные приборы
0x14 — 0x3F (Зарезервировано)
0x40 — сопроцессор
0x41 — 0xFE (Зарезервировано)
0xFF — неназначенный класс (зависит от поставщика)

Перечисление шин PCI

Существует 3 способа перечисления устройств на шинах PCI. Первый способ — это «грубая сила», проверка каждого устройства на каждой шине PCI (независимо от того, существует эта шина или нет). Второй способ позволяет избежать большого количества работы, выясняя действительные номера шины во время сканирования, и является немного более сложным, поскольку включает в себя рекурсию. Для обоих этих методов вы полагаетесь на что-то (прошивку) для правильной настройки шин PCI (настройка мостов PCI-PCI для пересылки запросов с одной шины на другую). Третий метод похож на второй, за исключением того, что вы настраиваете мосты PCI во время этого.

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

 void checkDevice (шина uint8_t, устройство uint8_t) {
     uint8_t function = 0;

     vendorID = getVendorID (шина, устройство, функция);
     если (vendorID == 0xFFFF) возврат; // Устройство не существует
     checkFunction (шина, устройство, функция);
     headerType = getHeaderType (шина, устройство, функция);
     if ((headerType & 0x80)! = 0) {
         / * Это многофункциональное устройство, поэтому проверьте оставшиеся функции * /
         for (функция = 1; функция <8; функция ++) {
             if (getVendorID (шина, устройство, функция)! = 0xFFFF) {
                 checkFunction (шина, устройство, функция);
             }
         }
     }
 }

 void checkFunction (шина uint8_t, устройство uint8_t, функция uint8_t) {
 } 

Обратите внимание, что если вы не проверяете бит 7 типа заголовка и не просматриваете все функции, то некоторые однофункциональные устройства будут сообщать подробности для «функции 0» для каждой функции.

Добавить комментарий

Ваш адрес email не будет опубликован.