LINUX.ORG.RU

Записать в Embedded Contorller

 , , , ,


0

1

Доброго времени суток! «Сломался» один единственный вентилятор в ноутбуке после обновления BIOS (Спасибо, HP!). Практически не крутится и на температуру системы ему пофиг. Под виндой помогает Read & Write utility и изменение значения определенного (213) регистра в Embedded Controller + Notebook FanControl для автоматического регулирования. Собстно вопрос - как и чем можно записать заветное значение в нужный (213) регистр в Linux? И желательно поскорее с момента старта системы, ибо ноут нагревается и отрубается :) з.ы. Откатиться на предыдущую версию в различных рекавери режимах ноутбука никак.

Под виндой помогает Read & Write utility и изменение значения определенного (213) регистра в Embedded Controller

НИТО ЧТО ВВАШЕМ ЛИНУПСЕ КРАСНОГЛАЗИТ ВСЁ УДОНО

anonymous
()

Есть прога: ftp://ftp.suse.com/pub/people/trenn/sources/ec/ec_access.c

Работает только тогда, когда есть директория /sys/kernel/debug/ec (т. е. включена опция CONFIG_ACPI_EC_DEBUGFS).

Пользоваться так:

  • скомпилить: gcc ec_access.c -o ec_access
  • выполнить от рута: sudo ./ec_access -w D5 -v <что нужно записать>

Примечание: D5 - это 213 в шестнадцатиричной системе счисления; значение тоже должно быть в ней.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

Если поможет, говори, какой дистрибутив - методы запуска скриптов и программ при старте системы в разных дистрибутивах различаются.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Спасибо! Пересобрал ядро с опцией CONFIG_ACPI_EC_DEBUGFS, все отлично работает. Стоит у меня ElementaryOS 0.2 (Ubuntu 12.04).

А может быть еще подскажите, как мне сие дело автоматизировать? Что глядело температуру и в зависимости от ее значения писало нужную циферку в EC? Или хотя бы как получить температуру на CPU как строку?

c01nd01r
() автор топика
Ответ на: комментарий от c01nd01r

Что за процессор?

Покажи вывод sensors, если таковая есть. Если нет - поставь lm-sensors (или lm_sensors) и попробуй снова.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Intel Core i5-430M

acpitz-virtual-0
Adapter: Virtual device
temp1:        +58.0°C  (crit = +127.0°C)
temp2:         +0.0°C  (crit = +128.0°C)
temp3:         +0.0°C  (crit = +128.0°C)
temp4:        +41.0°C  (crit = +127.0°C)
temp5:         +0.0°C  (crit = +128.0°C)
temp6:        +20.0°C  (crit = +128.0°C)
temp7:         +0.0°C  (crit = +128.0°C)
temp8:         +0.0°C  (crit = +128.0°C)
temp9:         +0.0°C  (crit = +128.0°C)
temp10:        +0.0°C  (crit = +128.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +49.0°C  (high = +95.0°C, crit = +105.0°C)
Core 2:       +46.0°C  (high = +95.0°C, crit = +105.0°C)
c01nd01r
() автор топика
Ответ на: комментарий от c01nd01r

Тогда:

  • файл /sys/devices/platform/coretemp.0/temp1_input содержит температуру процессора (кристалла) в миллиградусах Цельсия
  • костыль для управления вентилятором выглядит так:
    #!/bin/bash
    
    TEMPERATURE_FILE="/sys/devices/platform/coretemp.0/temp1_input"
    
    TIMEOUT=10 # в секундах
    
    function write_fan() {
        if [[ "$1" ]]; then
            ec_access -w D5 -v "$1"
        fi
    }
    
    declare -A FAN_PROFILES
    FAN_PROFILES=(
        [0]="значение для отключенного вентилятора"
        [30000]="значение для минимальной скорости на 30°"
        [60000]="значение для средней скорости на 60°"
        [90000]="значение для максимальной скорости на 90°"
    )
    
    TEMPERATURE_LAST=-1
    
    while true; do
        [[ -r "$TEMPERATURE_FILE" ]] || { echo "Can't read CPU temperature, exiting" >&2; exit 1; }
        TEMPERATURE_INPUT="$(< "$TEMPERATURE_FILE" )"
    
        # найдём максимальный профиль, не превышающий текущей температуры
        TEMPERATURE_CHOSEN=0
        for profile in "${!FAN_PROFILES[@]}"; do
            if (( profile <= TEMPERATURE_INPUT )) &&
               (( TEMPERATURE_CHOSEN < profile )); then
                TEMPERATURE_CHOSEN="$profile"
            fi
        done
    
        if (( TEMPERATURE_CHOSEN != TEMPERATURE_LAST )); then
            echo "debug: profile transition \"$TEMPERATURE_LAST\" -> \"$TEMPERATURE_CHOSEN\"" >&2
            TEMPERATURE_LAST="$TEMPERATURE_CHOSEN"
            write_fan "${FAN_PROFILES["$TEMPERATURE_CHOSEN"]}"
        fi
    
        sleep "$TIMEOUT"
    done
    

Как-то так (не тестировал ни разу, но вроде бы должно работать).
ec_control надо кинуть в /usr/local/bin (или куда-нибудь ещё, но тогда в write_fan() придётся прописать полный путь до файла), скрипт кинуть куда угодно (сделав ему chmod +x, естественно) и добавить в автозапуск.

Как последнее делается в апстарте - понятия не имею, но может сработать добавление в /etc/rc.local строки вида <полный_путь_до_скрипта> &.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.