Сегодня будем разбираться, как избавиться от чёрного экрана при запуске SDDM (замена KDM) в Dell Vostro 5470. Тут я не ставлю целью добиться максимального энергосбережения, т.к. KDE всё равно использует для отрисовки графики OpenGL, ведь суть optimus - использовать для отрисовки 3D как раз nvidia чип, а не встроенный intel. Также мы рассмотрим тему оживления кнопок настроек яркости, а в конце ещё и заставим кнопку suspend уводить ноутбук в ждущий режим.
Итак, чтобы настроить работу Nvidia Optimus нужно, кроме того, что описано в wiki, добавить в настройки sddm строку modesetting. Эта фича не работает в случае, если прописать её в ~/.xinitrc как некоторые советуют. И это ключевой момент.
Итак, чтобы настроить работу Nvidia Optimus нужно, кроме того, что описано в wiki, добавить в настройки sddm строку modesetting. Эта фича не работает в случае, если прописать её в ~/.xinitrc как некоторые советуют. И это ключевой момент.
# vim /usr/share/sddm/scripts/Xsetup xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --autoКасательно xorg.conf. В моём случае выглядит как-то так:
# cat /etc/X11/xorg.conf
Section "ServerLayout"
Identifier "layout"
Screen 0 "nvidia"
Inactive "intel"
EndSection
Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "PCI:09:00:0"
EndSection
Section "Screen"
Identifier "nvidia"
Device "nvidia"
EndSection
Section "Device"
Identifier "intel"
Driver "modesetting"
BusID "PCI:00:02:00"
Option "AccelMethod" "none"
EndSection
Section "Screen"
Identifier "intel"
Device "intel"
EndSection
Теперь по драйверам. Используется проприетарные nvidia-drivers и интеловские драйвера. В make.conf имеется следующее:VIDEO_CARDS="nvidia intel i965 modesetting"Что касается настроек в ядре:
> Device Drivers > Graphics support >
<*> /dev/agpgart (AGP Support) ---> ##есть подозрение, что это совершенно не нужно
{*} Intel 440LX/BX/GX, I8xx and E7x05 chipset support
-*- VGA Arbitration
(16) Maximum number of GPUs
[*] Laptop Hybrid Graphics - GPU switching support
<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
[*] Enable legacy fbdev support for your modesetting driver
<M> Intel 8xx/9xx/G3x/G4x/HD Graphics
Frame buffer Devices --->
[*] Enable Video Mode Handling Helpers
[*] VESA VGA graphics support
-*- Backlight & LCD device support --->
<*> Lowlevel LCD controls
<*> Platform LCD controls
{*} Lowlevel Backlight controls
<*> Generic (aka Sharp Corgi) Backlight Driver
Console display driver support --->
-*- VGA text console
[*] Enable Scrollback Buffer in System RAM
(64) Scrollback Buffer Size (in KB)
(80) Initial number of console screen columns
(25) Initial number of console screen rows
-*- Framebuffer Console support
-*- Map the console to the primary display device
[ ] Framebuffer Console Rotation
[*] Support for the Framebuffer Console Decorations
[*] Bootup logo --->
Ну-с, вроде всё. Теперь перейдём к теме яркости. Почему-то у меня из коробки не работают кнопки увеличения и уменьшения яркости. Т.е. они, конечно, работают как кнопки, но яркость не меняют. Проверим для начала, определяет ли система нажатие на эти кнопки. Для этого запустим acpi_listen и пожмакаем. Должно появиться примерно следующее:
# acpi_listen video/brightnessdown BRTDN 00000087 00000000 K video/brightnessdown BRTDN 00000087 00000000 video/brightnessup BRTUP 00000086 00000000 video/brightnessup BRTUP 00000086 00000000 K ^CЕсли этого не произошло, идём смотреть ядро:
Device Drivers > X86 Platform Specific Device Drivers
<*> Dell Laptop Extras
<*> Dell Latitude freefall driver (ACPI SMO88XX)
<M> Intel PMC IPC Driver
Power management and ACPI options >
[*] Suspend to RAM and standby
[*] Hibernation (aka 'suspend to disk')
() Default resume partition
[ ] Opportunistic sleep
[ ] User space wakeup sources interface
-*- Device power management core functionality
[ ] Power Management Debug Support
[ ] Enable workqueue power-efficient mode by default
[*] ACPI (Advanced Configuration and Power Interface) Support --->
--- ACPI (Advanced Configuration and Power Interface) Support
[ ] AML debugger interface (EXPERIMENTAL)
[ ] Deprecated power /proc/acpi directories
[*] Allow supported ACPI revision to be overriden
< > EC read/write access through /sys/kernel/debug/ec
<*> AC Adapter
<*> Battery
{*} Button
{*} Video
{*} Fan
[*] Dock
<*> Processor
< > Processor Aggregator
<*> Thermal Zone
-*- NUMA support
[ ] ACPI tables override via initrd
[ ] Debug Statements
[ ] PCI slot detection driver
-*- Container and Module Devices
<*> Smart Battery System
< > Hardware Error Device
< > Allow ACPI methods to be inserted/replaced at run time
<M> ACPI NVDIMM Firmware Interface Table (NFIT)
[ ] ACPI Platform Error Interface (APEI)
[ ] PMIC (Power Management Integrated Circuit) operation region support ----
[*] SFI (Simple Firmware Interface) Support ----
CPU Frequency scaling --->
CPU Idle --->
[*] Cpuidle Driver for Intel Processors
Memory power savings --->
<*> Intel chipset idle memory power saving driver
Это должно помочь. Также, у вас должен быть в системе следующий путь:
/sys/class/backlight/intel_backlight/В директории /sys/class/backlight вы также можете обнаружить под-директорию dell_backlight . Скорее всего вы что-то перемудрили с настройками. В целом - то, что эта папка есть, нет ничего страшного, ведь что там не меняй - подсведка меняться не будет.
Если кнопки определились, то пропишем правило скрипту ACPI. Тут привожу скрипт(ы) в полном варианте. Изменённые секции выделены красным.
# vim /etc/acpi/default.sh
#!/bin/sh
# /etc/acpi/default.sh
# Default acpi script that takes an entry for all actions
set $*
group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4
log_unhandled() {
logger "ACPI event unhandled: $*"
}
case "$group" in
button)
case "$action" in
power)
/etc/acpi/actions/powerbtn.sh
;;
*) log_unhandled $* ;;
esac
;;
ac_adapter)
case "$value" in
*) log_unhandled $* ;;
esac
;;
video)
case "$action" in
brightnessdown)
/etc/acpi/actions/brightness.sh -
;;
brightnessup)
/etc/acpi/actions/brightness.sh +
;;
*) log_unhandled $* ;;
esac
;;
*) log_unhandled $* ;;
esac
Ну и сделаем для этого ещё один скрипт:# vim /etc/acpi/actions/brightness.sh
#!/bin/bash
bl_dev=/sys/class/backlight/intel_backlight/
step=10 #set
case $1 in
-) echo $(($(< $bl_dev/brightness) - $step)) >$bl_dev/brightness ;;
+) echo $(($(< $bl_dev/brightness) + $step)) >$bl_dev/brightness ;;
esac
И тут вы можете заметить, что т.к. в acpi_listen одно нажатие кнопки определялось двумя ивентами ACPI, то и изменение яркости будет происходить с двойной силой. Итого, устанавливая step=10 он фактически будет отрабатывать 20-ку. Ну и ладно. Я вот ставил step=1 и сначала думал, что изменение яркости вообще не происходит. 10 - это норма ;)# chmod +x /etc/acpi/actions/brightness.sh
А чтобы два раза не вставать, настроим заодно и поведение кнопки sleep. Я постоянно пользуюсь утилитой pm-suspend и хотел бы отправлять в сон ноут по одному клику. Для начала установим пакет, содержащий pm-suspend.
# emerge sys-power/pm-utilsПосмотрим, как эта кнопка определяется системой:
# acpi_listen button/sleep SBTN 00000080 00000000 K ^CВсё вроде хорошо. Осталось модифицировать наш скрипт.
# cat /etc/acpi/default.sh
#!/bin/sh
# /etc/acpi/default.sh
# Default acpi script that takes an entry for all actions
set $*
group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4
log_unhandled() {
logger "ACPI event unhandled: $*"
}
case "$group" in
button)
case "$action" in
power)
/etc/acpi/actions/powerbtn.sh
;;
# if your laptop doesnt turn on/off the display via hardware
# switch and instead just generates an acpi event, you can force
# X to turn off the display via dpms. note you will have to run
# 'xhost +local:0' so root can access the X DISPLAY.
#lid)
# xset dpms force off
# ;;
sleep)
/usr/sbin/pm-suspend
;;
*) log_unhandled $* ;;
esac
;;
ac_adapter)
case "$value" in
# Add code here to handle when the system is unplugged
# (maybe change cpu scaling to powersave mode). For
# multicore systems, make sure you set powersave mode
# for each core!
#*0)
# cpufreq-set -g powersave
# ;;
# Add code here to handle when the system is plugged in
# (maybe change cpu scaling to performance mode). For
# multicore systems, make sure you set performance mode
# for each core!
#*1)
# cpufreq-set -g performance
# ;;
*) log_unhandled $* ;;
esac
;;
video)
case "$action" in
brightnessdown)
/etc/acpi/actions/brightness.sh -
##echo $group - $action - $device - $id - $id>> /tmp/1.sh
;;
brightnessup)
/etc/acpi/actions/brightness.sh +
##echo $group - $action - $device - $id - $id>> /tmp/1.sh
;;
*) log_unhandled $* ;;
esac
;;
*) log_unhandled $* ;;
esac
На этом всё.Ссылки:
https://wiki.archlinux.org/index.php/acpid
https://wiki.gentoo.org/wiki/ACPI


Тонны благодарности тебе! :)
ОтветитьУдалитьЗавёл кнопки яркости на ideapad u430p