Главная » Ассемблер, Железо » Функции PCI BIOS

0

Поскольку конфигурационное пространство не имеет привязки к какой-либо определенной области адресного пространства компьютера, доступ к нему связан с определенными трудностями. С целью упрощения работы с устройствами PCI в BIOS персональных компьютеров были внесены специальные дополнительные функции. Доступ к функциям PCI BIOS при 16-разрядном вызове выполняется через функцию Blh прерывания lAh. Для 32-разрядных вызовов используется 32-разрядная точка входа защищенного режима. используют регистры процессора для передачи аргументов и получения результатов. При успешном выполнении

функции флаг переноса CF сбрасывается в 0, в случае неудачи — устанавливается в 1.

Прерывание 1Ah, функция В101И: проверить присутствие PCI BIOS в системе

Для проверки присутствия PCI BIOS в системе по прерыванию lAh вызывается функция BlOlh.

Перед вызовом прерывания lAh требуется занести в регистр АХ код OBlOlh.

После выполнения функции в регистрах будут размещены следующие значения:

•       в EDX — сигнатура «РС1» («Р» — в DL, «С» — в DH и т. д., в старшем байте — пробел);

•       в АН — признак присутствия (0 — BIOS присутствует, если в EDX правильная сигнатура; любое другое значение — PCI BIOS отсутствует);

•       в AL — аппаратный механизм;

•       в ВН — номер версии интерфейса PCI (в двоично-десятичном коде);

•       в BL — подномер версии интерфейса (в двоично-десятичном коде);

•       в CL — номер последней шины PCI в системе (счет номеров начинается с нуля).

На рисунке 3.2 показан формат байта-описателя аппаратного механизма шины: информация, возвращенная в регистре AL, показывает,

Флаг CF также будет содержать признак наличия PCI BIOS (0 — BIOS присутствует, 1 — отсутствует).

Рис. 3.2. Формат байта-описателя аппаратного механизма шины PCI

какие механизмы функционирования шины PCI реализованы в данной аппаратуре. Спецификация PCI определяет два аппаратных механизма для доступа к конфигурационному пространству. Механизм 1 поддерживается, если установлен бит 0, механизм 2 — если установлен бит 1. Спецификация PCI определяет также механизмы генерации специальных циклов. Бит 4 установлен, если аппаратура может выполнять генерацию специальных циклов на основе механизма 1, бит 5 установлен, если аппаратура может выполнять генерацию специальных циклов на основе механизма 2. Биты 2, 3, 6 и 7 зарезервированы и должны быть равны нулю.

Прерывание 1Ah, функция В102И: найти устройство PCI заданного типа

Для поиска устройства PCI заданного типа по прерыванию lAh вызывается функция B102h.

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

•           в АХ – код 0B102h;

•           в СХ — идентификатор устройства (число от 0 до 65535);

•           в DX — идентификатор изготовителя (от 0 до 65534);

•       в SI — индекс (порядковый номер) устройства заданного типа (от 0 доЫ).

После выполнения функции в регистрах будут размещены следующие значения:

•       в ВН — номер шины, к которой подключено устройство (от О ДО 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•       в АН — код возврата (может принимать значения BAD_ VEND0R_ID, DEVICE_NDT_FDUND и SUCCESFUL);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Если необходимо найти все устройства данного типа, то в SI заносится 0. После каждого выполнения функции значение SI надо увеличивать на 1, пока не будет получен код возврата DEVICE_NDT_FDUND (устройство не обнаружено).

Прерывание 1Ah, функция В103И: найти устройство PCI заданного класса

Для поиска устройства PCI заданного класса по прерыванию lAh вызывается функция B103h.

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

•            в АХ – код 0B103h;

•           в ЕСХ — код класса (в младших трех байтах);

•       в SI — индекс (порядковый номер) устройства заданного класса (от 0 до N).

После выполнения функции в регистрах будут размещены следующие значения:

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•       в АН — код возврата (может принимать значения DEVICE_NOT_FOUND и SUCCESFUL);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Если необходимо найти все устройства данного класса, то в SI заносится 0. После каждого выполнения функции значение SI надо увеличивать на 1, пока не будет получен код возврата DEVICE_NOT_FDUND (устройство не обнаружено).

Прерывание 1Ah, функция В106И: генерировать специальный цикл шины

Для генерации специального цикла шины по прерыванию lAh вызывается функция B106h.

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

•           в АХ – код 0B106h;

•       в ВН — номер шины, к которой подключено устройство (от 0 до 255);

•           в EDX — данные специального цикла.

После выполнения функции в регистрах будут размещены следующие значения:

•       в АН — код возврата (может принимать значения SUCCESFUL и FUNC_ NDT_SUPPDRTED);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Прерывание 1Ah, функция В108И: прочитать байт из конфигурационного пространства заданного устройства

Для считывания байта из конфигурационного пространства заданного устройства по прерыванию lAh вызывается функция B108h.

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

•            в АХ – код 0B108h;

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•           в DI — порядковый номер байта (от 0 до 255).

После выполнения функции в регистрах будут размещены следующие значения:

•            в CL — считанный байт;

•       в АН — код возврата (может принимать значения SUCCESFUL и BAD_ REGISTER_NUMBER);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Прерывание 1Ah, функция В109И: прочитать слово из конфигурационного пространства заданного устройства

Для считывания слова из конфигурационного пространства заданного устройства по прерыванию lAh вызывается функция B109h. Перед вызовом прерывания требуется занести в регистры необходимые значения.

Значения, которые требуется занести в регистры:

•           в АХ – код 0B109h;

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•       в DI — смещение слова в конфигурационном пространстве (0, 2, 4,…,254).

После выполнения функции в регистрах будут размещены следующие значения:

•           в СХ — считанное слово;

•       в АН — код возврата (может принимать значения SUCCESFUL и BAD_REG I STER_NUMBER);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Прерывание 1Ah, функция В10АИ: прочитать двойное слово из конфигурационного пространства заданного устройства

Для считывания двойного слова из конфигурационного пространства заданного устройства по прерыванию lAh вызывается функция BlOAh.

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

•           в АХ – код OBlOAh;

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•       в DI — смещение двойного слова в конфигурационном пространстве (0,4, 8, …,252).

После выполнения функции в регистрах будут размещены следующие значения:

•           в ЕСХ — считанное двойное слово;

•       в АН — код возврата (может принимать значения SUCCESFUL и BAD_REGISTER_NUMBER);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Прерывание 1Ah, функция В10ВИ: записать байт в конфигурационное пространство заданного устройства

Для записи байта в конфигурационное пространство заданного устройства по прерыванию lAh вызывается функция BlOBh. Перед вызовом прерывания требуется занести в регистры следующие значения:

•       в АХ – код OBlOBh;

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•       в DI — порядковый номер байта (от 0 до 255);

•       в CL — записываемый байт.

После выполнения функции в регистрах будут размещены следующие значения:

•       в АН — код возврата (может принимать значения SUCCESFUL и BAD_ REGISTER_NUMBER);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Прерывание 1Ah, функция B10Ch: записать слово в конфигурационное пространство заданного устройства

Для записи слова в конфигурационное пространство заданного устройства по прерыванию lAh вызывается функция BlOCh.

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

•       в АХ – код OBlOCh;

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•       в DI — смещение слова в конфигурационном пространстве (0, 2, 4,…,254).

•           в СХ — записываемое слово.

После выполнения функции в регистрах будут размещены следующие значения:

•       в АН — код возврата (может принимать значения SUCCESFUL и BAD_REGISTER_NUMBER);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Прерывание 1Ah, функция B10Dh: записать двойное слово в конфигурационное пространство заданного устройства

Для записи двойного слова в конфигурационное пространство заданного устройства по прерыванию lAh вызывается функция BlODh. Перед вызовом прерывания требуется занести в регистры следующие значения:

•           в АХ — код OBlODh;

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•       в DI — смещение двойного слова в конфигурационном пространстве (0,4,8, …,252).

•           в ЕСХ — записываемое двойное слово.

После выполнения функции в регистрах будут размещены следующие значения:

•       в АН — код возврата (может принимать значения SUCCESFUL и BAD_REG I STER_NUMBER, см. табл. 3.1);

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Прерывание 1Ah, функция B10Eh: получить опции маршрутизации прерываний PCI

Для получения опций маршрутизации прерываний PCI на системной плате и битовой карты прерываний IRQ, выделенных устройствам PCI в исключительное пользование, по прерыванию lAh вызывается функция BlOEh.

Перед вызовом прерывания lAh требуется занести в регистры следующие значения:

•       в АХ — код OBlOEh;

•       в BX — значение 0;

•       в DS — сегмент или селектор для данных BIOS;

•       в ES — сегмент или селектор буфера маршрутизации;

•       в DI (при использовании 32-разрядной адресации — в EDI) — смещение буфера маршрутизации.

После выполнения функции в регистрах будут размещены следующие значения:

•       в АН — код возврата (может принимать значения SUCCESFUL, BUFFER_TO_SMALL и FUNK_N0T_SUPP0RTED);

•       в BX — битовая карта прерываний IRQ, выделенных устройствам PCI в исключительное пользование;

•       в CF — статус возврата (0 — функция успешно выполнена, 1 — ошибка).

Адрес, задаваемый сегментом и смещением буфера маршрутизации, должен указывать на структуру следующего вида:

typedef struct {

WORD BufferSize: BYTE FAR * DataBuffer: } IRQRoutingOptionsBuffer;

Поля структуры IRQRoutingOptionsBuffer имеют следующее назначение:

•       BufferSize — размер буфера данных в байтах;

•       DataBuffer — дальний указатель на буфер данных, выделенный для приема информации обо всех встроенных устройствах PCI и всех слотах расширения PCI на системной плате.

После успешного выполнения функции OBlOEh для каждого размещенного на системной плате устройства PCI и каждого слота

расширения PCI в буфере данных будет размещено по одному 16-байтному элементу. Структура элемента таблицы маршрутизации прерываний PCI показана в табл. 3.1.

Таблица 3.1. Структура элемента таблицы маршрутизации прерываний PCI

Смещение

Размер

Описание

0

BYTE

Номер шины PCI, к которой подключено устройство

1

BYTE

Номер устройства (в старших пяти битах)

2

BYTE

Код соединения для INTA#

3

WORD

Битовая карта IRQ для INTA#

5

BYTE

Код соединения для INTB#

6

WORD

Битовая карта IRQ для INTB#

8

BYTE

Код соединения для INTC#

9

WORD

Битовая карта IRQ для INTC#

11

BYTE

Код соединения для INTD#

12

WORD

Битовая карта IRQ для INTD#

14

BYTE

Номер слота PCI

15

BYTE

Зарезервирован

Каждой линии прерывания, выведенной на слот PCI, в элементе таблицы маршрутизации прерываний PCI соответствует два поля.

•      Код соединения позволяет определить, какие линии прерываний соединены между собой проводниками на плате: значение кодов соединения не стандартизировано, но для соединенных между, собой линий значение кодов совпадает. Если код соединения равен нулю, то данный контакт не подключен к контроллеру прерываний.

•      Битовая карта IRQ показывает, к каким из линий IRQ может быть подсоединена данный контакт разъема. Каждой линии IRQ соответствует один разряд битовой карты (бит 0 — IRQ0, бит 1 — IRQ1 и т. д.): если разряд сброшен в 0, то подключение невозможно, а если установлен в 1 — возможно.

Номер слота, указанный в конце элемента таблицы маршрутизации прерываний, показывает, чему соответствует данный элемент: встроенному устройству или слоту расширения. Для встроенных устройств значение номера слота равно нулю, а нумерация слотов расширения соответствует порядку их размещения на системной

плате, но не обязательно начинается с единицы (при выполнении нумерации могут учитываться слоты ISA).

Прерывание 1Ah, функция B10Fh: присвоить устройству номер прерывания

Данная функция позволяет присвоить устройству определенный номер прерывания IRQ. Функция предназначена для конфигурирования оборудования в процессе загрузки операционной системы и не должна использоваться в драйверах и прикладных программах. Перед вызовом прерывания lAh требуется занести в регистры следующие значения:

•           в АХ – код OBlOFh;

•       в CL – код контакта на разъеме PCI (INTA# – OAh, INTB# – OBh, INTC# – OCh, INTD# – ODh);

•           в CH — номер линии IRQ (может принимать значения от 0 до 15);

•       в ВН — номер шины, к которой подключено устройство (от О до 255);

•       в BL — номер устройства в старших пяти битах и номер функции в трех младших;

•           в DS — сегмент или селектор для данных BIOS.

После выполнения функции в регистрах будут размещены следующие значения:

•       в АН — код возврата (может принимать значения SUCCESFUL, SET_ FAILED и FUNK_NOT_SUPPORTED>;

•       в CF — статус возврата (0 — функция успешно выполнена, 1 ошибка).

Расшифровка значения кодов возврата приведена в табл. 3.2.

Таблица 3.2. Список кодов возврата

Код возврата

Значение в АН

Расшифровка

SUCCESFUL

OOh

Операция успешно выполнена

FUNC NOT SUPPORTED

81h

Функция не поддерживается

 

 

данным устройством

BAD VENDOR ID

83h

Неверный идентификатор

 

 

изготовителя

DEVICE_NOT_FOUND

86h

Устройство не найдено

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

Код возврата

Значение в АН

Расшифроака

BAD_REGISTER_NUMBER

87h

Некорректное значение индекса

SET_FAILED

88h

Операция переустановки номе

 

 

ров прерываний не выполнена

BUFFER ТОО SMALL

89h

Недостаточный объем буфера

С точки зрения программиста, особый интерес представляют подфункции Olh (проверка наличия PCI BIOS), 02h (найти устройство заданного типа), 03h (найти устройство заданного класса) и 08h-0Ah (прочитать данные из конфигурационного пространства устройства). Проверять наличие PCI BIOS нужно при запуске программы: если его нет, то нет и возможности использовать относящиеся к нему функции. Проверку наличия в системе нужного устройства и определение его координат на шине PCI (номера шины, номера устройства и функции) также следует выполнять при запуске программы. После обнаружения устройства становится доступной для считывания вся информация из его конфигурационного пространства.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии