б═

Персональный
сайт
Игоря
Сысоева


б═
english
обо мне
б═
sysoev.ru
б═
nginx
б═
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
б═
б═

Использование ACPI во FreeBSD 6.2 на ThinkPad T42

б═

01.05.2007

Прежде всего, для нормальной поддержки ACPI нужно загрузить два модуля, указав их в /boot/loader.conf:

acpi_video_load="YES"
acpi_ibm_load="YES"

Первый модуль нужен для того, чтобы после просыпания нормально работало видео, а второйб═Б─■ чтобы devd мог обрабатывать события при нажатии Fn-клавиш.

Надо заметить, что если эти модули собрать статически в ядре
device  acpi_video
device  acpi_ibm
то они не будут работать. Скорее всего, это специфика модулей acpi.

Модулю acpi_video нужно разрешить сбрасывать видео после просыпания:

sysctl hw.acpi.reset_video=1

Если засыпание было вызвано в X Window, то сначала делается переключение из графики в текстовую консоль, а уже затем происходит собственно засыпание. Это переключение можно запретить с помощью

sysctl hw.syscons.sc_no_suspend_vtswitch=1
однако при просыпании на экране ничего не будет видно и нужно вручную переключиться в текстовый режим, а затем обратно в X Window.

Для того, чтобы некоторые устройства нормально работали после просыпания, их нужно сначала выключить в скрипте /etc/rc.suspend, а затем включить снова в скрипте /etc/rc.resume. В мой /etc/rc.suspend я добавил отключение wifi, мыши и полное отключение подсветки LCD:

# kldunload usb

/etc/rc.d/netif stop iwi0
/etc/rc.d/moused stop
/usr/local/bin/radeontool light off

logger -t $subsystem suspend at `date +'%Y%m%d %H:%M:%S'`
Скрипт /etc/rc.resume делает обратную процедуру:
# kldload usb

/usr/local/bin/radeontool light on
/etc/rc.d/moused start
/etc/rc.d/netif start iwi0

logger -t $subsystem resumed at `date +'%Y%m%d %H:%M:%S'`

Явное выключение подсветки LCD нужно потому, что, по-видимому, BIOS при засыпании сам этого не делает, и из-за этого в спящем режиме быстрее расходуется батарея. Программа radeontool берётся из порта sysutils/radeontool.

Однако скрипт /etc/rc.suspend запускается только в том случае, если засыпание было вызвано командой acpiconf -s 3, а по клавише Fn-F4 он не запускается. Поэтому нужно отменить действие этой клавиши

sysctl hw.acpi.sleep_button_state=NONE
и разрешить генерацию событий по нажатию Fn-клавиш:
sysctl dev.acpi_ibm.0.events=1
Эти события будут обрабатываться демоном devd. Для клавиши Fn-F4 в файл /etc/devd.conf нужно добавить описание того, что нужно запускать при её нажатии (код 0x04):
notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "IBM";
        match "notify"          "0x04";
        action                  "/usr/sbin/acpiconf -s 3";
};

Аналогично можно добавить выключение и включение экрана при нажатии клавиши Fn-F3:

notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "IBM";
        match "notify"          "0x03";
        action                  "/etc/local/backlight";
};

Скрипт /etc/local/backlight:

#!/bin/sh

radeontool=/usr/local/bin/radeontool
on="The radeon backlight looks on"

if [ "`$radeontool light`" = "$on" ]; then
    $radeontool light off
else
    $radeontool light on
fi

При закрывании ноутбука можно настроить переход в спящий режим по аналогии с обработкой клавиши Fn-F4. Я же предпочёл только полное выключение LCD:

notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "Lid";
        match "notify"          "0x00";
        action                  "/usr/local/bin/radeontool light off";
};

notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "Lid";
        match "notify"          "0x01";
        action                  "/usr/local/bin/radeontool light on";
};

И в заключение, несколько рекомендаций по увеличению времени работы при питании от батареи:

  • собрать в ядре модуль
    device          cpufreq
    
    или загрузить его в /boot/loader.conf:
    cpufreq_load="YES"
    
  • разрешить запуск powerd в /etc/rc.conf:
    powerd_enable="YES"
    powerd_flags="-a maximum -b adaptive"
    
  • разрешить динамическое изменение частоты видео-чипа в /etc/X11/xorg.conf:
    Section "Device"
        VendorName  "ATI Technologies Inc"
        Driver      "ati"
        Option      "DynamicClocks" "on"
        ...
    EndSection
    
  • уменьшить частоту переключения процессов с 1000Hz до 100Hz в ядре
    options         HZ=100
    

(C) Игорь Сысоев
http://sysoev.ru