Книга: Аппаратные интерфейсы ПК. Энциклопедия

6.1.8. Спецификация Plug and Play для шины ISA

6.1.8. Спецификация Plug and Play для шины ISA

Аппаратно-программную спецификацию «Plug and Play ISA Specification» выпустили компании Intel и Microsoft в 1994 г. Она обеспечивает решение задач изоляции карт ISA, программного распределения системных ресурсов, конфигурирования и передачи параметров операционной системе и прикладному ПО. Вышеперечисленные задачи решаются для карт PnP, которые могут работать и в окружении так называемых традиционных карт (Legacy Cards). Поскольку описание программной части этой спецификации достаточно объемно и выходит за рамки данной книги, рассмотрим принципы реализации PnP в основном с точки зрения аппаратных средств.

Конфигурирование в системе PnP состоит из следующих шагов.

1. Производится изоляция одной карты от всех остальных.

2. Карте назначается номер CSN (Card Select Number — селективный номер карты), фигурально выражаясь, «приделывается ручка» (Assign a handle), за которую ее можно «ухватить» дальнейшим командам PnP.

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

4. Производится распределение (арбитраж) системных ресурсов, выделяемых каждой карте.

5. Каждая карта конфигурируется согласно выбранному распределению ресурсов и активируется (переводится в рабочий режим).

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

Для конфигурирования карт PnP необходимо всего три 8-битных системных порта (табл. 6.7), с которыми процессор может общаться, применяя инструкции ввода-вывода с однобайтной передачей данных. Карты PnP должны использовать 12-битное декодирование адреса ввода-вывода, а не 10-битное, как это принято в традиционных картах ISA.

Таблица 6.7. Системные порты ISA PnP

Имя порта Адрес Тип доступа
ADDRESS 0279h (Printer status port) Только запись
WRITE_DATA 0A79h (Printer status port + 0800h) Только запись
READ_DATA Перемещаемый в диапазоне 0203h-03FFh Только чтение

Порт ADDRESS используется для адресации регистров PnP — в него записывают индекс требуемого регистра (см. ниже пункт «Конфигурирование карт») перед обращением к портам WRITE_DATA и READ_DATA. Этот же порт используется и для записи последовательности кодов ключа инициализации. Выбор адреса для него обусловлен тем, что ни одна разумно сделанная карта расширения не будет пытаться задействовать для записи адрес регистра состояния стандартного LPT-порта.

Порты WRITE_DATA и READ_DATA используются для обмена данными с регистрами PnP. Адрес порта WRITE_DATA традиционными картами с 10-битным декодированием будет восприниматься как тот же адрес, что и у предыдущего порта, так что конфликт опять-таки исключен. Перемещаемому адресу порта READ_DATA программное обеспечение PnP во время исполнения протокола изоляции может легко найти бесконфликтное положение. Адрес этого порта сообщается всем картам записью в их управляющий регистр PnP.

Вышеперечисленные три порта используются только для конфигурирования и управления картами PnP. Для взаимодействия прикладных программ с функциональными устройствами карты используются иные ресурсы, выделенные карте (порты, области памяти, прерывания и каналы DMA). По включению питания или аппаратному сбросу карты настраиваются на стандартную рабочую конфигурацию, принятую для них по умолчанию (она может храниться в энергонезависимой памяти или задаваться джамперами). Это обязательно, по крайней мере для устройств, участвующих в загрузке, — ввод, вывод (экран) и собственно загрузочное устройство. Остальные устройства могут быть и логически отключенными от шины, до тех пор пока они не будут сконфигурированы программными средствами PnP. Карта PnP должна сообщать обо всех используемых ею ресурсах и, по возможности, предлагать альтернативные конфигурирования. Она обязана подчиняться конфигурационным командам PnP, включая команду деактивации (логического отключения от шины); при невозможности принять указанную конфигурацию карта (или ее логическое устройство) должна отключаться. Строгое выполнение данных требований всеми картами делает возможным работу системы PnP на неприспособленной для этого шине ISA. Непременным условием работоспособности является и уникальность идентификаторов карт (см. ниже).

В плане PnP каждая карта может находиться в одном из четырех состояний.

Wait for key (ожидание ключа) — состояние нормального функционирования (или отключения) логических устройств. В это состояние устройство входит при включении питания, по аппаратному сбросу и по завершению его конфигурирования системой PnP. До подачи ключа в этом состоянии конфигурация карты программными обращениями изменена быть не может.

Sleep («спячка») — состояние, в котором карта ожидает пробуждающей команды Wake[CSN], переводящей ее либо в состояние изоляции, либо в состояние конфигурирования. При нулевом параметре CSN в команде все карты с неназначенным номером CSN переводятся в состояние изоляции. При ненулевом параметре CSN в команде карта с совпадающим номером CSN переводится в состояние конфигурирования.

Isolation (изоляция) — карта отвечает только на чтение регистра Serial Isolation для реализации одноименного протокола (см. далее), с помощью которого ей назначается уникальный номер CSN. Остальные команды PnP ей недоступны.

Config (конфигурирование) — состояние, в котором карта отвечает на все об ращения к регистрам PnP, позволяя считывать и изменять ее конфигурацию. В этом состоянии может находиться лишь одна карта. По окончании конфигурирования карту переводят в режим ожидания ключа, защищая ее конфигурацию.

Протокол изоляции

Для изоляции карт друг от друга имеется специальный режим работы, в который логика PnP переводится с помощью ключа инициализации (Initiation key). Ключ представляет собой предопределенную последовательность записей в порт ADDRESS (279h). Аппаратная логика карты, проверяющая ключ, основана на сдвиговом регистре с обратными связями LFSR (Linear Feedback Shift Register), схема которого приведена на рис. 6.5. Во время проверки ключа на вход C1 подается уровень логического нуля, а на вход C2 — стробы записи в порт ADDRESS. Логика, не показанная на рисунке, сравнивает код в сдвиговом регистре с текущей записью и при несовпадении сбрасывает регистр LFSR в исходное состояние (код 6Ah). В это же состояние регистр может быть переведен двумя последовательными записями нулей в порт ADDRESS. Сдвиг в регистре происходит при каждой записи в порт ADDRESS. Если ключ (последовательность из 32 записей требуемых байт) из исходного состояния LFSR будет приложен верно, то после последней записи логика карты перейдет в режим конфигурирования (это еще не состояние config) и подготовится к отработке протокола изоляции. Точная последовательность байт ключа в hex-формате выглядит следующим образом:

6А, B5, DA, ED, F6, FB, 7D, BE, DF, 6F, 37, 1B, 0D, 86, C3, 61, B0, 58,
2С, 16, 8В, 45, A2, D1, E8, 74, 3A, 9D, СЕ, E7, 73, 39


Рис. 6.5. Сдвиговый регистр LFSR карты PnP

Протокол изоляции основан на уникальном последовательном идентификаторе (Serial Identifier), хранящемся в памяти каждой карты PnP. Этот идентификатор представляет собой ненулевое 72-битное число, состоящее из двух 32-битных полей и 8-битного контрольного кода, вычисляемого с помощью того же регистра LFSR. Первое 32-битное поле представляет собой идентификатор производителя. Второе поле назначается производителем и уникально для каждого экземпляра всех выпускаемых им карт. Здесь может присутствовать серийный номер, а для адаптера Ethernet это может быть и частью MAC-адреса. Принцип построения последовательного идентификатора гарантирует, что в одной системе не могут встретиться две карты с совпадающими идентификаторами. Однако случалось, что незадачливые производители тиражировали (свои ли?) устройства, копируя всю «начинку», включая и серийные номера. Доступ к идентификатору осуществляется последовательно, начиная с бита 0 нулевого байта идентификатора производителя и заканчивая битом 7 контрольной суммы. Во время передачи идентификатора на вход C1 схемы LFSR поступают текущие биты идентификатора, а на вход C2 подаются стробы чтения регистра Serial Isolation (см. ниже). В тактах передачи контрольной суммы ее биты берутся с выхода сдвигового регистра.

Протокол изоляции может быть программно инициирован в любой момент времени посылкой корректного ключа инициализации, переводящего все карты в конфигурационный режим. В этом режиме каждая карта ожидает 72 пары операций чтения порта READ_DATA. Ответ каждой карты на эти операции определяется значением очередного бита ее последовательного идентификатора.

Если текущий бит идентификатора карты имеет единичное значение, то ее буфер шины данных в первом чтении пары выводит на шину данных значение 55h. Если текущий бит нулевой, то буфер работает на чтение шины данных и логика карты анализирует ответ других карт — проверяет наличие комбинации «01» в битах D[1:0] (младшие биты числа 55h). В следующем цикле чтения пары карта с единичным битом выводит число AAh, а карта с нулевым текущим битом проверяет наличие комбинации «10».

Если карта, просматривающая вывод данных другими картами, обнаружила корректные коды в обоих циклах чтения пары, она в данной итерации изоляции исключается.

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

Эта последовательность выполняется для всех 72 бит идентификатора. В конце процесса останется лишь одна карта. Записью в управляющий регистр PnP (индекс 06) ей назначается селективный номер CSN, по которому она будет использоваться в дальнейших операциях. Карта с назначенным номером CSN в следующих итерациях протокола изоляции не участвует (на пары чтений не отвечает).

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

Программа конфигурирования проверяет данные, возвращаемые во время всех пар циклов чтения, и побитно собирает прочитанный идентификатор. Если в паре приняты байты 55h и AAh, то соответствующий бит считается единичным, в других случаях он считается нулевым. При приеме идентификатора программа подсчитывает контрольную сумму и сравнивает ее с принятой. Несовпадение контрольной суммы или отсутствие среди принятых байт 55h и AAh указывает на то, что выбранный адрес порта READ_DATA конфликтует с каким-либо устройством. Тогда программа пробует произвести итерацию, переместив адрес порта READ_DATA в допустимом диапазоне адресов. Если при переборе нескольких возможных адресов не удается считать корректный идентификатор, то принимается решение об отсутствии карт PnP в системе (вообще или с неназначенными номерами CSN).

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

Итак, по завершении протокола изоляции программное обеспечение имеет список идентификаторов обнаруженных карт и присвоенных им селективных номеров, сообщенных и самим картам. Далее общение программы с каждой картой идет по ее селективному номеру CSN, фигурирующему в командах PnP. Нулевой CSN присваивается картам по программному или аппаратному сбросу и используется как широковещательный адрес.

Конфигурирование карт

Конфигурирование карт выполняется обращениями к регистрам PnP. Обращения к регистрам PnP представляют собой операции записи или чтения портов ввода-вывода по адресам WRITE_DATA или READ_DATA соответственно. При этом для указания конкретного регистра PnP используется индекс — номер этого регистра, предварительно записанный в регистр ADDRESS.

Каждая карта имеет стандартный набор регистров PnP, причем часть из них относится к карте в целом, а часть — к каждому логическому устройству, входящему в карту. Архитектура PnP поддерживает концепцию многофункциональности, согласно которой каждая карта может включать в себя несколько логических устройств. В любой момент времени в индексном пространстве регистров PnP отображаются стандартные регистры управления картой (см. ниже) и регистры только одного логического устройства (рис. 6.6). Выбор логического устройства, с которым производится общение, осуществляется записью в регистр Logical Device Number, входящий в группу управляющих регистров карты.


Рис. 6.6. Конфигурационные регистры PnP (* — определяется разработчиком)

Все логические устройства карт PnP должны обеспечивать, по крайней мере, минимальную функциональность:

? регистры ресурсов при чтении должны отражать фактические текущие на стройки;

? бит активации при чтении должен отражать реальное состояние активности устройства на шине ISA;

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

Для адресации к карте и ее логическим устройствам, а также для чтения конфигурационной информации используются стандартные регистры управления картой (табл. 6.8).

Таблица 6.8. Стандартные регистры управления картой PnP

Имя Индекс и тип Назначение
Set RD_DATA Port 00H, WO Установка адреса порта для чтения. Биты [7:0] задают значение бит [9:2] адреса порта READ_DATA. Только для записи
Serial Isolation 01h, RO Чтение этого регистра в состоянии Isolation приводит к побитному анализу идентификатора
Config Control 02h, WO Бит [2] — сброс CSN в 0. Бит [1] — возвращение в состояние Wait for Key. Бит [0] — сброс всех логических устройств и перевод конфигурационных регистров в состояние включения питания, но с сохранением номера CSN. Биты не запоминаются, так что необходимости в их программном сбросе нет
Wake[CSN] 03h, WO Запись в этот регистр приведет карту, у которой номер CSN совпадает с записываемым байтом, к переходу из состояния Sleep в состояние Config (если данные не нулевые). Запись нулевого байта переводит все карты с неназначенным номером CSN в состояние Isolation. Указатель последовательно считываемых байт сбрасывается
Resource Data 04h, RO Чтение этого регистра возвращает очередной байт информации о ресурсах. Перед чтением должен опрашиваться регистр Status
Status 05h, RO Регистр состояния. Единичное значение бита [0] указывает на возможность чтения очередного байта ресурсов
Card Select Number 06h, RW Регистр хранения селективного номера CSN, обеспечивающего выбор конкретной карты командой Wake[CSN]. Обнуляется по включению питания и аппаратному сбросу
Logical Device Number 07h, RW Выбор текущего логического устройства, к которому относятся все операции по обмену конфигурационной информацией, проверки диапазона адресов ввода-вывода и активации. Если карта имеет только одно устройство, регистр допускает только чтение и всегда имеет нулевое значение
Card Level Резерв 08h-1Fh Зарезервированы на будущее
Card Level, Vendor Defined 20h-2Fh Используются по усмотрению производителя

Конфигурирование карты начинается с команды WAKE[CSN] — записи байта CSN в регистр с индексом 3. Эта операция переводит карту с указанным номером CSN в состояние Config (конфигурирование), а остальные карты «засыпают» — переходят в состояние Sleep. Для конфигурируемой карты выполняются операции чтения ее конфигурационной информации (как карты в целом, так и логических устройств) и программирования используемых ресурсов. Программирование каждого логического устройства завершается установкой его бита активации, после чего логическое устройство активизируется на шине ISA (начнет реально использовать назначенные ресурсы). Программирование всей карты завершается переводом ее в состояние Wait for key (ожидание ключа). По окончании конфигурирования все карты PnP должны быть переведены в это состояние, и тогда их случайное реконфигурирование будет блокировано 32-байтным ключом.

Доступ к регистрам PnP через ключ возможен в любое время функционирования, однако запись в них должна производиться в полной уверенности о знании последствий. Возможно даже переназначение CSN «на ходу», но это требуется лишь в устройствах, допускающих «горячие» включения-выключения (что не приветствуется на шине ISA), док-станциях (Docking Stations) для подключения портативных компьютеров и системах управления энергопотреблением.

Стандартные регистры управления логическим устройством (табл. 6.9) используются для активации карт и проверки отсутствия конфликтов на шине ISA в выбранном диапазоне адресов ввода-вывода. Когда включен режим проверки конфликтов, на чтение по любому адресу установленного диапазона портов ввода-вывода логическое устройство отвечает байтом 55h или AAh в зависимости от состояния бита 0 регистра проверки. Естественно, что в рабочем режиме этот «автоответчик» должен быть отключен.

Таблица 6.9. Стандартные регистры управления логическим устройством PnP

Имя Индекс и тип Назначение
Activate 30h, RW Регистр активации. Бит [0] единичным значением разрешает активность логического устройства на шине ISA. Биты [7:1] зарезервированы, при чтении должны возвращать нули. Перед активацией должна быть запрещена проверка диапазона адресов ввода-вывода
I/O Range Check 31h, RW Регистр проверки диапазона адресов ввода-вывода. Биты [7:2] зарезервированы, при чтении должны возвращать нули. Бит [1] — разрешение режима проверки. Бит [0] — управление диагностическим ответом: 0 — ответ AAh, 1 — ответ 55h
Logical Device Control Резерв 32h-37h Зарезервированы на будущее
Logical Device Control Vendor Defined 38h-3Fh Используются по усмотрению производителя

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

Обычные 24-битные (4) или 32-битные (4) дескрипторы памяти. Для неиспользуемого дескриптора памяти его поля базового адреса и длины должны быть нулевыми. Одна карта не может одновременно задействовать обычные (24-битные) и 32-битные дескрипторы памяти.

Дескрипторы областей портов ввода-вывода (8). Для неиспользуемого дескриптора портов ввода-вывода его поле базового адреса должно быть нулевым. Размер области адресов определяется в блоке данных, считанном из регистра Resource Data.

Дескрипторы запросов прерываний (2). Неиспользуемый селектор запроса прерывания должен быть нулевым (поскольку нулевой номер запроса недопустим — занят системным таймером). Для линии IRQ2/9 шины ISA применяют номер 9.

Дескрипторы каналов прямого доступа к памяти. Неиспользуемый дескриптор канала прямого доступа должен иметь значение 4 (этот канал недоступен, по скольку задействован для каскадирования контроллеров).

Назначение регистров дескрипторов и их положение в индексном пространстве PnP раскрывает табл. 6.10.

Таблица 6.10. Регистры дескрипторов системных ресурсов логических устройств PnP

Индекс и тип Назначение
40h-5Fh — обычные (24-битные) дескрипторы памяти
40h, RW Дескриптор памяти 0: базовый адрес памяти, биты [23:16]
41h, RW Дескриптор памяти 0: базовый адрес памяти, биты [15:8]
42h, RW Дескриптор памяти 0: управление. Бит [1] — режим обращения: 0–8 бит, 1 — 16 бит. Бит [0] (RO) — способ задания диапазона: 0 — следующее поле воспринимается как маска адреса, 1 —как старший адрес
43h, RW Дескриптор памяти 0: маска или максимальный адрес области, биты [23:16]. Единичное значение бита в маске указывает, что соответствующий бит адреса участвует в дешифрации адреса области памяти (старшие биты); нулевое — бит адреса используется для адресации в пределах выделенной области)
44h, RW Дескриптор памяти 0: маска или максимальный адрес области, биты [15:8]
45h-47h Заполнитель (зарезервировано)
48h-4Ch Дескриптор памяти 1 (аналогично предыдущему)
4Dh-4Fh Заполнитель (зарезервировано)
50h-54h Дескриптор памяти 2 (аналогично предыдущему)
55h-57h Заполнитель (зарезервировано)
58h-5Ch Дескриптор памяти 3 (аналогично предыдущему)
5Dh-5Fh Заполнитель (зарезервировано)
60h-6Fh — дескрипторы пространства ввода-вывода
60h, RW Дескриптор портов 0: базовый адрес, биты [15:8]. Если логическое устройство использует только 10-битное декодирование адреса, биты [15:10] могут игнорироваться
61h, RW Дескриптор портов 0: базовый адрес, биты [7:0]
62h-63h, RW Дескриптор портов 1 (аналогично предыдущему)
64h-65h, RW Дескриптор портов 2 (аналогично предыдущему)
66h-67h, RW Дескриптор портов 3 (аналогично предыдущему)
68h-69h, RW Дескриптор портов 4 (аналогично предыдущему)
6Ah-6Bh, RW Дескриптор портов 5 (аналогично предыдущему)
6Ch-6Dh, RW Дескриптор портов 6 (аналогично предыдущему)
6Eh-6Fh, RW Дескриптор портов 7 (аналогично предыдущему)
70h-73h — дескрипторы запросов прерываний
70h, RW Селектор запроса прерывания 0. Биты [3:0] задают номер IRQ для Interrupt 0
71h, RW Тип сигнала запроса прерывания 0. Бит[1] — активный уровень: 1 — высокий, 0 — низкий. Бит[0] — тип: 1 — уровень, 0 — перепад. Если карта поддерживает только один тип сигнала, регистр может быть типа RO
72h, 73h RW Селектор и тип запроса прерывания 1 (аналогично предыдущему)
74h-75h — дескрипторы каналов прямого доступа
74h, RW Селектор 0 канала DMA. Биты [2:0] задают номер используемого канала (001 — DMA0…, 111 — DMA7)
75h, RW Селектор 1 канала DMA (аналогично предыдущему)
76h-A8h — 32-битные дескрипторы памяти
76h, RW 32-битный дескриптор памяти 0: базовый адрес памяти, биты [31:24]
77h, RW 32-битный дескриптор памяти 0: базовый адрес памяти, биты [23:16]
78h, RW 32-битный дескриптор памяти 0: базовый адрес памяти, биты [15:8]
79h, RW 32-битный дескриптор памяти 0: базовый адрес памяти, биты [7:0]
7Ah, RW 32-битный дескриптор памяти 0: управление. Биты [7:3] — зарезервированы, при чтении должны возвращать нули. Биты [2:1] — управление доступом: 00 — 8-битная память, 01 — 16-битная память, 10 — зарезервировано, 11 — 32-битная память. Бит [0] (RO) — способ задания диапазона: 0 — следующее поле воспринимается как размер области, 1 — следующее поле воспринимается как старший адрес
7Bh, RW 32-битный дескриптор памяти 0: размер или старший адрес области, биты [31:24]
7Ch, RW 32-битный дескриптор памяти 0: размер или старший адрес области, биты [23:16]
7Dh, RW 32-битный дескриптор памяти 0: размер или старший адрес области, биты [15:8]
7Eh, RW 32-битный дескриптор памяти 0: размер или старший адрес области, биты [7:0]
7Fh Заполнитель (зарезервировано)
80h-88h 32-битный дескриптор памяти 1
89h-8Fh Заполнитель (зарезервировано)
90h-98h 32-битный дескриптор памяти 2
99h-9Fh Заполнитель (зарезервировано)
A0h-A8h 32-битный дескриптор памяти 3

Дескрипторы требуемых ресурсов (данные о возможных конфигурациях логических устройств) могут быть считаны последовательно байт за байтом из регистра Resource Data и использованы для конфигурирования устройств, которое выполняется через регистры, перечисленные в табл. 6.10. Считываться будут данные из карты, находящейся в состоянии config. Если регистр считывается сразу после «победы» карты в протоколе изоляции, считывание начинается с дескриптора версии PnP. Если считывание начинается для карты после ее «пробуждения» командой Wake[CSN], сначала будут считаны 8 байт уникального идентификатора, затем байт контрольного кода, который будет недействительным, поскольку генерируется аппаратно регистром LFSR во время побитного считывания идентификатора. Только после этого начнется считывание дескрипторов ресурсов. Порядок считывания дескрипторов существенен — именно в этом порядке должны программироваться регистры дескрипторов ресурсов карты PnP. Последовательность считывания дескрипторов для каждого логического устройства завершается признаком завершения области дескрипторов.

Считав все дескрипторы всех устройств, программа, выполняющая конфигурирование PnP, получает исчерпывающую информацию об устройствах и их потребностях. После этого она пытается найти бесконфликтную конфигурацию для всех устройств, с учетом потребностей установленных устройств, не относящихся к устройствам PnP. В соответствии с принятым планом она конфигурирует все устройства, а те, которым не удается выделить ресурсы, отключает. Данные о принятых настройках передаются «заинтересованному» ПО программным способом.

Оглавление книги


Генерация: 0.031. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз