How To Control The Fan Behavior Manually
- Operation confirmed with testing in our Ubuntu Minimal on kernel 4.14.32.
- Operation confirmed with testing in our Ubuntu Minimal on kernel 5.4.167-238 too.
- This guide helps from our forum[1][2].
Concept: A trip point and the fan speed
ODROID XU4 supports 3 cooling levels for thermal control, 0, 1, 2.
Level 0, which is the lowest level for thermal control and comes with the slowest fan speed.
And level 2, which is the highest level for thermal control and comes with the fastest fan speed.
Refer to this table.
Trip point | - | 0 | 1 | 2 |
---|---|---|---|---|
Temperature | 0 | 60°C | 70°C | 80°C |
Fan speed | 0 | 120 | 180 | 240 |
This tables shows the default values that how the fan behaves. As this table shows, when the temperature reaches to 60°C, the target trip point will be changed to level 1 and the fan starts to run at 120 PWM value(0~255).
In the same vein, the target trip point will be level 3 and the fan runs at 240 PWM value when the temperature reaches to 80°C.
You can adjust the target trip points and its each fan speed as you want.
And even you can fix the fan speed at the constant speed you set.
Modify the trip points
You can check current trip points.
- target
$ cat /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/trip_point_{0,1,2}_temp # results 60000 70000 80000 60000 70000 80000 60000 70000 80000 60000 70000 80000
Yes there're the other trip points named 3, 4, 5. But you can ignore them that we don't use. Same on thermal_zone4.
As we can see, each trip point at each thermal zone has same value 60000, 70000, 80000. That means each trip point is activated on 60°C, 70°C, 80°C.
Each trip point is editable by writing a custom value to the each trip point files set.
For example, if you want to set trip point 1 to be activated at 30°C, you can just write a value on them.
- target
$ echo 30000 | sudo tee /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/trip_point_0_temp $ cat /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/trip_point_0_temp # results 30000 30000 30000 30000
Then the fan starts spinning up at 30°C.
If you want to do that automatically, write some code in the /etc/rc.local file.
Copy the following codes and paste.
# Target temperature: 30°C, 50°C, 70°C TRIP_POINT_0=30000 TRIP_POINT_1=50000 TRIP_POINT_2=70000 echo $TRIP_POINT_0 > /sys/devices/virtual/thermal/thermal_zone0/trip_point_0_temp echo $TRIP_POINT_0 > /sys/devices/virtual/thermal/thermal_zone1/trip_point_0_temp echo $TRIP_POINT_0 > /sys/devices/virtual/thermal/thermal_zone2/trip_point_0_temp echo $TRIP_POINT_0 > /sys/devices/virtual/thermal/thermal_zone3/trip_point_0_temp echo $TRIP_POINT_1 > /sys/devices/virtual/thermal/thermal_zone0/trip_point_1_temp echo $TRIP_POINT_1 > /sys/devices/virtual/thermal/thermal_zone1/trip_point_1_temp echo $TRIP_POINT_1 > /sys/devices/virtual/thermal/thermal_zone2/trip_point_1_temp echo $TRIP_POINT_1 > /sys/devices/virtual/thermal/thermal_zone3/trip_point_1_temp echo $TRIP_POINT_2 > /sys/devices/virtual/thermal/thermal_zone0/trip_point_2_temp echo $TRIP_POINT_2 > /sys/devices/virtual/thermal/thermal_zone1/trip_point_2_temp echo $TRIP_POINT_2 > /sys/devices/virtual/thermal/thermal_zone2/trip_point_2_temp echo $TRIP_POINT_2 > /sys/devices/virtual/thermal/thermal_zone3/trip_point_2_temp
Reboot and check if the changes applied.
Modify the fan speed
- You always have to reboot to apply the changed fan speed for now.
- More detailed document here.
You can check current fan speed scaling.
- target
$ cat /sys/devices/platform/pwm-fan/hwmon/hwmon0/fan_speed # results 0 120 180 240
You can adjust these values by writing value set to the file.
If you want to make your fan more aggressively, you can write like below.
- target
$ echo "0 204 220 240" | sudo tee /sys/devices/platform/pwm-fan/hwmon/hwmon0/fan_speed # results 0 204 220 240
This makes fan turns on to 80% (204 == 80 * 255 * 0.01) when the temperature reaches to trip point 0.
And when the fan speed is set newly, its kernel message shows up and you can find out by dmesg command.
- target
$ dmesg # results ... [ 1998.019631] hwmon hwmon0: fan_speeds : set_fan_speed [0 204 220 240]
If you want to do that automatically, write some code in the /etc/rc.local file.
Copy below and paste.
# Target fan speed (PWM): 0, 204, 220, 240 echo "0 204 220 240" > /sys/devices/platform/pwm-fan/hwmon/hwmon0/fan_speed
Reboot and check if the changes applied.
Emulate temperature
You don't have to stress your ODROID out to test the new settings.
Check these files.
- target
$ ls -l /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/emul_temp # results --w------- 1 root root 4096 Apr 11 01:55 /sys/devices/virtual/thermal/thermal_zone0/emul_temp --w------- 1 root root 4096 Apr 11 02:05 /sys/devices/virtual/thermal/thermal_zone1/emul_temp --w------- 1 root root 4096 Apr 11 02:05 /sys/devices/virtual/thermal/thermal_zone2/emul_temp --w------- 1 root root 4096 Apr 11 02:05 /sys/devices/virtual/thermal/thermal_zone3/emul_temp
These writable files let us can set the any temperature value to cover the real temperature on the board and finally it makes the fan runs by the settings.
If you want to set to 85°C, just write to them.
- target
$ echo 85000 | sudo tee /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/emul_temp # results 85000
And check if the changes affect.
- target
$ cat /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/temp # results 85000 85000 85000 85000
So easy. If you want to get back to normal, write 0 on them.
- target
$ echo 0 | sudo tee /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/emul_temp # results 0
And check.
- target
$ cat /sys/devices/virtual/thermal/thermal_zone{0,1,2,3}/temp # results 30000 30000 30000 29000
This would be helpful for you to check the new settings you've just set both the trip points and the fan speed scaling.
Fully manual way to control the fan speed
- This requires kernel 4.14.20 or higher. But Kernel 5.4 doesn't support this feature.
- Operation confirmed with testing in our Ubuntu Minimal on kernel 5.4.167-238 too.
Most programmatically method to adjust fan speed in totally manual way.
- target
# Set fan to manual mode $ echo 0 | sudo tee /sys/devices/platform/pwm-fan/hwmon/hwmon0/automatic # Set speed to 100% $ echo 255 | sudo tee /sys/devices/platform/pwm-fan/hwmon/hwmon0/pwm1
Then the fan ignores written scaling files(trip points and fan speed) and runs constantly at the same speed.
You can do that automatically too. Edit /etc/rc.local file and reboot to check if the changes applied.
This example makes the fan always runs in full speed.
# Fix fan speed echo 0 | sudo tee /sys/devices/platform/pwm-fan/hwmon/hwmon0/automatic echo 255 | sudo tee /sys/devices/platform/pwm-fan/hwmon/hwmon0/pwm1
Or you can write an application using the fan.
Fan control scrip examples
There are some nice script code examples you have to refer.
https://forum.odroid.com/viewtopic.php?f=77&t=30743
https://forum.odroid.com/viewtopic.php?f=146&t=30745