Яркость Dell - при регулировке клавишами изменяется на две ступени за одно нажатие и плохо доходит до GnomePowerManager :) (GPM, computer_backlight+dell_lcd_panel, brightness_in_hardware и все-в)

Всё, что связано с ноутбуками.

Модератор: Модераторы разделов

forester
Сообщения: 3
ОС: GNU/Linux

Яркость Dell - при регулировке клавишами изменяется на две ступени за одно нажатие и плохо доходит до GnomePowerManager :)

Сообщение forester »

UPD Вопрос можно считать снятым - заплатки, затычки и костыли найдены и применены. Баг1 устранен, Баг2 устранен, Баг3 исследуется - судя по багрепортам, он живет и в дебиане, и в убунте, и не один год, и странствует по разным релизам, то приходя, то уходя, и панацеи от него ни одна собака не предлагает. GPM ивенты критикал чардж и чардж экшн в логе показывает, но с их срабатыванием есть какая-то нечеткость - то нотификейшн показывается или хрюкает, то нет, suspend2disk по крайней мере иногда происходит. ;) Исследуем...
За сочувствие и моральную поддержку всем Большое Человеческое Спасиба. :P

-------------------------------------------------------------------


Ноут Dell 500 (2008год, intel Crestline GM965)
Яркость надо понимать регулируется аппаратно, ибо регулировалась во время хождения по настройкам биоса, регулируется в процессе загрузки, в консоле и т.д.
Debian Lenny, Ubuntu 8xx, FCкакая-то годовалая
(работаю в первом, в остальные заглядывал)

Баг1
В убунту и ФС при нажатии клавиш регулировки яркости оная меняется на два шага сразу. Т.е. из минимального уровня можно подняться как 0 - 2 - 4 - 6 - 7, а затем спуститься 7 - 5 - 3 - 1 - 0.
В ленни регулировка работала нормально, потому что: при пользовании "фирменных" клавиш в дмесг сыпались ворнинги, что для них не определена карта сканкод->кейкод в драйвере, после добавления таковой - картина та же, что в убунте и ФС.

Баг2
Регулировка яркости с клавиатуры где-то не доходит до GnomePowerManager - это жывотное получая клавиатурные нажатия где-то не сбрасывает кэшированное значение, как я подозреваю, и то и дело перезаписывает его вниз поверх текущего - яркость дергается с установленной клавишами на нечто, установленное GPM, при открытии его панели настроек, после выхода из скринсейвера и, возможно, иногда через случайные промежутки времени "просто так". Причем апплет гнома "регулировка яркости" измененную с клавиш яркость читает нормально - а он ее запрашивает через дбас с GPM, наск я вижу - когда кликаешь, то в появившемся ползунке движок сдвинут на тот уровень, который выставил клавишами. Дальше смешнее, апплет отсылает значение обратно на GPM через тот же дбас даже если ползун не двигать - и при этом значение в GPM обновляется как надо - после "открыть - закрыть апплет", если открыть контрольную панель GPM, то ползун в нем сдвинулся аналогично апплетовскому, и т.о. выставленная с клавиш яркость легитимировалась и получила прописку. :)

Дальше подробности

Остановка acpid картины не меняет.
Нажатия клавиш через него проходят, в debug-е логит: acpid: expanded "/etc/acpi/video_brightnessup.sh" -> "/etc/acpi/video_brightnessup.sh",
acpi_listen на нажатия выводит video LCD 00000086 00000000

rmmod video - яркость регулироваться перестает

выключение /sys/module/video/parameters/brightness_switch_enabled картины не меняет

Дальше интереснее.

Код: Выделить всё

~$ lshal  |  grep -C3 laptop_panel
udi = '/org/freedesktop/Hal/devices/computer_backlight'
  info.capabilities = {'laptop_panel'} (string list)
  info.category = 'laptop_panel'  (string)
  info.interfaces = {'org.freedesktop.Hal.Device.LaptopPanel'} (string list)
  info.parent = '/org/freedesktop/Hal/devices/computer'  (string)
  info.product = 'Generic Backlight Device'  (string)
  info.subsystem = 'backlight'  (string)
  info.udi = '/org/freedesktop/Hal/devices/computer_backlight'  (string)
  laptop_panel.access_method = 'general'  (string)
  laptop_panel.num_levels = 8  (0x8)  (int)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'backlight'  (string)
  linux.sysfs_path = '/sys/class/backlight/acpi_video0'  (string)
--
udi = '/org/freedesktop/Hal/devices/dell_lcd_panel'
  info.addons = {'hald-addon-dell-backlight'} (string list)
  info.capabilities = {'laptop_panel'} (string list)
  info.category = 'laptop_panel'  (string)
  info.interfaces = {'org.freedesktop.Hal.Device.LaptopPanel'} (string list)
  info.parent = '/org/freedesktop/Hal/devices/platform_dcdbas'  (string)
  info.product = 'Dell Laptop Panel'  (string)
  info.subsystem = 'unknown'  (string)
  info.udi = '/org/freedesktop/Hal/devices/dell_lcd_panel'  (string)
  laptop_panel.access_method = 'custom'  (string)
  laptop_panel.brightness_in_hardware = true  (bool)
  laptop_panel.num_levels = 8  (0x8)  (int)

Capability/interface LaptopPanel реализуют два объекта HAL. Причем второй, делловский, заявляет brighness_in_hardware=true, а первый, generic, молчит как рыба.

Дальше еще жарче.

Код: Выделить всё

$ gnome-power-manager --verbose --no-daemon
[hal_device_condition_cb] gpm-button.c:391 (01:04:18):     condition=ButtonPressed, details=brightness-up
[emit_button_pressed] gpm-button.c:335 (01:04:18):     emitting button-pressed : brightness-up
[button_pressed_cb] gpm-manager.c:982 (01:04:18):     Button press event type=brightness-up
[button_pressed_cb] gpm-srv-screensaver.c:167 (01:04:18):     Button press event type=brightness-up
[button_pressed_cb] gpm-backlight.c:515 (01:04:18):     Button press event type=brightness-up
[gpm_brightness_lcd_get_hw] gpm-brightness-lcd.c:116 (01:04:18):     GetBrightness returned level: 2
[gpm_brightness_lcd_set_hw] gpm-brightness-lcd.c:155 (01:04:18):     Setting 3 of 7
[gpm_brightness_lcd_up] gpm-brightness-lcd.c:352 (01:04:18):     emitting brightness-changed (42)
[brightness_changed_cb] gpm-backlight.c:690 (01:04:18):     Need to display backlight feedback value 42
[gpm_feedback_display_value] gpm-feedback-widget.c:144 (01:04:18):     Displaying 0,420000 on feedback widget
[gpm_refcount_add] gpm-refcount.c:100 (01:04:18):     refcount now: 1
[gpm_refcount_add] gpm-refcount.c:101 (01:04:18):     non zero, so sending REFCOUNT_ADDED
[brightness_changed_cb] gpm-backlight.c:694 (01:04:18):     emitting brightness-changed : 42
[button_pressed_cb] gpm-info.c:698 (01:04:18):     Button press event type=brightness-up

[hal_device_condition_cb] gpm-button.c:391 (01:04:18):     condition=ButtonPressed, details=brightness-up
[emit_button_pressed] gpm-button.c:335 (01:04:18):     emitting button-pressed : brightness-up
[button_pressed_cb] gpm-manager.c:982 (01:04:18):     Button press event type=brightness-up
[button_pressed_cb] gpm-srv-screensaver.c:167 (01:04:18):     Button press event type=brightness-up
[button_pressed_cb] gpm-backlight.c:515 (01:04:18):     Button press event type=brightness-up
[gpm_brightness_lcd_get_hw] gpm-brightness-lcd.c:116 (01:04:18):     GetBrightness returned level: 3
[gpm_brightness_lcd_set_hw] gpm-brightness-lcd.c:155 (01:04:18):     Setting 4 of 7
[gpm_brightness_lcd_up] gpm-brightness-lcd.c:352 (01:04:18):     emitting brightness-changed (57)
[brightness_changed_cb] gpm-backlight.c:690 (01:04:18):     Need to display backlight feedback value 57
[gpm_feedback_display_value] gpm-feedback-widget.c:144 (01:04:18):     Displaying 0,570000 on feedback widget
[gpm_refcount_add] gpm-refcount.c:100 (01:04:18):     refcount now: 2
[gpm_refcount_add] gpm-refcount.c:101 (01:04:18):     non zero, so sending REFCOUNT_ADDED
[brightness_changed_cb] gpm-backlight.c:694 (01:04:18):     emitting brightness-changed : 57
[button_pressed_cb] gpm-info.c:698 (01:04:18):     Button press event type=brightness-up

[gpm_refcount_auto_decrement] gpm-refcount.c:77 (01:04:20):     refcount now: 1
[gpm_refcount_auto_decrement] gpm-refcount.c:74 (01:04:20):     zero, so sending REFCOUNT_ZERO
[gpm_feedback_close_window] gpm-feedback-widget.c:134 (01:04:20):     Closing feedback widget

Пустые строки вставлены мной, ими выделены два одинаковых блока - выплюнутые в ответ на одно нажатие на клавишу brightness up.

Патч http://mail.gnome.org/archives/gnome-power...y/msg00002.html предполагает вернуть в GPM потерянный чиста случайна код проверки HAL property "brightness_in_hardware". Оное читается из HAL таким макаром:

Код: Выделить всё

+    /* Check if hardware handles brightness changes automatically */
+    res = hal_gdevice_get_bool (device,
+                    "laptop_panel.brightness_in_hardware",
+                        &brightness->priv->does_own_updates, NULL);
+
+    if (!res) {
+        brightness->priv->does_own_updates = FALSE;
+        gpm_debug ("laptop_panel.brightness_in_hardware not found. "
+               "Assuming false");
+    } else {
+        if (brightness->priv->does_own_updates) {
+            gpm_debug ("laptop_panel.brightness_in_hardware: True");
+        } else {
+            gpm_debug ("laptop_panel.brightness_in_hardware: False");
+        }
+    }

device же при создании объекта инициализируется как:

Код: Выделить всё

static void
gpm_brightness_lcd_init (GpmBrightnessLcd *brightness)
{
    gchar **names;
    HalGManager *manager;
    HalGDevice *device;

    brightness->priv = GPM_BRIGHTNESS_LCD_GET_PRIVATE (brightness);

    /* save udi of lcd adapter */
    manager = hal_gmanager_new ();
    hal_gmanager_find_capability (manager, "laptop_panel", &names, NULL);
    g_object_unref (manager);
    if (names == NULL || names[0] == NULL) {
        gpm_warning ("No devices of capability laptop_panel");
        return;
    }

    /* We only want first laptop_panel object (should only be one) */
    brightness->priv->udi = g_strdup (names[0]);
    hal_gmanager_free_capability (names);

    device = hal_gdevice_new ();
    hal_gdevice_set_udi (device, brightness->priv->udi);

При установке патченого кода, в debug выводится это самое laptop_panel.brightness_in_hardware: False - возможно потому, что первым подворачивается computer_backlight при поиске, а код убежден, что laptop_panel "should only be one".
(Кстати, при установке этого пересобранного GPM по нажатии кнопки выключения почему-то появляется панель другого вида чем с родным GPM, и без кнопки hibernate. С чего бы это? Даже если не make install, а только переписать бинарник в /usr/bin. А исходник брался apt-get source gnome-power-manager, вроде как должен собраться идентичный родному...)

Ну вот такая примерно картинка.

В принципе был замечен еще
Баг3
При критическом разряде батареи выбранный в GPM hibernate не происходит. Ничего не происходит, батарея доедается и все вырубается с потерей несохраненных данных. Но это уже немножко другая история...
Спасибо сказали: