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


 
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