Наиболее распространенными для подключения карт расширения PC являются шины ISA и PSI. В шину PSI заложены возможности автоматического конфигурирования установленных адаптеров. Спецификация шины ISA требует, чтобы всем картам назначались свои системные ресурсы – области адресов в пространствах памяти и ввода/вывода, линии запросов прерываний и каналы прямого доступа к памяти. При этом по используемым ресурсам платы не должны конфликтовать. Шина ISA не имеет механизмов автоматического конфигурирования и распределения ресурсов, так что все заботы по конфигурированию устанавливаемых адаптеров и разрешению конфликтов ложится на пользователя. Задача конфигурации осложняется и из-за отсутствия общего механизма автоматической передачи установленных параметров прикладному и системному программному обеспечению. После конфигурирования адаптеров, установленные параметры заносятся в какие-либо конфигурационные файлы. При необходимости смены конфигурации всю роботу по конфигурированию приходится проводить повторно.
Некоторое облегчение конфигурирования принесло применение в адаптерах энергонезависимой памяти (NVRAM или ее разновидности - EEPROM), хранящей конфигурации настроек, в том числе и использования системных ресурсов. Конфигурирование этих адаптеров выполняется программно специальной утилитой, а не с помощью джамперов. Во время конфигурирования утилита может проверить выбираемые установки на наличие конфликта. Преимуществом конфигурирования с помощью NVRAM является и то, что программный драйвер, «знающий» данную карту, сумеет прочитать и сделанные установки, так что необходимость в конфигурационных файлах отпадает.
Однако это еще не решение проблемы автоконфигурирования в полном объеме. Ключевым моментом в автоконфигурировании является возможность на начальном этапе конфигурирования изоляции каждой карты от всех остальных. Тогда программные средства конфигурирования смогут вести с картой корректный диалог, на который не влияет присутствие других карт. Кроме того необходимо обеспечить единый метод двустороннего обмена конфигурационной информацией между картой и программным обеспечением. Возможность изоляции карт при конфигурировании заложена в шины MCA, PCI и EISA. В EISA для каждого слота возможно программное селективное управление сигналом AEN, запрещающим дешифрацию адресов портов ввода/вывода. Кроме того, в системе с шиной EISA имеется дополнительная энергонезависимая память конфигурирования слотов. В шине ISA все сигналы всех слотов соединяются параллельно, а хранилище конфигурационной информации не предусмотрено.
Мосты PCI – аппаратные средства подключения шины PCI к другим шинам. Host Bridge – главный мост – используется для подключения к системной шине. Peer-to-Peer Bridge – одноранговый мост – используется для соединения двух шин PCI. При конфигурировании мостов им указывается распределение системных ресурсов по шинам, которые они связываются. Таким образом задаются пути транслирования управляющих сигналов по шинам и управление буферами данных, обеспечивая для каждого адреса памяти или ввода/вывода единственную шину назначения, по крайней мере для операций чтения.
Среди устройств PnP выделяется класс динамически конфигурируемых устройств DCD. Ресурсы, используемые ими, могут динамически переназначаться во время работы, не требуя перезагрузки операционной системы. К этому классу относятся устройства PnP ISA и PCI. Устройство DCD может находится в заблокированном состоянии, тогда ресурсы не могут быть изменены до разблокирования.
Решением задачи изоляции карт ISA, программного распределения системных ресурсов, конфигурирования и передачи параметров операционной системе и прикладному ПО является спецификация компании Intel и Microsoft Plug and Play «ISA Specification». Вышеперечисленные задачи решаются для карт PnP, которые могут работать и в окружении более старых карт.
Конфигурирование в системе PnP состоит из следующих шагов: Производится изоляция одной карты от всех остальных; Карте назначается CSN (Card Select Number), с помощью которых могут работать дальнейшие команды PnP; С карты считываются данные о сконфигурированных и поддерживаемых ресурсах. Эти шаги повторяются для всех карт, после чего: Производится распределение системных ресурсов, выделяемых каждой карте; Каждая карта конфигурируется согласно выбранному распределению ресурсов и активируется.
Все шаги конфигурирования выполняет POST, если BIOS имеет поддержку PnP, или операционная система при загрузке. PnP BIOS может ограничится конфигурированием и активацией только устройств, участвующих в загрузке, оставляя конфигурирование и активацию дополнительных устройств операционной системе.
Для конфигурирования карт PnP, необходимо внести всего три 8-битных системных порта, с которыми процессор может общатся, применяя инструкции ввода/вывода с однобайтной передачей данных. Карты PnP должны использовать 12-битное декодирование адреса ввода/вывода а не 10-битное, как принято в традиционных картах ISA.
Порт ADDRESS (0279h, только запись) используется для адресации регистров PnP, запись в него производится перед обращением к портам WRITE_DATA и READ_DATA. Этот же порт используется и для записи последовательности кодов ключа инициализации. Выбор адреса для него обусловлен тем, что ни одна разумно сделанная карта не будет пытаться использовать для записи адрес регистра состояния стандартного LPT-порта.
Порты WRITE_DATA (0А79h, только запись) и READ_DATA (перемещаемый в диапазоне 0203h-03FFh, только чтение) используются для обмена данными с регистрами PnP. Адрес порта WRITE_DATA картами с 10-битным декодированием будет восприниматься как тот же адрес, что и у предыдущего порта, так что конфликт исключен. Перемещаемому адресу порта READ_DATA программное обеспечение PnP во время исполнения протокола изоляции может легко найти бесконфликтное положение. Адрес этого порта сообщается всем картам записью в их управляющий регистр PnP.
В конфигурационный режим логика PnP переводится с помощью ключа инициализации. Ключ представляет собой последовательность записей в порт ADDRESS. Аппаратная логика карты, проверяющая ключ, основана на сдвиговом регистре с обратными связями LFSR.
Протокол изоляции основан на уникальном идентификаторе Serial Identifier, хранящемся в памяти каждой карты PnP. Этот идентификатор представляет собой ненулевое 72-битное число, состоящее из двух 32-битных полей и 8-битного контрольного кода, вычисляемого с помощью регистра LFSR. Первое 32-битное поле – идентификатор производителя. Второе поле назначается производителем уникально для каждого экземпляра всех выпускаемых им карт. Доступ к идентификатору осуществляется последовательно, начиная с бита 0 нулевого байта идентификатора производителя и заканчивая битом 7 контрольной суммы. Протокол изоляции может быть программно инициирован в любой момент времени посылкой конкретного ключа инициализации, переводящего все карты в конфигурационный режим. В этом режиме карта ожидает 72 пары операций чтения порта READ_DATA. Ответ каждой карты на эти операции определяется значением очередного бита ее последовательного идентификатора.
Программа конфигурирования проверяет данные, возвращаемые во время всех пар циклов чтения, и побитно собирает идентификатор. Если при переборе нескольких возможных адресов не удается считать корректного идентификатор, то принимается решение об отсутствии карт PnP в системе (вообще или с неназначенным CSN).
По завершении протокола изоляции программное обеспечение имеет список идентификаторов, сообщенных и самим картам. Далее общение программы с каждой картой идет по ее селективному номеру CSN, фигурирующему в командах PnP. Нулевой CSN присваивается картам по программному или аппаратному сбросу и используется как широковещательный адрес.
Обращения к регистрам PnP представляют собой операции записи или чтения портов ввода/вывода по адресам WRITE_DATA или READ_DATA соответственно. При этом для указания конкретного регистра PnP используется индекс – номер этого регистра, предварительно записанный в ADDRESS.
Каждая карта имеет стандартный набор регистров PnP, причем часть из них относится к карте в целом, а часть – к каждому устройству, входящему в карту. В любой момент времени в индексном пространстве регистров PnP отображаются общие регистры карты и регистры только одного логического устройства. Выбор логического устройства осуществляется записью в регистр Logical Device Number, входящий в группу управляющих регистров карты.
С точки зрения PnP карта может перебывать в нескольких состояниях. Isolate, Config (с помощью команды WAKE[CSN]), при этом все другие карты переходят в режим Sleep. Программирование каждого логического устройства завершается установкой его бита активации на шине ISA, а всей карты – переводом ее в состояние Wait for key. После перехода всех карт в это состояние их случайное реконфигурирование будет блокировано 32-байтным ключом. Доступ к регистрам PnP возможен через ключ в любое время, но запись в них должна производится в полной уверенности о знании последствий.
Каждое логическое устройство имеет собственные дескрипторы используемых системных ресурсов: дескрипторы памяти, дескрипторы областей ввода/вывода, дескрипторы запросов прерываний, дескрипторы каналов прямого доступа к памяти.