Since I was annoyed by the fan of my Acer Extensa 5620G notebook, manual fan control was and is a big issue for me.
When I was still using Windows, I used a tool called “Notebook Hardware Control”, which was not uncomplicated, because there are several versions (beta, releases, ..) out there and only one (not the newest) worked for me without causing a bluescreen(!). When it finally worked, however, I was quite satisfied.
On my new Ubuntu (first 10.10, 11.04 since Beta 1) a new solution needed to be found. After some searching, not as successful als hoped, I stumbled across a perl script called “acer_ec.pl”. Just google it for yourself, if you are interested. It can modify registers of some chip in the notebook, which, among other things, controls the fan.
The next step was to find out, which are the right registers and what values to write into them.
After some – unsuccessful – searching, I had the idea to just look them up in one of the files of the mentioned Notebook Hardware Control tool, which (the file, not the whole programm) was fortunately available as C# source code.
BEFORE YOU READ ON:
Be aware that meddling with your fan will most likely void any guarantee you have on your notebook. Additionally, you can DAMAGE YOUR HARDWARE. You will do everything ON YOUR OWN RISK. I am not responsible for how you use the information I give you here, neither can I guarantee that the information are correct and without errors. Use your common sense, and only do this if you know what are you doing.
So, here the technical stuff:
You can enable or disable manual fan control by writing into register 0×93.
The default value (fan control is automatic) ist (for me): 0×04
To enable manual control, just change the register to: 0×14
Simply revert to the default value to restore automatic. DO NOT FORGET THIS if you want to stop controlling it manually.
The speed is controlled by register 0×94.
You need to substract the desired speed from 255 and convert the resulting decimal value to hexadecimal:
value = hex(255 – desired_speed)
Some example speeds and the corresponding register values:
50 -> 0xCD
80 -> 0xAF
120 -> 0×87
Basically, 50 and 80 are the only speeds I am setting manually. At temperatures below 68°C I set the speed to 50, from 68°C to 79°C I set it to 80, and from 80°C onwards (which is – to my knowledge – the area where it starts to get uncomfortable/dangerous) I revert the fan control to automatic, because I have no idea what the maximum speed of the fan is. 50 and 80 are slower than the maximum, that is rather simple to hear by the noise. I would recommend against setting the fan to speeds higher than 120, although nothing prevents you (technically) to do so. It will be quite loud and maybe the fan will break.
How to read out the temperature?
On my system, I read the temperature out of /sys/class/thermal/thermal_zone0/temp and /sys/class/thermal/thermal_zone1/temp. I am then using the higher one out of the two. I HOPE that are the right temperatures, but the values seem to make sense
(You appearantly need to divide them by 1000).
What now?
If you belong to the target audience I am writing this for, then it will be easy for you to write a script or a small programm to control the fan as you like. I have a bash-script which does this for me, but I think I will not publish it here, to prevent people simply copy&pasting it and mabye damaging their hardware.