Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шины.PCI,.USB.и.FireWire

.pdf
Скачиваний:
59
Добавлен:
19.03.2016
Размер:
6 Mб
Скачать

Классификация устройств PCI

Важной частью спецификации PCI является классификация устройств и указа$ ние кода класса в его конфигурационном пространстве (3 байта Class Code). Стар$ ший байт определяет базовый класс, средний — подкласс, младший — программный интерфейс (если он стандартизован). Код класса позволяет идентифицировать наличие определенных устройств в системе, это может быть сделано с помощью PCI BIOS. Для стандартизованных классов и интерфейсов (например, 01:01:80 — контроллер IDE или 07:00:01 — последовательный порт 16450) «заинтересован$ ная» программа может найти требуемое устройство и выбрать подходящий вари$ ант драйвера. Классификатор определяет организация PCI SIG, он регулярно об$ новляется на сайте http://www.pcisig.com. Нулевые значения полей, как правило, дают самые неопределенные описания. Значение подкласса 80h относится к «иным устройствам». Некоторые классы устройств приведены в табл. 5.1.

Таблица 5.1. Некоторые классы устройств PCI

Подкласс

Интерфейс

Назначение

Базовый класс 00 — устройства, разработанные до принятия классификации

00

00

Все, кроме VGA совместимых

01

00

VGA совместимый графический адаптер

Базовый класс 01 — контроллеры устройств хранения

00

00

Контроллер шины SCSI

01

xx

Контроллер IDE

02

00

Контроллер НГМД

03

00

Контроллер шины IPI

04

00

Контроллер RAID

Базовый класс 02 — сетевые контроллеры

00

00

Ethernet

01

00

Token Ring

02

00

FDDI

03

00

ATM

04

00

ISDN

Базовый класс 03 — дисплейные контроллеры

00

00

Совместимый с VGA (память 0A0000–0BFFFFh, порты 3B0–3BBh

 

 

и 3C0–3DFh)

00

01

Совместимый с IBM 8514 (порты 2E8h, 2EAh 2EFh)

01

00

Контроллер XGA

02

00

Контроллер 3D

 

 

 

Подкласс

Интерфейс

Назначение

Базовый класс 04 — мультимедийные устройства

00

00

Видео

01

00

Аудио

02

00

Компьютерная телефония

Базовый класс 05 — контроллеры памяти

00

00

Контроллер памяти с произвольным доступом (RAM)

01

00

Контроллер флэш памяти

Базовый класс 06 — мосты

 

00

00

Главный мост (Host bridge)

01

00

Мост PCI ISA

02

00

Мост PCI EISA

03

00

Мост PCI MCA

04

00

Мост PCI PCI

04

01

Мост PCI PCI с субтрактивным декодированием

05

00

Мост PCI PCMCIA

06

00

Мост PCI NuBus

07

00

Мост PCI CardBus

08

xx

Мост PCI RACEway

Базовый класс 07 — коммуникационные контроллеры

00

00

UART, совместимый с 8250

 

01

UART, совместимый с 16450

 

02

UART, совместимый с 16550

 

 

06

UART, совместимый с 16950

01

00

Стандартный LPT порт

 

01

Двунаправленный LPT порт

 

02

Параллельный порт ECP 1.X

 

03

Контроллер IEEE 1284

 

FEh

Целевое устройство IEEE 1284

02

00

Мультипортовый последовательный контроллер

03

00

Модем

 

01

Hayes модем с интерфейсом 16450

 

02

Hayes модем с интерфейсом 16550

 

03

Hayes модем с интерфейсом 16650

 

04

Hayes модем с интерфейсом 16750

продолжение

Таблица 5.1 (продолжение)

Подкласс

Интерфейс

Назначение

Базовый класс 08 — системная периферия

00

00

Контроллер прерываний 8259 (PIC)

 

01

Контроллер прерываний ISA

 

02

Контроллер прерываний EISA

 

10

Контроллер прерываний I/O APIC

 

20

Контроллер прерываний I/O(x) APIC

01

00

Контроллер DMA 8237

 

01

Контроллер DMA ISA

 

02

Контроллер DMA EISA

02

00

Системный таймер 8254

 

01

Системный таймер ISA

 

02

Системный таймер EISA

03

00

Часы (RTC)

 

01

Часы (RTC) ISA

04

00

Контроллер горячего подключения PCI

Базовый класс 09 — контроллеры устройств ввода

00

00

Контроллер клавиатуры

01

00

Дигитайзер (перо)

02

00

Контроллер мыши

03

00

Контроллер сканера

04

00

Игровой порт с фиксированным адресом

 

01

Игровой порт с перемещаемым адресом

Базовый класс 0Ah — док станции

Базовый класс 0Bh — процессоры

Базовый класс 0Ch — контроллеры последовательных шин

00

00

Контроллер IEEE 1394

(FireWire)

 

10

Контроллер IEEE 1394

по спецификации OpenHCI

01

00

Контроллер ACCESS.bus

02

00

Контроллер SSA

 

03

00

Контроллер USB по UHCI

 

10h

Контроллер USB по OHCI

 

20h

Контроллер USB по EHCI

 

FEh

Устройство USB

 

Базовый класс 0Dh — контроллеры беспроводных интерфейсов

Подкласс Интерфейс Назначение

Базовый класс 0Eh — контроллеры интеллигентного ввода вывода (I2O) Базовый класс 0Fh — контроллеры спутниковых коммуникаций Базовый класс 10h — контроллеры шифрования

PCI BIOS

Для облегчения взаимодействия с устройствами PCI имеются дополнительные функции BIOS, доступные как из реального, так и защищенного режима работы процессора. Функции PCI BIOS используются только для поиска и конфигуриро$ вания устройств PCI — процедур, требующих доступа к их конфигурационному пространству. Функции приходится поддерживать и использовать потому, что циклы конфигурационных обращений, как и специальный цикл, выполняются специфическим образом. Кроме того, PCI BIOS позволяет управлять коммутато$ ром запроса прерываний (PCI Interrupt Steering), скрывая специфический про$ граммный интерфейс чипсета системной платы. Остальное взаимодействие с устройствами через их пространства памяти и ввода$вывода, а также обработка прерываний в поддержке со стороны BIOS не нуждаются, поскольку выполняют$ ся непосредственно командами процессора и не зависят от платформы (чипсета системной платы). Регулярная работа с этими устройствами выполняется через обращения к регистрам устройств по адресам, полученным при конфигурирова$ нии, и обработку известных номеров прерываний от этих устройств. Функция про$ верки наличия PCI BIOS позволяет определить доступные конфигурационные механизмы, и, зная их работу, программа в дальнейшем может обходиться и без вызовов PCI BIOS.

Программы с помощью функций PCI BIOS могут искать интересующие их уст$ ройства по идентификаторам или кодам класса. Если стоит задача полного «пере$ учета» установленных устройств, то она решается чтением конфигурационной информации по всем функциям всех устройств всех шин — это быстрее, чем пере$ бирать все возможные сочетания идентификаторов или классов кодов. Для най$ денных устройств программы должны определять реальные настройки чтением регистров конфигурационного пространства, учитывая возможность перемещения ресурсов по всему пространству и даже между пространствами памяти и ввода$ вывода.

Для 16 битного интерфейса реального режима, V86 и 16$битного защищенного режима, функции PCI BIOS вызываются через прерывание Int 1Ah; номер функ$ ции задается при вызове в регистре AX. Возможна и программная имитация пре$ рывания дальним вызовом по физическому адресу 000FFE6Eh (стандартная точ$ ка входа в обработчик Int 1Ah) с предварительным занесением в стек регистра флагов.

Для 32$разрядных вызовов защищенного режима все эти же функции вызываются через точку входа, найденную через каталог 32$разрядных сервисов (см. ниже), при этом назначение входных и выходных регистров и флага CF сохраняется. До использования 32$разрядного интерфейса следует сначала найти его каталог и убе$ диться в наличии сервисов PCI BIOS по идентификатору «$PCI» (049435024h).

Вызовы требуют глубокого стека (до 1024 байт). Признаком нормального выпол$ нения является CF = 0 и AH = 0; при CF = 1 AH содержит код ошибки:

81h — неподдерживаемая функция;

83h — неправильный идентификатор производителя;

86h — устройство не найдено;

87h — неправильный номер регистра PCI;

88h — установка не удалась;

89h — слишком маленький буфер для данных. Функции PCI BIOS перечислены ниже:

AX = B101h — проверка присутствия PCI BIOS. При наличии PCI BIOS возвраща$ ет CF = 0, AH = 0 и EDX = 20494350h (строка символов «PCI»); проверяться должны все три признака. При этом в AL находится описатель аппаратного механизма до$ ступа к конфигурационному пространству и генерации специальных циклов PCI:

бит 0 — поддержка механизма № 1 для доступа к конфигурационному простран$ ству;

бит 1 — поддержка механизма № 2 для доступа к конфигурационному простран$ ству;

биты [2:3] = 00 (резерв);

бит 4 — поддержка генерации специального цикла с использованием механиз$ ма № 1;

бит 5 — поддержка генерации специального цикла с использованием механиз$ ма № 2;

биты [6:7] = 00 (резерв).

В регистрах BH и BL возвращается старший и младший номер версии (BCD$циф$ ры), в CL — максимальный номер шины PCI, присутствующий в системе (число шин – 1, поскольку они нумеруются с нуля последовательно). В регистре EDI мо$ жет возвращаться линейный адрес точки входа 32$разрядных сервисов BIOS. Этот адрес возвращается не всеми версиями BIOS (некоторые не изменяют EDI); для проверки можно при вызове обнулять EDI и проверять на нуль возвращенное зна$ чение.

AX = B102h — поиск устройства по идентификатору. При вызове в CX указыва$ ется идентификатор устройства, в DX — идентификатор производителя, в SI — индекс (порядковый номер) устройства. При успешном возврате в BH — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции. Для нахож$ дения всех устройств с указанными идентификаторами вызовы выполняют, последовательно инкрементируя SI от 0 до получения кода возврата 86h.

AX = B103h — поиск устройства по коду класса. При вызове в ECX[23:16] ука$ зывается код класса, в ECX[15:8] — подкласса, в ECX[7:0] — интерфейс, в SI — индекс устройства (аналогично предыдущему). При успешном возврате в BH — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции.

AX = B106h — генерация специального цикла PCI. При вызове в BL указывается номер шины, в EDX — данные специального цикла.

AX = B108h — чтение байта из конфигурационного пространства устройства PCI. При вызове в BH — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0–FFh). При успешном возврате в CL — считанный байт.

AX = B109h — чтение слова из конфигурационного пространства устройства PCI.

При вызове в BH — номер шины, в BL[7:3] — номер устройства, BL[2:0] — но$ мер функции, в DI — номер регистра (0–FFh, четный). При успешном возврате

вCX — считанное слово.

AX = B10Ah — чтение двойного слова из конфигурационного пространства уст ройства PCI. При вызове в BH — номер шины, в BL[7:3] — номер устройства, BL[2:0] — номер функции, в DI — номер регистра (0–FFh, кратный 4). При успешном возврате в ECX — считанное двойное слово.

AX = B10Bh — запись байта в конфигурационное пространство устройства PCI.

При вызове в BH — номер шины, в BL[7:3] — номер устройства, BL[2:0] — но$ мер функции, в DI — номер регистра (0–FFh), в CL — записываемый байт.

AX = B10Ch — запись слова в конфигурационное пространство устройства PCI.

При вызове в BH — номер шины, в BL[7:3] — номер устройства, BL[2:0] — но$ мер функции, в DI — номер регистра (0–FFh, четный), в CX — записываемое слово.

AX = B10Dh — запись двойного слова в конфигурационное пространство устрой ства PCI. ПривызовевBH —номершины,вBL[7:3]—номерустройства,BL[2:0] — номер функции, в DI — номер регистра (0–FFh, кратный 4), в ECX — записыва$ емое двойное слово.

AX = B10Eh — определение возможностей назначения прерываний (GET_IRQ_ ROUTING_OPTIONS). При вызове BX=0, ES:EDI указывает на структуру парамет$ ров буфера для результата, состоящую из слова с длиной буфера, за которым располагается дальний указатель на его начало. DS в 16$разрядом режиме ука$ зывает на сегмент с физическим адресом F0000, в 32$разрядном определяется правилами из следующего раздела. При успешном возврате в BX находится би$ товая карта запросов IRQx, в которой единичное значение бита означает, что дан$ ный вход контроллера прерываний используется исключительно шиной PCI. В буфер помещается последовательный набор структур, описывающих возмож$ ности и назначение прерываний для каждого устройства PCI (табл. 5.2). При возврате в структуре параметров буфера возвращается его реальная длина; если при вызове указан буфер, не вмещающий весь результат, устанавливается код ошибки 89h.

AX = B10Fh назначение линий запроса прерываний (SET_PCI_IRQ). При вызове

вBH задается номер шины, в BL — номер устройства (биты [7:3]) и функции (биты

[2:0]), для которой назначается запрос; в CL указывается вывод (0Ah — INTA#,… 0Dh — INTD#), в CH — желаемый номер IRQx (0…0Fh, причем 0 соответствует от$ ключению INTx# от входов контроллера). Значение DS аналогично предыдущей функции. Если заказанное назначение невозможно, при возврате устанавлива$ ется код ошибки 88h. При использовании данной функции следует выполнять и сопутствующие изменения в конфигурационных регистров всех затрагивае$ мых устройств и их функций (см. главу 3).

Таблица 5.2. Описание опций прерываний для одного устройства PCI

Смещение

Размер

Назначение

0

byte

PCI Bus number — номер шины PCI

1

byte

PCI Device number — номер устройства PCI

2

byte

Назначенная связь для линии INTA# (0 — нет, 1 — IRQ1, …0Fh — IRQ15)

3

word

Битовая карта возможных назначений для INTA# (бит 0 — IRQ0, … бит

 

 

15 — IRQ15)

5

byte

Назначенная связь для линии INTB# (аналогично)

6

word

Битовая карта возможных назначений для INTB# (аналогично)

8

byte

Назначенная связь для линии INTC# (аналогично)

9

word

Битовая карта возможных назначений для INTC# (аналогично)

11

byte

Назначенная связь для линии INTD# (аналогично)

12

word

Битовая карта возможных назначений для INTD# (аналогично)

14

byte

Номер слота (для физической идентификации карты)

15

byte

Резерв

 

 

 

Поиск 32 разрядных сервисов BIOS

32$разрядные сервисы BIOS32 ищутся через каталог 32 разрядных сервисов1. Ад$ рес точки входа в каталог сервисов заранее не известен, но известен способ его нахождения: в диапазоне адресов памяти 0E0000–0FFFFFh в началах параграфов (младшие 4 бита адреса нулевые) ищется строка$сигнатура "_32_" заголовка (число 325F5F33h), за которой следует 32$разрядный физический адрес точки входа в ка$ талог. Точки входа в сами сервисы ищутся через каталог сервисов. Номер, пара$ метры вызываемых функций и результаты передаются на регистрах процессора.

Для поиска сервиса в каталоге 4$байтная строка$идентификатор сервиса заносят$ ся в регистр EAX, в EBX заносится 0 (код функции поиска в каталоге) и выполняет$ ся дальний вызов (CALL FAR) по адресу точки входа в каталог. Результат поиска передается на регистрах: AL = 00h — сервис найден, при этом в EBX — базовый

1 Смотри документ «Standard BIOS 32$bit Service Directory».

адрес сервиса, в ECX — его длина (определяет длину сегмента), EDX — смещение точки входа от начала сервиса (от EBX). Если AL = 81h — сервис не найден.

До попытки использования каталога сервисов следует убедиться в корректности заголовка, проверив его контрольную сумму: накопленная сумма всех байтов заго$ ловка должна быть нулевой. Длина заголовка (в параграфах) указана в байте со смещением 9, в байте 8 — номер ревизии заголовка. Проверка контрольной суммы обязательна, поскольку 4$байтная сигнатура может совпасть с фрагментом программ$ ного кода BIOS (строка _32_ дизассемблируется как POP DI; XOR SI,[BP + SI]).

32$разрядные сервисы вызываются дальними вызовами (CALL FAR), при этом сег$ мент кода CS должен иметь базу в начале 4$килобайтной страницы, в которую по$ падает точка входа, а лимит должен позволять охватывать эту и следующую стра$ ницу1. Сегмент DS должен иметь такую же базу и не меньший лимит. Напомним, что здесь идет речь о физических адресах (после страничного преобразования ли$ нейных).

Expansion ROM карт PCI

В микросхеме ROM BIOS, установленной на системной плате, поддерживаются только стандартные (по назначению и реализации) устройства. При необходимо$ сти дополнительные устройства, устанавливаемые в слоты шин расширения (ISA, PCI, PCMCIA), могут иметь микросхемы ПЗУ своей программной поддержки — Additional ROM BIOS (дополнительные модули ROM BIOS), они же Expansion ROM. Эта необходимость возникает, когда программная поддержка устройств требуется до загрузки ОС и прикладного ПО. Роль Expansion ROM может и не ограничи$ ваться поддержкой данного устройства — в таком модуле может содержаться и вся программа функционирования специализированного бездискового контроллера на базе PC. Расширения ROM BIOS используют графические адаптеры EGA/VGA/ SVGA, некоторые контроллеры жестких дисков, контроллеры SCSI, сетевые адап$ теры с удаленной загрузкой и другие периферийные устройства. Для модулей рас$ ширения устройств с шиной ISA в пространстве памяти зарезервирована область C8000h–F4000h. POST сканирует эту область с шагом 2 Kбайт в поисках допол$ нительных модулей BIOS на завершающем этапе выполнения (после загрузки век$ торов прерываний указателями на собственные обработчики). Дополнительный модуль BIOS графического адаптера (EGA, VGA, SVGA) имеет фиксированный адрес C0000 и инициализируется раньше (на шаге инициализации видеоадапте$ ра). Устройства с шиной PCI в своем конфигурационном пространстве содержат лишь признак использования модуля расширения, а его приписку к адресам памя$ ти назначает POST.

Дополнительный модуль ROM BIOS должен иметь заголовок, выровненный по границе 2$килобайтной страницы памяти, формат заголовка ПЗУ иллюстрирует табл. 5.3.

1 Сегмент может начинаться и на несколько страниц раньше.

Таблица 5.3. Заголовок модуля дополнительного ПЗУ

Смещение

Длина

Назначение

0

2

Сигнатура (признак начала модуля): байт 0=55h, байт 1=AAh

2

1

Длина, указанная в блоках по 512 байт

3

3

Точка входа процедуры инициализации, заканчивающейся дальним

 

 

возвратом Ret Far (вызывается инструкцией Far Call во время

 

 

POST). Обычно здесь располагается 3 байтная инструкция JMP,

 

 

указывающая на начало процедуры

6–17h

 

Резерв

18h

2

Указатель на структуру данных PCI (только для карт PCI)

1Ah

2

Указатель на структуру расширенного заголовка карт ISA PnP

 

 

 

Втрадиционном заголовке присутствовали только первые три поля, указатели на структуры PCI и ISA PnP ввели позже. Корректным считается модуль, начинаю$ щийся с признака AA55h (значения 16$битного слова с учетом порядка байтов) и нулевой суммой (по модулю 256) всех байтов в объявленной области (реальная длина модуля может превышать объявленную, но байт контрольной суммы, есте$ ственно, должен входить в объявленную область).

Вслучае обнаружения корректного модуля POST дальним вызовом (Call Far) вызывает процедуру инициализации модуля, начинающуюся с 3$го адреса заго$ ловка модуля. Ответственность за ее корректность полностью ложится на разра$ ботчика. Процедура может переопределять векторы прерываний, обслуживаемых BIOS. Переопределив на себя вектор Bootstrap (Int 19h), можно получить управ$ ление при загрузке, что и используется, например, для удаленной загрузки компь$ ютеров через локальную сеть (Remote Boot Reset). Если стандартное продолже$ ние процедуры загрузки не требуется, а дополнительный модуль представляет собой, например, управляющую программу для какого$либо оборудования, вмес$ то процедуры инициализации в ПЗУ может находиться и основная программа, не возвращающая управление системной последовательности POST, которая бы вы$ полнила обычную загрузку.

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

Для содержимого ПЗУ расширения BIOS, установленных на картах PCI, принят стандарт, несколько отличающийся от традиционных дополнительных модулей ROM BIOS. Заголовок ПЗУ соответствует традиционному, но дополнительно имеет указатель на структуру данных PCI (табл. 5.4). Идентификаторы произво$ дителя и устройства, а также код класса совпадают с описанными в конфигураци$ онном пространстве устройства PCI. Поскольку шина PCI используется не толь$

ко в PC, в ПЗУ карты может храниться несколько программных модулей. Каждый модуль начинается со структуры данных, сам модуль следует сразу за структурой. За ним начинается структура для следующего модуля (если у предыдущего не ус$ тановлен признак последнего модуля) и т. д. Тип платформы (процессора) указы$ вается в заголовке модуля и при инициализации BIOS активизируется только нуж$ ный. Такой механизм позволяет, например, один и тот же графический адаптер устанавливать и в IBM PC, и в Power PC.

Таблица 5.4. Структура данных PCI

Смещение

Длина, байт

Назначение

0

4

Сигнатура, строка символов «PCIR»

4

2

Идентификатор производителя

6

2

Идентификатор устройства

8

2

Резерв1

Ah

2

Длина структуры (в байтах), начиная с сигнатуры

Ch

1

Версия структуры (0 для данной версии)

Dh

3

Код класса

10h

2

Длина рабочего образа

12h

2

Версия кода/данных

14h

1

Тип кода: 0 — x86 для PC AT, 2 — HP PA RISC

15h

1

Индикатор: 1 — последний образ, 0 — не последний

16h

2

Резерв

 

 

 

Применительно к дополнительному ПЗУ карты PCI имеется три параметра, отно$ сящихся к размерам областей памяти. Размер ПЗУ определяется чтением конфи$ гурационного пространства. Размер, указанный в байте 2 заголовка, указывает на длину модуля на этапе инициализации. Этот модуль POST загружает в ОЗУ пе$ ред тем, как вызвать процедуру инициализации (точка входа со смещением 3). Контрольная сумма, расположенная обычно в конце модуля, обеспечивает нуле$ вую сумму всех байтов. Длина рабочего образа, указанная в структуре данных PCI (слово со смещением 10h), описывает размер области, которая должна постоянно оставаться в памяти в режиме нормального функционирования (она может быть меньше указанной в байте 2 заголовка, поскольку код процедуры инициализации уже не требуется). Эта область также защищается контрольной суммой.

Работа с модулями ПЗУ для карт PCI выполняется в соответствии с моделью DDIM (Device Driver Initialization Model — модель инициализации драйвера устройств). POST определяет наличие ПЗУ по полю Expansion ROM Base Address в конфи$ гурационном пространстве устройства, обнаруженного на карте, и назначает ему

1До спецификации PCI 2.2 здесь помещался указатель на строку Vital Product Data (важные сведения о продукте).