Вывод температуры на индикатор POST

Материал из Wiki.ROM.by
Перейти к: навигация, поиск

В этой заметке я постараюсь дать краткое описание небольшой модификации, позволяющей стандартными средствами операционной системы выводить на POST-индикатор значения температуры процессора. На моем домашнем компьютере это "новшество" работает уже больше полугода (с марта 2004, материнка EPoX 8RDA). Проблем замечено не было.

Думаю, очевидно, что данная модификация интересна прежде всего для владельцев материнских плат с POST-индикатором на борту (многие EPoX, некоторые A-Bit), а также для обладателей POST-карт в PCI/ISA исполнении.

Суть усовершенствования - модификация AML-кода, являющегося частью ACPI-таблиц, хранящихся в образе BIOS материнской платы. AML-код после прохождения POST оказывается в оперативной памяти компьютера и используется ACPI-драйвером операционной системы. Этот код является прослойкой между драйвером и железом. В частности, он описывает способ получения драйвером информации о температуре процессора посредством специально предусмотренного метода RTMP. Этот метод периодически вызывается драйвером, чтобы узнать, не превысила ли температура предельные значения. Воспользуемся этим фактом: после модификации упомянутого метода температура с такой же периодичностью будет выводиться и на POST-индикатор.

Но обо всем по-порядку.

Содержание

Этап 1. Извлечение AML-кода

Извлечение AML-кода и декомпиляция его в ASL-код. Этот этап подробно описан в предыдущей статье об использовании ACPI-таблиц для PowerNow!. В полученный на этом этапе ASL-код и будем вносить изменения.

Этап 2. Определение региона P80H

Определение региона P80H. Фактически производится описание порта 80h. Если вы немного знакомы с ассемблером, то наверняка знаете, что для вывода какого-либо шестнадцатеричного числа на POST-индикатор достаточно вывести это число в порт с номером 80h.

Для удобства объявим область P80H в самом начале. Участок кода до внесения изменений:

/*
* Intel ACPI Component Architecture
* AML Disassembler version 20040211
*
* Disassembly of DSDT, Sun Mar 21 20:46:44 2004
*/
DefinitionBlock ("DSDT.aml", "DSDT", 1, "NVIDIA", "AWRDACPI", 4096)
{
   Scope (\_PR)
   {
       Processor (\_PR.CPU0, 0x00, 0x00000000, 0x00) {}
   }

Участок кода после внесения изменений:

/*
* Intel ACPI Component Architecture
* AML Disassembler version 20040211
*
* Disassembly of DSDT, Sun Mar 21 20:46:44 2004
*/
DefinitionBlock ("DSDT.aml", "DSDT", 1, "NVIDIA", "AWRDACPI", 4096)
{
   OperationRegion (PORT, SystemIO, 0x80, 0x01)
   Field (PORT, ByteAcc, NoLock, Preserve)
   {
       P80H,   8
   }
   Scope (\_PR)
   {
       Processor (\_PR.CPU0, 0x00, 0x00000000, 0x00) {}
   }

Изменения в данном и последующих фрагментах кода выделены красным.

Этап 3. Модификация процедуры

Модификация процедуры (метода) RTMP, передающего ACPI-драйверу значение температуры процессора. Его задача: получение от микросхемы ввода-вывода информации о температуре процессора в градусах Цельсия и преобразование её в Кельвины.

Логично предположить, что этот метод сильно зависит от модели микросхемы ввода-вывода. Для большинства чипов производства Winbond (W83627(T)HF, W83637HF, W83697HF и др.) эта процедура будет выглядеть следующим образом (оригинальный код метода):

Method (RTMP, 0, NotSerialized)
   {
       Store (GBYT (0x4E), Local0)
       Or (Local0, 0x01, Local1)
       SBYT (0x4E, Local1)
       Store (GBYT (0x50), Local1)
       Store (GBYT (0x51), Local2)
       ShiftLeft (Local1, 0x08, Local1)
       Or (Local1, Local2, Local3)
       ShiftRight (Local3, 0x07, Local3)
       ShiftLeft (Local3, 0x02, Local1)
       Add (Local3, Local1, Local3)
       Add (Local3, 0x0AAC, Local3)
       If (LGreater (Local3, 0x0E8A))
       {
           Store (0x0AAC, Local3)
       }
       SBYT (0x4E, Local0)
       Return (Local3)
   }

Код метода после изменений (выделены красным):

Method (RTMP, 0, NotSerialized)
   {
       Store (GBYT (0x4E), Local0)
       Or (Local0, 0x01, Local1)
       SBYT (0x4E, Local1)
       Store (GBYT (0x50), Local1)
       Store (GBYT (0x51), Local2)
       ToBCD (Local1     , P80H  )
       ShiftLeft (Local1, 0x08, Local1)
       Or (Local1, Local2, Local3)
       ShiftRight (Local3, 0x07, Local3)
       ShiftLeft (Local3, 0x02, Local1)
       Add (Local3, Local1, Local3)
       Add (Local3, 0x0AAC, Local3)
       If (LGreater (Local3, 0x0E8A))
       {
           Store (0x0AAC, Local3)
       }
       SBYT (0x4E, Local0)
       Return (Local3)
   }

Суть внесенных изменений: значение температуры (например, 45°C) преобразуется в шестнадцатеричное число, состоящее из тех же цифр (45h), и отсылается в порт номер 80h, т.е. выводится на POST-индикатор.

Этап 4. Компиляция ASL->AML

Компиляция ASL->AML, тестирование, встраивание в образ БИОС'а и прошивка. Эти этапы подробно описаны в предыдущей статье. Как видите, ничего гениального в предложенной модификации нет. Но эффект от нее на лицо, точнее, индикатор.

Вадим Карпов


Персональные инструменты
Google