[[ Управление кулером на ноутбуке Asus X554L ]]

Ubuntu

Управление кулером на ноутбуке Asus X554L

Ubuntu 22.04
fancontrol 1:3.6.0-7ubuntu1

fancontrol - это bash скрипт для управления скоростью кулера(ов).
Запускается как systemd сервис.

Дело в том, что по умолчанию, политика охлаждения для этого ноутбука на мой взгляд излишне агрессивная.
Например при t +34.0°C обороты держатся на значении 2300 RPM.
Меня бы устроило полное отключение вентилятора до t +48.0°C.

Установка

Устанавливаем fancontrol и набор утилит lm-sensors

sudo apt-get install fancontrol lm-sensors

Введение

Модуль asus_nb_wmi

Познакомимся с модулем (драйвером) управления кулером asus_nb_wmi.
Он должен быть автоматически загружен, это специфичный модуль для ноутбуков Asus

$ lsmod | grep asus
asus_nb_wmi            28672  0                 <---------- Есть
asus_wireless          20480  0
asus_wmi               45056  2 asus_nb_wmi,mfd_aaeon
sparse_keymap          16384  1 asus_wmi
platform_profile       16384  1 asus_wmi
video                  65536  3 asus_wmi,i915,nouveau

Запустим команду sensors и посмотрим какие датчики нам доступны и какие интересуют

$ sensors
asus-isa-0000           <---------- Датчик предоставляемый модулем asus_nb_wmi
Adapter: ISA adapter
cpu_fan:     2300 RPM   <---------- Скорость вращения cpu_fan - это единственный кулер
temp1:        +37.0°C   <---------- Температура, вероятно средняя
 
coretemp-isa-0000       <---------- Датчик предоставляемый модулем coretemp, данные по CPU
Adapter: ISA adapter
Package id 0:  +37.0°C  (high = +105.0°C, crit = +105.0°C) <---------- Средняя
Core 0:        +37.0°C  (high = +105.0°C, crit = +105.0°C) <---------- Ядро #0
Core 1:        +37.0°C  (high = +105.0°C, crit = +105.0°C) <---------- Ядро #1
 
BAT0-acpi-0
Adapter: ACPI interface
in0:           7.50 V  
 
pch_wildcat_point-virtual-0
Adapter: Virtual device
temp1:        +37.0°C  
 
nouveau-pci-0400       <---------- Датчик предоставляемый модулем nouveau, видеокарта Nvidia
Adapter: PCI adapter
GPU core:         N/A  (min =  +0.60 V, max =  +1.20 V)
temp1:            N/A  (high = +95.0°C, hyst =  +3.0°C)
                       (crit = +105.0°C, hyst =  +5.0°C)
                       (emerg = +135.0°C, hyst =  +5.0°C)
 
acpitz-acpi-0
Adapter: ACPI interface
temp1:        +37.0°C  (crit = +108.0°C)

Данные по температуре и управление модулем осуществляется через виртуальную файловую систему sysfs.
Найдем датчик asus-isa-0000

$ ls -la /sys/devices/platform/asus-nb-wmi/hwmon/
total 0
drwxr-xr-x 3 root root 0 Mar  6 16:41 .
drwxr-xr-x 5 root root 0 Mar  6 16:41 ..
drwxr-xr-x 3 root root 0 Mar  6 16:41 hwmon6
 
# Имя сенсора
$ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/name 
asus
 
# Имя кулера
$ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/fan1_label 
cpu_fan
 
# Скорость вращения
$ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/fan1_input 
2300
 
# Температура. Делим значение на 1000 и получаем +35.05С
$ cat  /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/temp1_input
35050
 
# Режим работы управления скоростью кулера через PWM 
# 1 - ручной
# 2 - автоматический
$ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/pwm1_enable 
2
 
# Значение PWM (будем считать, что это значение мощности)
# 0 - минимальное значение (кулер не вращается)
# 255 - максимальное значение
# NOTE: При автоматическом управлении, это значение не отражает действительности
$ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/pwm1
85

hwmon6 - это имя предоставляемое The Linux Hardware Monitoring kernel API.
Номер может манятся, поэтому в дальнейшем использоваться wildcard путь, к счастью у нас один кулер.

Управляем кулером

Потренируемся управлять вентилятором вручную.
Дальнейшие действия будем выполнять из под root.

sudo -i

# Установим максимальную мощность. При этом режим управления перейдет в ручной!
echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1
 
# Посмотрим скорость вращения
$ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/fan1_input
cat: /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/fan1_input: No such device or address
 
# Посмотрим температуру
cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/temp1_input
 
# Выключим кулер
echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1
 
# Посмотрим температуру
cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/temp1_input
 
# Возвращаем автоматические режим
echo 2 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable

В ручном режиме скорость вращения не отображается.
К сожалению это такой баг или фича.

Опытным путем выяснил, что при значении PWM < 40 кулеру не хватает мощности что бы раскрутиться.

Настройка fancontrol

Скрипт действует точно также, как ранее выполнялись действия руками используя sysfs.
Постоянно подстраивает значение PWM в зависимости от t°C.

Создаем файл конфигурации. Пример файла с описанием параметров:

/etc/fancontrol

# Частота опроса сенсора в сек. Как быстро скрипт будет реагировать на изменение t.
INTERVAL=3

# Минимальное значение PWM (по умолчанию 0)
#MINPWM=0

# Максимальное значение PWM (по умолчанию 255)
#MAXPWM=255

# Сопоставление сенсоров температуры с устройствами регулирования
# В данном случае у нас одна пара, но скрипт позволяет использовать список через пробел.
FCTEMPS=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/temp1_input

# Сопоставление датчиков скорости с устройствами регулирования. Параметр опционален.
# Т.к. при переходе в ручной режим управления, данные по скорости RPM недоступны, то и использовать не получится.
# Да и я не очень понял зачем этот параметр, что конкретно он делает и как влияет.
#FCFANS=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/fan1_input

# При значении датчика t < 48С, устанавливать значение pwm1 = MINPWM
MINTEMP=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=48

# При значении датчика t >= 65С, устанавливать значение pwm1 = MAXPWM
MAXTEMP=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=65


# Если вентилятор был остановлен, то старт будет со значения MINSTART
# Возможно сделать резкий старт или плавный.
# Надо учесть то, что значение при котором вентилятор способен раскрутиться на этом ноутбуке >=40.
# На следующем же интервале опроса - это значение будет скорректировано в большую или меньшую сторону.
MINSTART=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=100

# Что-то типа минимально гарантированное значение PWM, но только если значение датчика t > MINTEMP.
# Там хитрая формула и это значение будет прибавлено к расчетному.
# Опытным путям я поставил значение чуть меньше, чем значение при котором вентилятор способен раскрутиться.
MINSTOP=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=30

# Усредняет значения температуры при расчете по нескольким измерениям, что позволяет изменять скорость более плавно.
AVERAGE=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=3

Формула расчета скорости из скрипта

# minsa - MINSTART
# minso - MINSTOP
 
      if (( $tval <= $mint ))
        then pwmval=$minpwm # below min temp, use defined min pwm
      elif (( $tval >= $maxt ))
        then pwmval=$maxpwm # over max temp, use defined max pwm
      else
        # calculate the new value from temperature and settings
        pwmval="(${tval}-${mint})*(${maxpwm}-${minso})/(${maxt}-${mint})+${minso}"
        if [ $pwmpval -eq 0 -o $min_fanval -eq 0 ]
        then # if fan was stopped start it using a safe value
              echo $minsa > $pwmo
              # Sleep while still handling signals
              sleep 1 &
              wait
        fi
      fi

Запускаем скрипт

sudo systemctl restart fancontrol.service 

В случае неудачного запуска смотрим логи

sudo journalctl -u fancontrol.service -n100

Если сервис будет остановлен, то перед выходом скрипт установит максимальное значение PWM.











Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
74 +15 = 
 
hardware/asus_x554l_fancontrol.txt · Последнее изменение: 2023/09/18 19:40 — lexa
Gentoo Linux Gentoo Linux Driven by DokuWiki