Asus EeePC 1011cx и костыли с подсветкой

В моём хозяйстве появилась маленькая железка для ведения логов лекций и прочего рукописного стаффа: я из того поколения людей, которым проще печатать, чем писать. Собственно, железко на Яндекс.Маркете — характеристики и прочую отзывоту можете прочитать там. Я же вам расскажу о костылях с Linux-ом.

UPD: описанные далее костыли актуальны для версии ядра Linux 3.8. В ядре 3.9 сделали что-то, и теперь изменение яркости работает “искаропки” на данном девайсе (то есть адекватно воспринимается, например, xfce4-power-manager-ом). Необходимость нижеописанного костыля ставится под сомнение (если у вас не Debian ;))

Начнём с того, что железка 32-хбитная: в 2013-м году это выглядит ужасающе, но пока что Arch не выкинул поддержку i686 из своих реп (да и Xilitra свою бету таки выкатит летом), так что это не столь печально. А вот четырёхядерный (привет гипертредингу!) тридцатидвухбитный проц — это заставляет шаблоны трещать аки жёсткие диски 90-х годов под Windows XP без сервиспаков ;) Что интересно — про гипертрединг в рекламных материалах к данному ноутбуку не говорится ни слова, не удивлюсь, если под виндой его выключают.

Wi-Fi модуль и прочие стандартные вещи любой современный Linux на этом нетбуке подхватит “искаропки”. Тачпад мимикрирует под PS/2 мышь, и его функционал напрямую зависит от настроек вашего дистрибутива, DE, машины времени и фазы луны (и установленности пакета xf86-input-mouse). Батарейки даже без особой настройки в режиме “юзаем как печатный станок и тестируем всё, что тестируется” хватает на 6 с половиной часов — как раз на учебный день или около того. Всё бы ничего, но есть у этого нетбука беда — и это его серьёзная и главная беда.

Главная беда в этой железке — видео. Обычно Intel славится своими открытыми дровами ко всему своему железу, но это — печальное исключение: чип Cedar Trail разработан не ими, так что об официальных открытых дровах под этот наш пингвин можно забыть. Об официальных закрытых драйверах тоже можно забыть — они рассчитаны на древние ядро, Xorg и Mesa. Но у сообщества таки хватило сил накатать нечто вроде драйвера, о чём мы сейчас и поговорим.

Под Arch пакет с данным драйвером называется xf86-video-modesetting и не требует дополнительной настройки (в арче: ваш дистрибутив может обладать иными представлениями о действительности). Судя по названию, я могу предположить, что это generic-драйвер, юзающий KMS в качестве опоры для работы — но я могу ошибаться. Учтите, что если у вас стоит драйвер vesa — без дополнительной настройки грузиться будет он, а не modesetting, из-за чего производительность упадёт ниже плинтуса (именно этим объясняются тормоза Ubuntu 13.04 LiveCD). Про этот драйвер следует знать следующее:

  1. аппаратное ускорение видео не будет работать (пока кто-то не сподобится написать нормальный драйвер или открыть и пофиксить проприетарный), так что этот ваш mplayer будет декодить видео на процессоре, и о FullHD можно забыть (хотя кто будет смотреть FullHD-видео на десятидюймовом экранчике с разрешением 1024х600?)
  2. все аппаратные клавиши, связанные с экраном (яркость, переключение на VGA/HDMI) не работают из коробки изменение яркости не работает штатными средствами.

Подчёркиваю, штатными средствами. Ибо есть костыль, который я честно стырил из арчевики (правда, там говорилось про ноутбук Samsung с похожей проблемой), и применил под свои нужды. Код костыля ниже:

#!/bin/bash
var1=`setpci -s 00:02.0 F4.B`
var1d=$((0x$var1))
case "$1" in
       up)
               #calculate new brightness
               var2=`echo "ibase=10; obase=16; a=($var1d+16);if (a < 255) print a else print 255" | bc`
               echo "$0: increasing brightness from 0x$var1 to 0x$var2"
               setpci -s 00:02.0 F4.B=$var2
               ;;
       down)
               #calculate new brightness
               var2=`echo "ibase=10; obase=16; a=($var1d-16);if (a > 15) print a else print 15" | bc`
               echo "$0: decreasing brightness from 0x$var1 to 0x$var2"
               setpci -s 00:02.0 F4.B=$var2
               ;;
       set)
               #n.b. this does allow "set 0" i.e. backlight off
               echo "$0: setting brightness to 0x$2"
               setpci -s 00:02.0 F4.B=$2
               ;;
       get)
               echo "$0: current brightness is 0x$var1"
               ;;
       toggle)
               if [ $var1d -eq 0 ] ; then
                       echo "toggling up"
                       setpci -s 00:02.0 F4.B=FF
               else
                       echo "toggling down"
                       setpci -s 00:02.0 F4.B=0
               fi
               ;;
       *)
               echo "usage: $0 {up|down|set |get|toggle}"
               ;;
esac
exit 0

Данный скрипт использует очень ценную и полезную для нас утилиту setpci для нужной нам цели — регулировки яркости. Яркость регулируется на самом “нижнем” уровне: эксперименты с этой утилитой могут привести к беде, так что не советую особо баловаться с этой тулзой. В нашем же случае эта тулза шлёт в соответствующий регистр видюхи сигнал об установлении яркости ниже/выше/на определённый уровень, например (допустим, что наш скрипт назван backlight.sh; все действия идут от суперпользователя):

  • backlight.sh up — поднимает яркость экрана
  • backlight.sh down — опускает яркость экрана
  • backlight.sh toggle — включает экран (яркость 100%) или выключает экран (яркость 0%, аналогично команде vbetool dpms off)
  • backlight.sh set [шестнадцатеричная цифра, например 0f] — задаёт яркость, 00 — минимум (выключенный экран), ff — максимум
  • backlight.sh get — выплёвывает текущую яркость.

Теперь на кнопки Fn+F4 и Fn+F5 можно повесить команды backlight.sh down и backlight.sh up соответственно (озаботьтесь тем, чтобы они запускались от суперюзера правильно!) средствами вашего DE. Да, пока что это не решение по автоматической регулировке яркости, но уже что-то: /me в поисках чего-нибудь типа power manager-а, к которому можно будет прикрутить данный скрипт :) Надеюсь, данный скрипт сэкономит вам немного нервов.

Данный пост написан на Asus EeePC 1011cx, на котором установлен Archlinux и Xfce вместо DE.