User Tools

Site Tools


Hacking right formulas for ASUS boards

*This article needs to be extended/fixed Please help! *

*Please note: this page is essentially obsolete, these days you really should use the asus_atk0110 driver for these Asus motherboards implementing the ATK0110 ACPI device.*

Recent ASUS motherboards contain special acpi device ATK110. ASUS has implemented ACPI methods for obtaining the temps, voltages and fanspeeds plus smart fan control plus overclocking stuff.

It seems those features are in all ASUS AI NOS or proactive motherboards.

There is one virtual device in APCI namespace called ASOC

Device (ASOC)
                Name (_HID, "ATK0110")
                Name (_UID, 0x01010110)

When this device is present it exposes some methods to read the monitored values and also to ENUMERATE what is supported on that motheboard.

We can read the conversion formulas and labels from the disassembled ACPI bytecode. Here is how to get the ACPI methods.

  1. You need ACPI compiler/disassembler. Get it here
  2. downloand and compile. cd compiler; make; “iasl” binary will be created.
  3. The DSDT table from motherboard. cat /proc/acpi/dsdt > /tmp/dsdt.bin
  4. Run the ./iasl with -dc parameter
./iasl -dc dsdt.bin

It will produce output file called dsdt.dsl. There are those ACPI methods. I will present it for voltages (for fans, temps it is similar)

Method (VSIF, 0, NotSerialized)

Returns a structure of suppored monitoring objects

 Name (VBUF, Package (0x05)
                    V120 }

Like this.

Each member has following fields:

Name (V500, Package (0x05)
                    " +5.0 Voltage",

You can see ID, label, limits

So when you know the IDS and names you can just call a method that will give you actual value:

Method (RVLT, 1, NotSerialized)

Like this Just call with ID. Return value is integer in mV with the actual value. As you can see it is not complicated.

You can use this RVLT method to dig for the conversion formulas, because they are there too:

  Store (DerefOf (Index (V120, 0x00)), Local0)
                    If (LEqual (Arg0, Local0))
                        Store (V12V, Local0)
                        Store (0x38, Local1)
                        Add (0x0A, Local1, Local1)
                        Multiply (Local1, 0x08, Local1)
                        Multiply (Local0, Local1, Local0)
                        Divide (Local0, 0x0A, Local3, Local0)
                        Return (Local0)

This is the formula for 12V. V12V is register name. Some hints:

Store (0x38, Local1) -> Local1 = 0x38
Add (0x0A, Local1, LocalX) -> LocalX = Local1 + 0xA
Divide (Local0, 0x0A, Local3, LocalX) -> LocalX = Local0 / 0xA (FIXME local3)

You may find in other place of the file in a register mapping structure. Looks like:

                           Offset (0x20),                                                          
                    VCOR,   8,                                                                      
                    V33V,   8,                                                                      
                            Offset (0x23),                                                          
                    V50V,   8,                                                                      
                    V12V,   8,                                                                      
                       Offset (0x29), 

So V12V is is in register 0x24.

asusformulahacking.txt · Last modified: 2018/09/01 08:50 by Ondřej Lysoněk