Блог о Gentoo и около-линуксовым штукам

29 августа 2016 г.

Vostro 5470: про Optimus и кнопки настройки яркости

5:32 Опубликовал Дмитрий Исаенко , , Нет комментариев
Сегодня будем разбираться, как избавиться от чёрного экрана при запуске SDDM (замена KDM) в Dell Vostro 5470. Тут я не ставлю целью добиться максимального энергосбережения, т.к. KDE всё равно использует для отрисовки графики OpenGL, ведь суть optimus - использовать для отрисовки 3D как раз nvidia чип, а не встроенный intel. Также мы рассмотрим тему оживления кнопок настроек яркости, а в конце ещё и заставим кнопку suspend уводить ноутбук в ждущий режим.

Итак, чтобы настроить работу 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

0 коммент.:

Отправить комментарий