legal note
IC Book © 2001

hardware
software

support
buy

Home page
   




Press
Практикум по ACPI
 


Описание работы программы

Как и в ранее опубликованных статьях данного цикла, в целях монопольного и бес­пре­пятственного взаимодействия программы с оборудованием, автор при­ме­нил "древнюю" технологию отладки под DOS. Аргументация такого шага и ре­ко­мен­да­ции по организации рабочего места приведены в ранее опу­бли­ко­ван­ной статье "64-битный режим под DOS: исследовательская работа № 1".

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

ACPI Power Off Архив программы управления питанием

Предлагаемый пример является полуфабрикатом, и совместим не со всеми ре­а­ли­зациями таблиц DSDT. Текущая версия программы способна на­хо­дить объ­екты _S5, только в таких реализациях, где указанные объекты рас­по­ло­же­ны в на­ча­ле таблицы DSDT. Для универсального решения такой задачи, необходима пол­но­ценная реализация виртуальной машины ACPI, так как чтобы "добраться" до объекта _S5, потребуется интерпретировать AML код, рас­по­ло­женный до тре­бу­е­мо­го объекта. В случае несовместимости выдается со­об­ще­ние In­com­pa­tible version of AML code.

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




Прилагаемый каталог WORK содержит следующие файлы:

 

Файл

Описание

 

ASM4TD.BAT

обеспечивает ассемблирование, линковку и запуск про­г­раммы под отладчиком

 

ASM.BAT

обеспечивает ассемблирование, линковку и по­лу­че­ние COM файла

 

ATX_OFF.ASM

основной модуль

 

A20.INC

библиотека для управления и контроля состояния ад­рес­ной линии A20 с использованием выходного пор­та контроллера клавиатуры

 

BIGREAL.INC

библиотека поддержки режима Big Real для ад­ре­са­ции в диапазоне до 4 Гб

 

ACPI.INC

библиотека для детектирования поддержки ACPI, локализации таблиц ACPI и проверки их корректности

 

AMLSCAN.INC

процедура сканирования последовательности де­кла­ра­ций объектов, выполненной на языке ACPI Machine Language (AML). Используется для поиска в таблице Dif­fe­ren­ti­at­ed System Description Table (DSDT) объ­ек­та "_S5", необходимого для работы программы, ко­то­рый содержит значение для записи в битовое по­ле Sle­ep_Type регистра PM1_CNT_BLK, обес­пе­чи­ва­ю­щее выключение питания. См. описание выполнения программы

 

OUTPUT.INC

библиотека для вывода текста и чисел в десятичной и шестнадцатеричной системах счис­ле­ния

 

DATASEGS.INC

сегменты данных: переменные, текстовые сообщения и стек


Рассмотрим выполнение основного модуля. Нумерация пунктов данного описания соответствует нумерации пунктов комментариев в исходном тексте - файле WORK\atx_off.asm.

1) Устанавливаем адрес стека.

2) Выводим сообщение о начале выполнения программы.

3) Проверяем режим работы процессора. Данная программа требует Real Mode, так как взаимодействует с оборудованием. Если процессор в Protected Mode, выходим с сообщением об ошибке.

4) Разрешаем адресную линию A20 и включаем Big Real Mode. Эти действия необходимы, так как таблицы ACPI расположены выше 1 MB.

5) Детектируем поддержку ACPI. Подпрограмма Scan_ACPI_RSDP сканирует 128-Кбайтный блок E0000h-FFFFFh на предмет обнаружения сигнатуры - последовательности символов "RSD PTR ", с которой начинается структура RSDP. Если сигнатура найдена и контрольная сумма RSDP верна, из RSDP считывается 32-битный адрес таблицы RSDT, содержащей каталог таблиц ACPI. Иначе, выходим с сообщением об ошибке. Далее, используя подпрограмму Get_ACPI_Table, находим таблицу FADT по сигнатуре "FACP". Из таблицы FADT, по фиксированным адресам считываем адреса портов для регистров управления контроллера Power Management: PM1a_CNT_BLK и PM1b_CNT_BLK (Power Management Control Blocks). Использование этих регистров описано в пункте 7. Сохраняем прочитанные значения.

6) Используя подпрограмму Get_ACPI_Table, находим таблицу DSDT по сигнатуре "DSDT". Используя подпрограмму Scan_AML_Name, находим в таблице DSDT декларацию объекта NAME содержащего имя "_S5". Этот объект содержит значения S5a_Value, S5b_Value, использование которых описано в пункте 7. Сохраняем значения, полученные при интерпретации содержимого объекта.

Стандартное для ACPI имя переменной, используемой в процедуре выключения питания - _S5, обусловлено тем, что "дежурный" режим, при котором на блок питания ATX подается напряжение сети, но система выключена (блок питания выдает только напряжение +5V Standby и сигнал PS_ON=1) классифицируется спецификацией ACPI как состояние S5=Soft-Off.

7) Выполняем запись заданных значений в заданные порты, что приводит к выключению питания (переводу сигнала PS_ON в состояние логической "1"). Предварительно выводим дамп значений, полученных на шагах 5 и 6. Считываем порт PM1a_CNT_BLK, в прочитанном значении, бит 13 (Sleep Enable) устанавливаем в "1", биты 12-10 (поле Sleep Type) устанавливаем в состояние, равное содержимому объекта S5a_Value, остальные биты не изменяем. Значение, с модифицированными битами 13-10 записываем обратно в порт PM1a_CNT_BLK. Считываем порт PM1b_CNT_BLK, в прочитанном значении, бит 13 (Sleep Enable) устанавливаем в "1", биты 12-10 (поле Sleep Type) устанавливаем в состояние, равное содержимому объекта S5b_Value, остальные биты не изменяем. Значение, с модифицированными битами 13-10 записываем обратно в порт PM1b_CNT_BLK. После задержки, связанной с прохождением сигналов через Power Management контроллер, питание должно выключиться. Запрещаем прерывания и останавливаем процессор. В типовой платформе, инструкции CLI и HLT, расположенные после процедуры записи регистров, успеют выполниться до выключения питания, так как существует задержка срабатывания контроллера Power Management и инерционность блока питания. Вместе с тем, вариант, при котором питание выключится раньше, также допускается.

Использование двух портов управления PM1a_CNT_BLK и PM1b_CNT_BLK обусловлено тем, что спецификация ACPI поддерживает описание нетипичных платформ, у которых для выключения питания требуется выполнить запись в два порта, имеющие различные адреса и физически расположенные в разных микросхемах ("северном" и "южном" мостах чипсета). В типичной платформе такая возможность избыточна, так как для рассматриваемого действия достаточно записи в один порт, расположенный в составе "южного" моста чипсета. При этом переменная PM1a_CNT_BLK содержит адрес этого порта, а переменная PM1b_CNT_BLK содержит нуль, что соответствует отсутствию порта. Программа, выполняющая запись значений в указанные регистры, пропускает операцию записи, если адрес нулевой.

8) Сюда передается управление, если требуется аварийное завершение программы после того, как разрешена линия A20 и включен режим Big Real Mode. Восстанавливаем состояние линии A20, выключаем режим Big Real Mode и переходим к пункту 9 для выхода из программы.

9) Выход из программы с генерацией сообщения об ошибке.

Управление блоком питания ATX

Рассмотрим процессы, происходящие при выполнении вышеописанной программы, на уровне принципиальной электрической схемы. Разумеется, в каждой материнской плате, в зависимости от модели чипсета, микросхемы MIO (Multi Input/Output) и других факторов, рассматриваемый узел реализован по-своему. Для определенности возьмем частный случай - материнские платы, использующие "южный мост" Intel ICH6, описанный в [6] (это платы на чипсетах Intel 915 и 925) и микросхему MIO Winbond W83627THF, описанную в [12]. Ядро Power Management контроллера, а именно, логика, принимающая решение о включении и выключении питания находится в составе "южного моста" чипсета. Здесь же расположен программно-доступный регистр PM1_CNT_BLK, используемый в приведенном примере для выключения питания. Обеспечение интерфейса Power Management контроллера с "внешним миром" входит в обязанности микросхемы MIO. В ее составе находится схема опроса кнопки Power Switch, которая, получив сигнал от кнопки, транслирует его Power Management контроллеру (ICH6). Также в составе MIO находится формирователь сигнала PS_ON для блока питания ATX. При получении соответствующего приказа от ICH6, микросхема MIO выдает сигнал PS_ON=0, что приводит к включению блока питания.

Что происходит при выполнении нашей программы? Запись в регистр PM1_CNT_BLK 16-битного слова, у которого бит 13 (Sleep Enable) установлен в "1", а значение битового поля Sleep_Type соответствует ACPI-состоянию S5 (состояние Soft-Off) является приказом для ICH6 начать процедуру выключения питания. ICH6 выдает сигнал SLP_S3# (контакт с координатами T4). Он приходит на вход SLP_Sx (контакт 67) микросхемы MIO W83627THF. В результате микросхема W83627THF выдает логическую "1" на выход PWCTL# (контакт 72) и блок питания выключается. Этот выход подключен к линии PS_ON блока питания. В зависимости от схемотехники платы, подключение выполняется напрямую или через буферный повторитель.

Другие примеры реализаций микросхем "южных" мостов и MIO приведены в [7], [9], [10], [11], [13].

При рассмотрении работы блока питания, не следует путать сигналы PS_ON и PWR_OK. Сигнал PS_ON (Power Supply On) используется для включения блока питания ATX. Это входной сигнал для блока питания и выходной сигнал для материнской платы. При логическом "1" на этой линии, блок питания выключен (работает только "дежурный" источник +5V Standby, необходимый для схемы управления питанием). При логическом "0" на этой линии блок питания включен, выдаются все выходные напряжения. Сигнал PWR_OK (Power OK, синоним Power Good) используется для запуска материнской платы при включении питания и блокировки работы ее устройств на время переходных процессов при включении и выключении питания. Это входной сигнал для материнской платы и выходной сигнал для блока питания. Логический "0" на этой линии равносилен нажатию кнопки RESET. При этом все устройства зафиксированы в состоянии сброса. При включении питания, в течение нескольких миллисекунд, сигнал PWR_OK=0, это обеспечивает запуск компьютера и препятствует выполнению каких-либо операций до стабилизации питания. При выключении питания, во время переходного процесса, сигнал PWR_OK также переходит в состояние логического "0". Во время рабочего сеанса на этой линии присутствует логическая "1". Подробности в [3], [4].

Источники информации

Электронные документы, доступные на сайте ACPI:
1) Advanced Configuration and Power Interface Specification. Hewlett-Packard Corporation, Intel Corporation, Microsoft Corporation, Phoenix Technologies Ltd., Toshiba Corporation. Revision 3.0.

Электронные документы, доступные на сайте Intel Corp..
2) Instantly Available Power Managed Desktop PC Design Guide. Revision 1.1.
3) ATX Specification. Version 2.03.
4) ATX / ATX12V Power Supply Design Guide. Version 1.0 (Public Release).
5) ATX Balanced Technology Extended (BTX) Interface Specification. Version 1.0.
6) Intel I/O Controller Hub 6 (ICH6) Family Datasheet. Document Number 301473-001.
7) Intel I/O Controller Hub 7 (ICH7) Family Datasheet. Document Number 307013-002.


Электронные документы, доступные на сайте AMD.
8) Open Platform Management Architecture Specification. Publication # 32200.
9) AMD-8111 HyperTransport I/O Hub Data Sheet. Publication # 24674.


Электронные документы, доступные на сайте datasheetarchive.com.
(Информация на данном сайте более полная, чем на "родных" сайтах производителей указанных микросхем.)
10) VIA VT82C686A South Bridge Datasheet. Revision 1.54. Для поиска документа набирать строку "VT82C686".
11) VIA VT82C686B South Bridge Datasheet. Revision 1.71. Для поиска документа набирать строку "VT82C686".


Электронные документы, доступные на сайте Winbond.
12) Winbond LPC I/O W83627THF.


Электронные документы, доступные на сайте ITE.
13) IT8712F Environment Control - Low Pin Count Input/Output (EC-LPC I/O).





about
press


вверх