Example: Acer Aspire ES1-711

Analyzing the DSDT DSL

By looking at the DSL file, we find the registers we are interested in:

        Scope (_TZ)
        {
            ThermalZone (TZ01)
            {
                Method (_TMP, 0, NotSerialized)  // _TMP: Temperature
                {
                    If (\_SB.ECOK)
                    {
                        Local0 = \_SB.PCI0.LPCB.EC0.CTMP
                        Return (((Local0 * 0x0A) + 0x0AAC))
                    }
                    Else
                    {
                        Return (0x0CD2)
                    }
                }

                [...]
            }
        }

        OperationRegion (EMEM, SystemMemory, 0xFEDF8200, 0x0100)
        Field (EMEM, ByteAcc, NoLock, Preserve)
        {
            [...]
            Offset (0x58), 
            CTMP,   8, 
            Offset (0x5A), 
            [...]
        }

The CTMP register is used in the calculation of the temperature reported by ThermalZone TZ01.

Calculating Register Addresses

We calculate the register addresses as follows:

Finding the WriteRegister

While CTMP is not a direct fan control register, manipulating its value allows us to simulate different CPU temperatures and indirectly trigger fan speed changes.

sudo ec_probe write 88 0
sudo ec_probe write 88 100

The fan speed changed.

Now we can run:

sudo ec_probe write 88 0

Wait until the fan turns down ...

sudo ec_probe monitor -c -r readings.csv

While running the monitor command, we spin the fan up:

sudo ec_probe write 88 100

Wait until the fan turns up ...

We kill the monitor command by typing CTRL+C

The readings.csv looks like this:

02,18,14,18,12,13,17,14,11,15,16,15,12,14,12,14,16,12,14,18,16,1B,12,14,13,19,13,12,13,15,18,13,1A,13,11,14,17,11,17,15,11,15,13,16,13,14,18,11,12,14,11,18,19,14,19,11,19,11,15,12,17,15,17
55,00,01,02,03,04,05,06,07
56,00,49,45,4B,47,4D,49,4F,55,5B,61,67,6D,73,79,7F,84,8A,91,97,9D,A0,A2,A4
58,25,64
5C,00,A3,2E,EA,DE,8D,21,B2,99,26,3A,A1,AA,2B,1E,F1,2D,CD,DE,6B,4C,5C,6B,DE,EF,6B,EF,DE,6B,5C,EF,7B,6B,DE,EF,6B,00,EF
5D,00,02,06,07,08,09,0A,0B,0C,0D,0E,0F,0E,0F,10,0F
82,C8,C9,C8,C9,C8,C9,C8,C9,C8
98,6D,6E,6D,6E,6D,6E,6D
      

We see that register 0x55 gives continuous values from 0x00 to 0x07.

We try to set the fan speed by writing to 0x55

sudo ec_probe write 0x55 0
sudo ec_probe write 0x55 4
sudo ec_probe write 0x55 7

The fan speed changed!

Result:

Writing the Configuration File

Since the fan speed gets periodically reset, we don't have a FanSpeedResetValue.

See the configuration file on GitHub