Прежде всего, для нормальной поддержки 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/wpa_supplicant stop iwi0
/sbin/ifconfig iwi0 down
/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
/sbin/ifconfig iwi0 up
/etc/rc.d/wpa_supplicant 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";
};