LINUX.ORG.RU

Регулировка подсветки дисплея при помощи acpi_video во FreeBSD

 , , , ,


1

2

Шалом, котаны.

На некоторых ноутбуках нет возможности регулировки подсветки при помощи intel_backlight, xbacklight etc, аппаратные клавиши подсветки не работают. Такое же разочарование ждало меня и с HP Pavillion dv4-1050er (видео - GeForce 9200M GS). Однако опытным путём было установлено, что ядерный модуль acpi_video создаёт строку hw.acpi.video.lcd0.brightness в sysctl, которая всё-таки позволяет менять яркость подсветки. Чтобы не дёргать каждый раз sysctl, я набросал небольшой скрипт для удобства, так сказать. Вдруг кому-нибудь пригодится. Модуль acpi_video.ko должен быть загружен (в /boot/loader.conf acpi_video_load="YES"). Работает, как и предыдущий скрипт, от имени суперпользователя.

#!/bin/sh

acpi_backlight_sysctl="sysctl"
ACPI_BACKLIGHT_VALUE_SYSCTL="hw.acpi.video.lcd0.brightness"
ACPI_BACKLIGHT_VALUE_MIN="0"
ACPI_BACKLIGHT_VALUE_MAX="$(($(${acpi_backlight_sysctl} -n hw.acpi.video.lcd0.fullpower) / 10))"
ACPI_BACKLIGHT_OPT1="$1"
ACPI_BACKLIGHT_OPT2="$2"

[ "$(id -u)" -eq "0" ] || { echo "Only root can run $(basename $0)." ; exit 1 ; }

acpi_backlight_help_msg() {
    ACPI_BACKLIGHT_BASENAME="$(basename $0)"
    echo "Use: ${ACPI_BACKLIGHT_BASENAME} <+|-|=> <DEC_VALUE>"
    echo "     ${ACPI_BACKLIGHT_BASENAME} -q"
    echo "Max value can be no more ${ACPI_BACKLIGHT_VALUE_MAX}"
    exit 0
}

ACPI_BACKLIGHT_VALUE_PRESENT="$(($(${acpi_backlight_sysctl} -n ${ACPI_BACKLIGHT_VALUE_SYSCTL}) / 10))"

if [ "$1" = "-q" ] ; then
    echo "${ACPI_BACKLIGHT_VALUE_PRESENT}" ; exit 0
fi

if [ ! "$2" ] ; then
    echo "Current value is ${ACPI_BACKLIGHT_VALUE_PRESENT}"
    acpi_backlight_help_msg
fi

if [ "$1" = "+" -o "$1" = "-" ] ; then
    ACPI_BACKLIGHT_VALUE_EXP="$((${ACPI_BACKLIGHT_VALUE_PRESENT} ${1} ${ACPI_BACKLIGHT_OPT2}))"
elif [ "$1" = "=" ] ; then
    ACPI_BACKLIGHT_VALUE_EXP="${ACPI_BACKLIGHT_OPT2}"
else
    acpi_backlight_help_msg
fi

if [ "${ACPI_BACKLIGHT_VALUE_EXP}" -gt "${ACPI_BACKLIGHT_VALUE_MAX}" ] ; then
    echo "Value (${ACPI_BACKLIGHT_VALUE_EXP}) must not be greater than ${ACPI_BACKLIGHT_VALUE_MAX}" ; exit 1
elif [ "${ACPI_BACKLIGHT_VALUE_EXP}" -lt "0" ] ; then
    echo "Value (${ACPI_BACKLIGHT_VALUE_EXP}) must not be less than 0" ; exit 1
fi

echo "Set backlight: ${ACPI_BACKLIGHT_VALUE_PRESENT} -> ${ACPI_BACKLIGHT_VALUE_EXP}"
${acpi_backlight_sysctl} ${ACPI_BACKLIGHT_VALUE_SYSCTL}=$((${ACPI_BACKLIGHT_VALUE_EXP} * 10)) > /dev/null
И на pastebin.
Проверено на FreeBSD-12.0-RELEASE, но скорее всего будет работать на любой версии, где есть acpi_video.
По всем вопросам обращайтесь в личку.

★★★★★

Твой шеллскрипт меня расстраивает…

Вот не поленился я, включил ноут, скопировал свой вариант (с поправкой на твой юзкейс):

#!/bin/sh

die() {
  echo "${@}" >&2
  exit 1
}

case ${1} in
  (+)
    level="$(sysctl -n hw.acpi.video.lcd0.brightness)"
    level=$(( (level / 10 + 1) * 10))
    [ ${level} -gt 100 ] && level=100
    sysctl hw.acpi.video.lcd0.brightness=${level}
    lvl="$(sysctl -n hw.acpi.video.lcd0.brightness)"
    ;;
  (-)
    level="$(sysctl -n hw.acpi.video.lcd0.brightness)"
    level=$((( (level + 1) / 10 - 1) * 10))
    [ ${level} -lt 5 ] && level=5
    sysctl hw.acpi.video.lcd0.brightness=${level}
    lvl="$(sysctl -n hw.acpi.video.lcd0.brightness)"
    ;;
  (=)
    shift
    case "${1}" in
      ('') die "Not enough arguments." ;;
      ([0-9])
        if [ ${1} -lt 5 ]; then
          die "Value must be greater than or equal 5."
        elif ${1} -gt 100 ]; then
          die "Value must be less than or equal 100."
        fi
        sysctl hw.acpi.video.lcd0.brightness=${1}
        lvl="${1}"
        ;;
      (*) die "Value must be integer." ;;
    esac
    sysctl hw.acpi.video.lcd0.brightness=${1}
    lvl="${1}"
    ;;
  (*) die "Invalid argument: ${1}." ;;
esac
echo "Brightness: ${lvl}%"

// Подсветка синтаксиса для sh сломана.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Я просто не очень люблю case :) Хотя да, стоит, наверное, переписать с его использованием.

IPR ★★★★★
() автор топика
Ответ на: комментарий от IPR

Я просто не очень люблю case

На if-ах код превращается в нечитабельную кашу.

А в случае с вторым case=) я сэкономил на [ "$(echo "${1}" | grep -v "[0-9]*")" != "" ], а проверка на integer как бы не помешает.

mord0d ★★★★★
()

аппаратные клавиши подсветки не работают.

Можно запустить devd -d и посмотреть, выдает ли оно при нажатии клавиш какие-то ивенты. Если да, то можно привязать скрипт, типа:

notify 0 {
        match "system"          "ACPI";
        match "subsystem"       "IBM";
        match "notify"          "0x10";
        action                  "/usr/local/tools/bin/bright.sh";
};
(это я визуализацию через osd_cat привязал  — сама подсветка у меня в тинкпаде «жестко прибита» к клавишам и регулируется еще до бута в ОС)
https://pic4a.ru/99/e4-.png
/usr/local/bin/osd_cat --font="Input, Symbola 20" \ 
--shadow=0  --outline=1 --color="#00EE22" --pos=bottom --offset=80 --align=center --lines=3 -T "🔆 $val/15" -B 15  --delay=2 --barmode=percentage  -P $perc &

anonymous
()
23 декабря 2019 г.

а как мне регулировать яркость дисплея? sysctl hw.acpi hw.acpi.video.lcd0.active: 1

root@F3ja:/home/luba # pciconf -lv hostb0@pci0:0:0:0: class=0x060000 card=0x11971043 chip=0x06611039 rev=0x11 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘661FX/M661FX/M661MX Host’ class = bridge subclass = HOST-PCI pcib1@pci0:0:1:0: class=0x060400 card=0x00000000 chip=0x00031039 rev=0x00 hdr=0x01 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘AGP Port (virtual PCI-to-PCI bridge)’ class = bridge subclass = PCI-PCI isab0@pci0:0:2:0: class=0x060100 card=0x00000000 chip=0x09641039 rev=0x36 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘SiS964 [MuTIOL Media IO] LPC Controller’ class = bridge subclass = PCI-ISA atapci0@pci0:0:2:5: class=0x010180 card=0x11971043 chip=0x55131039 rev=0x01 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘5513 IDE Controller’ class = mass storage subclass = ATA none0@pci0:0:2:6: class=0x070300 card=0x18161043 chip=0x70131039 rev=0xa0 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘AC’97 Modem Controller’ class = simple comms subclass = generic modem pcm0@pci0:0:2:7: class=0x040100 card=0x11931043 chip=0x70121039 rev=0xa0 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘SiS7012 AC’97 Sound Controller’ class = multimedia subclass = audio ohci0@pci0:0:3:0: class=0x0c0310 card=0x11971043 chip=0x70011039 rev=0x0f hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘USB 1.1 Controller’ class = serial bus subclass = USB ohci1@pci0:0:3:1: class=0x0c0310 card=0x11971043 chip=0x70011039 rev=0x0f hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘USB 1.1 Controller’ class = serial bus subclass = USB ohci2@pci0:0:3:2: class=0x0c0310 card=0x11971043 chip=0x70011039 rev=0x0f hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘USB 1.1 Controller’ class = serial bus subclass = USB ehci0@pci0:0:3:3: class=0x0c0320 card=0x11971043 chip=0x70021039 rev=0x00 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘USB 2.0 Controller’ class = serial bus subclass = USB sis0@pci0:0:4:0: class=0x020000 card=0x14551043 chip=0x09001039 rev=0x90 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘SiS900 PCI Fast Ethernet’ class = network subclass = ethernet cbb0@pci0:0:9:0: class=0x060700 card=0x11971043 chip=0x04761180 rev=0xb3 hdr=0x02 vendor = ‘Ricoh Co Ltd’ device = ‘RL5c476 II’ class = bridge subclass = PCI-CardBus none1@pci0:0:9:1: class=0x0c0010 card=0x11971043 chip=0x05521180 rev=0x08 hdr=0x00 vendor = ‘Ricoh Co Ltd’ device = ‘R5C552 IEEE 1394 Controller’ class = serial bus subclass = FireWire sdhci_pci0@pci0:0:9:2: class=0x080500 card=0x11971043 chip=0x08221180 rev=0x17 hdr=0x00 vendor = ‘Ricoh Co Ltd’ device = ‘R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter’ class = base peripheral subclass = SD host controller none2@pci0:0:9:3: class=0x088000 card=0x11971043 chip=0x05921180 rev=0x08 hdr=0x00 vendor = ‘Ricoh Co Ltd’ device = ‘R5C592 Memory Stick Bus Host Adapter’ class = base peripheral vgapci0@pci0:1:0:0: class=0x030000 card=0x19211043 chip=0x63301039 rev=0x00 hdr=0x00 vendor = ‘Silicon Integrated Systems [SiS]’ device = ‘661/741/760 PCI/AGP or 662/761Gx PCIE VGA Display Adapter’ class = display subclass = VGA

Ноутбук ASUS A9T, видо интегрированое SIS 315 Хотел бы настроить регулировку, но ни в какую redshift: root@F3ja:/home/luba # redshift -l 55.7:12.6 -b 0.9:0.5 -m randr -v Solar elevations: day above 3.0, night below -6.0 Температуры: 5700K днём, 3500K ночью Яркость: 0.90:0.50 Гамма (День): 0.800, 0.800, 0.800 Гамма (Ночь): 0.800, 0.800, 0.800 Gamma ramp size too small: 0 Не удалось использовать метод корректировки randr.

Elimelech
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.