• Есть ли возможность управлять скоростью вращения cooler'a CPU на (X)Ubuntu 14.04 на ноутбуке Lenovo B590?

    @pkkk
    Решил эту проблему на своем b590 (модель с процессором Pentium 2020M, видео встроенное), линукс. Для Windows, полагаю, все аналогично, но инструменты придется использовать другие.

    Пришлось порыться, в итоге выяснилось, что модуль ядра thinkpad_acpi (именно его использует утилита sensors и другие) работает некорректно на этой модели. Т.е. информацию о температуре он читает правильно (похоже эти данные находятся там же где и у Think Pad-ов), а вот скорость вентилятора считывает/устанавливает неверно.

    Помогла утилита acer_ec.pl (чтение и запись в регистры Embedded Controller-а), описание

    Итак, выполняем команду (тут и далее всё делаем от рута):
    perl acer_ec.pl regs
    вывод будет примерно такой
    __ |   00	01	02	03	04	05	06	07	|	08	09	0A	0B	0C	0D	0E	0F
      	__	__	__	__	__	__	__	__	|	__	__	__	__	__	__	__	__
    00 |	0	0	20	0	0	0	0	0	|	0	0	4	20	0	0	0	48	
    10 |	3	0	4	0	0	0	0	0	|	0	0	0	0	0	0	0	0	
    20 |	0	0	0	0	0	0	0	0	|	0	0	0	0	0	0	0	0	
    30 |	0	0	0	0	0	0	0	0	|	0	0	0	0	0	0	0	0	
    40 |	0	0	0	0	0	0	0	0	|	0	8	9	0	0	0	0	0	
    50 |	35	0	163	108	0	0	1	0	|	140	0	4	24	1	29	11	14	
    60 |	0	0	0	0	0	0	0	0	|	0	0	0	0	0	0	0	0	
    70 |	98	51	20	0	8	97	0	0	|	8	1	0	65	0	0	0	0	
    80 |	0	0	0	0	0	0	0	0	|	137	0	0	6	0	0	0	0	
    90 |	0	2	0	4	196	199	0	0	|	0	177	0	0	0	0	4	11	
    A0 |	129	128	128	128	128	128	128	128	|	39	35	35	0	57	14	37	33	
    B0 |	128	128	128	0	0	0	0	0	|	26	0	11	0	0	0	0	3	
    C0 |	4	2	176	4	4	0	0	0	|	0	0	0	0	0	0	0	0	
    D0 |	45	27	60	55	78	73	84	80	|	85	81	87	72	88	89	0	0	
    E0 |	0	0	0	0	0	0	0	0	|	0	0	0	0	0	0	0	0	
    F0 |	72	57	69	67	48	57	87	87	|	40	49	46	48	50	41	32	0


    Обратим внимание на значения в ячейках [0x93],[0x94],[0x95], если они ненулевые и [0x93] == 4, а [0x94] и [0x95] примерно в районе 200 (хотя эти 2 значения могут варьироваться), то у вас мой случай и далее надо читать следующий пост (да-да, именно в ветке про acer aspire):
    forum.notebookreview.com/threads/acer-aspire-timel... (там же пользователи Windows могут почитать про аналоги acer_ec.pl для этой ОС)

    В частности, там можно найти следующее:
    [0x93] - CPU fan: Fan mode. 0x04 Auto, 0x14 Manual
    [0x94] - CPU fan: Desired fan speed. 0x00-0xFF. With 0x00 being max speed and 0xFF means fan is off
    [0x95] - CPU fan: Actual fan speed (in %? See note below).
    следовательно, выходит, у нас вентилятор в автоматическом режиме (т.к. [0x93] == 0x04), а чтобы понизить обороты необходимо выставить ручной и далее задать самому скорость.

    Несколько примеров (опять запускаем из-под рута):
    #поставить небольшую скорость
    perl acer_ec.pl := 0x93  0x14
    perl acer_ec.pl := 0x94  0xe0   #можно поэкспериментировать с этим значением
    #выключить вентилятор вовсе
    perl acer_ec.pl := 0x93  0x14
    perl acer_ec.pl := 0x94  0xff
    #перевести обратно в автоматический режим
    perl acer_ec.pl := 0x93  0x04


    Мой скрипт, который вызывается cron-ом раз в минуту
    root@b590:~# crontab -l
    * * * * * PATH="$PATH:/root/ec" fan_control.sh

    и выставляет обороты вентилятора в зависимости от температур возващаемых командой sensors. Не уверен, что этот вариант самый красивый и безопасный, но патчить thinkpad_acpi или что-то подобное желания не было.
    fan_control.sh (название скрипта) и acer_ec.pl (с правами на запуск chmod +x acer_ec.pl) должны находиться в /root/ec
    #!/bin/bash
    temp= -- текущая температура CPU, опубликую позже
    ec95=`acer_ec.pl ?= 0x95| grep 0xff`
    
    if [ $temp -lt 64 ]; then
            val=0xff #off
            if [ -z "$ec95" ] && [ $temp -gt 44 ]; then
                    val=0xe0 #lite
            fi
    elif [ $temp -lt 70 ]; then
            val=0xc0 #medium
    fi
    
    echo `date` ${temp}C $val >> /tmp/fan_control.log
    
    if [ -z $val ]; then
            acer_ec.pl := 0x93  0x04
    else
            acer_ec.pl := 0x93  0x14
            acer_ec.pl := 0x94  $val
    fi
    Ответ написан
    Комментировать