===== 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. - You need ACPI compiler/disassembler. Get it [[http://www.acpica.org/downloads/|here]] - downloand and compile. ''cd compiler; make;'' "iasl" binary will be created. - The DSDT table from motherboard. ''cat /proc/acpi/dsdt > /tmp/dsdt.bin'' - 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) { 0x04, VCRE, V333, V500, V120 } Like this. Each member has following fields: Name (V500, Package (0x05) { 0x06020002, " +5.0 Voltage", 0x1194, 0x157C, 0x01 }) 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.