SSブログ

g-p-m → dbus → hal → pcc-acpi の関係 [Vine Linux]

普段使ってる VineSeed で気がついたら液晶の明るさが
微妙に暗くなるようになってしまい、しばらくは端末から
# echo 20 > /proc/acpi/pcc/brightness とかやってしの
いでんたんだけど、いいかげん面倒になってきたので時間
を掛けて調べてみた。

まずは取っ掛かりを探すために gnome-power-manager が
何かエラーを出していないか、調べてみることに。

で、$ ggnome-power-manager --no-daemon --verbose として
実行してやると、デバッグメッセージが標準出力に表示される
のが分かったので、つらつらメッセージを見ていると、
dbus を経由して hal を呼び出していることが分かってきた。

そうすると dbus はメッセージをやり取りするだけなので、hal が
怪しくなってくる。

ということで次は lcd とか brightness をとかのキーワードを
使って、$ rpm -ql hal | grep -i lcd のように怪しいファイルが
無いか探してみると、予想通り /usr/lib/hal/scripts/linux に、
hal-system-lcd-get-brightness-linux と hal-system-lcd-set-brightness-linux
というシェルスクリプトが見つかった。

でも、こいつらを読んでいくと単純に /proc/acpi/pcc/brightness
から値を読んだり書いたりしているだけのようで、この動作なら
特に問題無く液晶の輝度を変更できているはず。

さて、何が液晶の最大輝度を低く抑えているのかなぁと、
視点を変えて hal のパッケージを見ていたら、lshal という
コマンドがあるのに気づいた。

で、こいつを実行してその結果を見ていくと、
udi = '/org/freedesktop/Hal/devices/acpi_brightness'
  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 = 'Panasonic LCD Panel'  (string)
  info.udi = '/org/freedesktop/Hal/devices/acpi_brightness'  (string)
  laptop_panel.access_method = 'panasonic'  (string)
  laptop_panel.num_levels = 16  (0x10)  (int)
  linux.acpi_path = '/proc/acpi/pcc/brightness'  (string)
  linux.acpi_type = 7  (0x7)  (int)
  linux.hotplug_type = 4  (0x4)  (int)
  org.freedesktop.Hal.Device.LaptopPanel.method_argnames = {'brightness_value', ''} (string list)
  org.freedesktop.Hal.Device.LaptopPanel.method_execpaths = {'hal-system-lcd-set-brightness', 'hal-system-lcd-get-brightness'} (string list)
  org.freedesktop.Hal.Device.LaptopPanel.method_names = {'SetBrightness', 'GetBrightness'} (string list)
  org.freedesktop.Hal.Device.LaptopPanel.method_signatures = {'i', ''} (string list)


どうも laptop_panel.num_levels というのが怪しいので、
$ apt-get source hal してソースをごそごそ読んでみた結果、
hal-0.5.9/hald/linux/acpi.c の中で、
        } else if (acpi_type == ACPI_TYPE_PANASONIC_DISPLAY) {
            gchar proc_path[HAL_PATH_MAX];	
            type = "panasonic";
            desc = "Panasonic LCD Panel";
            br_levels = 16;

と、最大値を16(というか0から数えて15)に決め打ちしている
ことが分かった。

ということで、/proc/acpi/pcc/ac_brightness_max から
最大値を読み込むように簡単 patch を作ってパッケージを
更新してみたところ、微妙に暗くなることは無くなった。

あと明るさの調整アプレットでもちゃんと調整できる
ようになったので、とりあえずは OK かなと。

ただし、Fn + F1/F2 で明るさが変更できない原因までは
特定できなかった。

調べてみると ubuntu でも同じ不具合が報告されている
ので、upstream で修正されないと難しいのかも知れない。

# にしても疲れた。
タグ:Vine linux Seed
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

udev の更新は大変BTS の整理中 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。