RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Использование ACPI во FreeBSD 6.2 на ThinkPad T42 [2007]
Прежде всего, для нормальной поддержки ACPI нужно загрузить два модуля, указав их в /boot/loader.conf:
acpi_video_load="YES"
acpi_ibm_load="YES"
Первый модуль нужен для того, чтобы после просыпания нормально работало видео, а второй — чтобы devd мог обрабатывать события при нажатии Fn-клавиш.
Надо заметить, что если эти модули собрать статически в ядре
deviceacpi_video
deviceacpi_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";
};
И в заключение, несколько рекомендаций по увеличению времени работы при питании от батареи:
собрать в ядре модуль
devicecpufreq
или загрузить его в /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 в ядре