ati radeon и нерабочая регулировка яркости


Являясь счастливым обладателем ноутбука с графикой от ATI, я испытал необычайное чувство радости, когда, после обновления Ubuntu 10.04 до 12,04 я увидел, что регулировка яркости не работает с проприетарными драйверами fglrx от AMD.

Тогда я откатился к open source драйверам radeon в надежде, что там все работает.

Да, ну почти да. Там работает все, за исключением 3d и аппаратного ускорения.

Увы, увы, но Unity 3d так и не запустился, несмотря на все мои танцы с бубном. Вероятней всего, из-за того, что неподдерживаемая серия карточек HD 5xxx не поддерживает 3d, а у меня карта модели 5650.

Захотев всех прелестей новой Unity, после долгосрочного и скучного времяпровождения в Gnome 2, я опять поставил fglrx драйвер, скачав его с сайта производителя (ссылка выше), правда выбрал версию постарше, т.к. на старой Ubuntu LTS реглировка яркости вполне прилично работала. Виной всему, как мне кажется, является новое ядро от Ubuntu — 3.2.0-24.

Речь идет о нажатии на специальные Fn кнопки: Fn + F6/F7 для увеличения или уменьшения яркости подсветки экрана.

Солнечный ползунок изменяется, что нельзя сказать о самой яркости дисплея.

Порывшись на форумах и ничего не обнаружив, кроме десятка багов на Launchpad на эту тему, я решил написать скрипты для ручного изменения яркости и привязать их к клавишам.

Сначала нужно найти файл, отвечающий за яркость. Это оказалось несложно. В моем случае это был — */sys/class/backlight/acpi_video0/brightness хотя попался еще один, который не работал — /sys/class/backlight/toshiba/brightness*

Эти файлы содержат число, которое может изменяться в пределах от 0 до 8, это справедливо в моем случае, для других моделей степень градации может отличаться.

Получается, чтобы поменять яркость, нужно всего лишь задать нужное число в файл, но не все так просто, как кажется.

На практике оказалось, что менять значение в этом файле может только привилегированный пользователь с id=0. Я сначала было подумал, что достаточно задать скрипту хозяина root и поставить setuid и дело в шляпе, но защита системы не позволяет выполнять скрипты с рутовым setuid, они продолжают запускаться с id все того же пользователя.

Поэтому я решил остановиться на бинарной программе, которая будет запускать мой скрипт.

Это небезопасно с точки зрения системного администратора, но с точки зрения конечного пользователя, мне нужней мои глаза, т.к. максимальная яркость экрана далеко не всегда приятна и уместна.

Для начала, напишем маленькую программу на C.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main( int argc, char *argv[] )
{
    setuid( 0 );
    system( argv[1] );
    return 0;
}

Она берет в качестве аргумента любую другую программу или скрипт и запускает её с id 0.

Сохраним наш код в файл, например runscript.c и скомпилируем его.

gcc runscript.c -o runscript

Получим на выходе бинарный файл runscript, но он все еще не будет работать так, как нам нужно. Дадим ему рутовые права.

su -
chown root runscript
chmod 4750 runscript

Проверьте, чтоб группа скрипта была такая же, как и ваш пользователь, иначе не сможете запустить его.

Теперь создадим парочку скриптов, я приведу только один из них — для понижения яркости, т.к.   второй будет отличаться от него только знаком и названием.

insider@home:~$ cat ~/Documents/scripts/brightness_down.sh
#!/bin/bash
BRIGHTNESS=`cat /sys/class/backlight/acpi_video0/brightness`
# Во втором скрипте будет знак +
BRIGHTNESS=$(($BRIGHTNESS-1))
echo $BRIGHTNESS > /sys/class/backlight/acpi_video0/brightness

Зачмодим оба скрипта, чтоб они стали исполняемыми.

chmod +x ~/Documents/scripts/brightness_{down,up}.sh

Теперь проверим, работает ли наша программа в координации со скриптами.

./runscript ~/Documents/scripts/brightness_down.sh
./runscript ~/Documents/scripts/brightness_up.sh

Если вы все сделали как в инструкции, то должно работать.

Теперь осталось поставить на них удобные комбинации клавиш, я выбрал

правый Ctrl + ArrowUp/ArrowDown.

Вот и все. Наслаждаемся нормальным переключением яркости и 3d.

P.S. Чтоб проверить, поддерживает ли ваша видеокарта Unity 3d запустите следующую программу в работающих «иксах».

insider@home:~$ /usr/lib/nux/unity_support_test -p
OpenGL vendor string:   ATI Technologies Inc.
OpenGL renderer string: AMD Radeon HD 6500M/5600/5700 Series
OpenGL version string:  4.2.11399 Compatibility Profile Context

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  yes
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  yes
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       yes
comments powered by Disqus