Backlight

FreeBSD backlight

前回からの持ち越し。FreeBSD 13に入ったという、液晶パネルの明るさ調整コマンドが動かない件の調査。

root@fb:~ # backlight
backlight: cannot open /dev/backlight/backlight0: No such file or directory

何は無くともデバイスが無いと始まらない。担当のソースを見ても、デバイスをオープンして、それに対して、I/Oしてるだけって言う、極普通な作りになってる。

[sakae@fb /sys]$ grep backlight -rIl .
./sys/backlight.h
./amd64/conf/NOTES
./contrib/device-tree/Bindings/display/bridge/ps8622.txt
./contrib/device-tree/Bindings/display/sitronix,st7735r.yaml
./contrib/device-tree/Bindings/display/atmel,lcdc.txt
  :
./dev/acpi_support/acpi_asus.c
./dev/acpi_support/acpi_asus_wmi.c
./dev/backlight/backlight.h
./dev/backlight/backlight_if.m
./dev/backlight/backlight.c
./dev/gpio/gpiobacklight.c

担当デバイスって、どの様に作成されるのかな? 全文検索してみた。

i386/conf/NOTES

# ACPI Panasonic Extras (LCD backlight/brightness, video output, etc.)
device          acpi_panasonic
# ACPI Toshiba Extras (LCD backlight/brightness, video output, etc.)
device          acpi_toshiba
#
# Laptop/Notebook options:
#
# See also:
#  apm under `Miscellaneous hardware'
# above.

device          backlight

これって、東芝とか一部のPCでは、LCDのコントロールを acpi_xxx が引受てるよ。その他のPCは、ずばりのbacklightと言うデバイスが担当してるよって事だな。何せ、この分野にはうといものですから、周辺から攻めて行くのさ。

デバイス・ドライバーが/boot/kernel内に有るだろう。backlight.koが有ったよ。kldloadしたけど、直ぐには使えないの? まあいい、ソースと対面してみるか。

/sys/dev/backlight/backlight.c

backlight_register(const char *name, device_t dev)
{
        args.mda_uid = UID_ROOT;
        args.mda_gid = GID_VIDEO;
        args.mda_mode = 0660;
        args.mda_si_drv1 = sc;
        error = make_dev_s(&args, &sc->cdev, "backlight/backlight%d", sc->unit);

どうも、これっぽいな。デバイスを作る部分はね。後はこれを使う為のコードが有るだけだ。

backlight_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
    int fflag, struct thread *td)
{
        switch (cmd) {
        case BACKLIGHTGETSTATUS:
                /* Call the driver function so it fills up the props */
                bcopy(data, &props, sizeof(struct backlight_props));
                error = BACKLIGHT_GET_STATUS(sc->dev, &props);
                if (error == 0)
                        bcopy(&props, data, sizeof(struct backlight_props));
                break;

詳しい事は、backlight(9)を参照。9は、ドライバーの章ね。みたけど全々詳しくなかったぞ。まあ、生れたばかりですから。

HISTORY
     The backlight interface first appear in FreeBSD 13.0.  The backlight
     driver and manual page was written by Emmanuel Vadot <manu@FreeBSD.org>.

devfs

リナやFreeBSDは、ドライバーを動的に制御している。それってセキュリティー的にどうよ? ウィルスに犯されたものをカーネルに取り込むなんて、とんでも無い事だと、かたくなに拒否してるOSがあります。その名は、ご存知OpenBSD。昔ながらの方法でやってます。オイラーは大好きですよ。

と、言っても、世の中の趨勢には逆らえないので、動的なもう一片のdevfsを見ておく。/dev配下にあるやつを動的に作っちゃえってやつ。かの昔は、mknodだったかのコマンドであらかじめ作っておくんだった。

[sakae@fb ~]$ cat /etc/devfs.rules
[system=10]
add     path 'backlight/backlight*'     mode 0660

こんな仕様書を作っておいて、/etc/rc.confに

devfs_system_ruleset="system"

書いておくと、起動時に適用されるとな。任意の時点でやるにはdevfs(8)を使う。デフォルトのルールは、

root@fb:/home/sakae # less /etc/defaults/devfs.rules
[devfsrules_unhide_basic=2]
add path log unhide
add path null unhide
 :
[devfsrules_unhide_login=3]
add path stdin unhide
add path stdout unhide
add path stderr unhide

こんな具合だ。実際にやってみたけど、backlightなデバイスは現れず。何か勘違いしてないか?元ハード屋さんが、胸に手をあてて考えてみる。

たかが、画面の明暗コントロールでしょ。それってLチカの応用だよな。一番最初に思いつくのは、電圧を変化させて(電流を変え)明暗をコントロール。ハード的には、大変そう。何たってアナログな要素が出てきますから。

デジタル的にやる方が簡単だぞ。H8なCPUでもラズパイな石でも、パルス幅を簡単に制御する方法が提供されてる。このパルスで、流す電流をON/OFFするのが、スマートだな。こういう制御をPWMとか言うんだっけな。

で、この方法は、あえなく撃沈。

drm

次は、趣向を変えて、Xのログを眺めてみる。

[sakae@fb /var/log]$ grep '(EE)' Xorg.0.log
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[   745.314] (EE) Failed to load module "intel" (module does not exist, 0)
[   745.350] (EE) open /dev/dri/card0: No such file or directory
[   745.350] (EE) open /dev/dri/card0: No such file or directory
[   745.350] (EE) Screen 0 deleted because of no matching config section.

card0て、何か曰くがありそう。世に問うてみたよ。

Let’s Note CF-SZ5 を FreeBSD 専用機として購入。

こんなのを入れるといいよ、との事。

/usr/ports/graphics/drm-fbsd13-kmod
[sakae@fb /usr/ports/graphics/drm-fbsd13-kmod]$ cat pkg-descr
amdgpu, i915, and radeon DRM modules for the linuxkpi-based KMS components.
Currently corresponding to Linux 5.4.62 DRM.
This version is for FreeBSD 13.

WWW: https://github.com/freebsd/drm-kmod/

/etc/rc.conf

kld_list="i915kms.ko"

そして、ユーザーをvideoグループに所属させてから、再起動。pkgから入れたモジュールは、/boot/modulesに入る。必要なものを見繕ってくれって設定なんだな。

[sakae@fb ~]$ backlight
brightness: 100
[sakae@fb ~]$ backlight 40
[sakae@fb ~]$ backlight
brightness: 40

ちゃんと機能したぞ。万歳。気になるデバイスを見ておく。

[sakae@fb ~]$ ls -l /dev/backlight/
total 0
crw-rw----  1 root  video  0x1a8 Aug 24 06:51 backlight0
lrwxr-xr-x  1 root  wheel     23 Aug 24 06:51 intel_backlight0 -> ../backlight/backlight0

ちゃんと出来てる。そして、必要と思わわれる他のデバイスも自動作成されてた。

[sakae@fb ~]$ ls -l /dev/dri
total 0
lrwxr-xr-x  1 root  wheel   8 Aug 24 06:51 card0 -> ../drm/0
lrwxr-xr-x  1 root  wheel  10 Aug 24 06:51 renderD128 -> ../drm/128
[sakae@fb ~]$ ls -l /dev/drm
total 0
crw-rw----  1 root  video   0x8d Aug 24 06:51 0
crw-rw----  1 root  video   0x90 Aug 24 06:51 1
crw-rw----  1 root  video   0x9f Aug 24 06:51 10
crw-rw----  1 root  video  0x10a Aug 24 06:51 100
 :

CUIなコンソールも、今迄のきたないフォントに変って、綺麗なちいさ目なやつになってた。しめしめと思ってstartxすると、あれ、icewmはおろか、キーボードもマウスも無反応。Xのログは、

[   799.436] (II) XINPUT: Adding extended input device "TPPS/2 IBM TrackPoint" (type: MOUSE, id 12)
[   799.436] (**) Option "AccelerationScheme" "none"
[   799.436] (**) TPPS/2 IBM TrackPoint: (accel) selected scheme none/0
[   799.436] (**) TPPS/2 IBM TrackPoint: (accel) acceleration factor: 2.000
[   799.436] (**) TPPS/2 IBM TrackPoint: (accel) acceleration threshold: 4
[   799.438] (II) event7  - TPPS/2 IBM TrackPoint: is tagged by udev as: Mouse
[   799.439] (II) event7  - TPPS/2 IBM TrackPoint: device is a pointer

尻切れトンボになってた。そして、psを確認するも、Xな関係者は居なかったぞ。即死しちゃったんだな。もう、暫くは、前のvesaで使う鹿。ロードされてるモジュールは以下の通りだった。

[sakae@fb ~]$ kldstat
Id Refs Address        Size Name
 1   31   0x800000  17e26b0 kernel
 2    1 0x26200000     6000 acpi_wmi.ko
 3    1 0x26206000     6000 ichsmb.ko
 4    1 0x2620c000     4000 smbus.ko
 5    1 0x26210000   17a000 i915kms.ko
 6    1 0x26600000    8a000 drm.ko
 7    4 0x2638a000    1d000 linuxkpi.ko
 8    2 0x263a7000     3000 backlight.ko
 9    2 0x263aa000    10000 linuxkpi_gplv2.ko
10    2 0x263ba000     4000 lindebugfs.ko

昔の奴だと、下記のようにちゃんと使えてるからね。

[   749.315] (II) event7  - TPPS/2 IBM TrackPoint: is tagged by udev as: Mouse
[   749.316] (II) event7  - TPPS/2 IBM TrackPoint: device is a pointer
[  9273.779] (II) event0  - System mouse: device removed
[  9273.779] (II) event1  - System keyboard multiplexer: device removed
  :
[  9273.821] (II) UnloadModule: "libinput"
[  9274.333] (II) Server terminated successfully (0). Closing log file.

icewmを終了させると、ちゃんとX終わりましたってログされてる。

Other User

ぐぐったら、 FreeBSD: X に関するメモ なんてのが公開されてた。難しいのう。

X of OpenBSD

この間USBメモリーにOpenBSDを入れたんだけど、起動直後のコンソールフォントが綺麗だったな。大体、Xは、インストール時に入れられるんで、プロジェクトが保証してるんだな。リナとかは大違いだ。ちゃんとファームウェアが入るんだな。( fw_firmware )

obusb$ ls -l /etc/firmware/i915
total 9612
-rw-r--r--  1 root  bin    8380 Apr 29 09:32 bxt_dmc_ver1_07.bin
-rw-r--r--  1 root  bin  181888 Apr 29 09:32 bxt_guc_33.0.0.bin
-rw-r--r--  1 root  bin  149824 Apr 29 09:32 bxt_huc_2.0.0.bin
-rw-r--r--  1 root  bin  182912 Apr 29 09:32 cml_guc_33.0.0.bin
  :

関連品が入っていた。

obusb$ xbacklight = 60

おかげで、LCDの輝度調整も簡単に出来た。

obusb$ xrander
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 345mm x 194mm
   1366x768      59.97*+  50.00
   1280x720      60.00    59.99    59.86    59.74
    :
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)

それから、こちらも難無く動いた。完璧。

xrandr --output LVDS-1 --brightness 0.5

こういう事も出来るらしい。

ちょいと身に覚えが有る悪い使いかたをすると、下記のようなエラーがログされたりする。Xが制御を失っておらず、最後はlogを閉じている。

この例からすると、FreeBSDの場合は、Xが何も出来無い内に即死しちゃったんだね。OS側にも関連のログが出ていないので、取り付く島も無いって事だな。

ob$ less /home/sakae/.local/share/xorg/Xorg.0.log
 :
[  1916.729] (II) Module ABI versions:
[  1916.729]    X.Org ANSI C Emulation: 0.4
[  1916.729]    X.Org Video Driver: 24.1
[  1916.729]    X.Org XInput driver : 24.1
[  1916.729]    X.Org Server Extension : 10.0
[  1916.731] (EE)
Fatal server error:
[  1916.731] (EE) xf86OpenConsole: No console driver found
        Supported drivers: wscons
        Check your kernel's console driver configuration and /dev entries(EE)
[  1916.731] (EE)
Please consult the The X.Org Foundation support
         at http://wiki.x.org
 for help.
[  1916.731] (EE) Please also check the log file at "/home/sakae/.local/share/xorg/Xorg.0.log" for additional information.
[  1916.731] (EE)
[  1916.733] (EE) Server terminated with error (1). Closing log file.

尚このエラーは、VMWAREに入れてるOpenBSDへsshでloginし、無謀にもstartxしたものです。超初期段階で撥ねられている。こういう優しい原因なら楽で良いんだろうけど、死因不明社会。AIの出番だな。それって、海道先生の小説とかの読みすぎですって!

死因不明で思い出したんだけど、煙草、酒、女、賭け事は昔から寿命を縮めると言われてる。でも、そんなの耐えられないよ。何のために生きてるか判らん。X関係も同じで、華やかなKDEだとかGNOMEなんてのに手を出すんだ。オイラーは、LXDEからICEWMなんてのに最近変更した。人生が枯れてきたからね。

でも、一番シンプルなのはTWMっしょ。これでFreeBSDを駆動して、動かなかったら、本当にあきらめましょ。やってみたけど、やっぱり死因不明でしたよ。

intel i915

毎度お騒がせの intel i915 って何様? 知らない事は知るチャンス。まんまの検索語を投入したら、 Intel Graphics こんなのが提示されたよ。


This year's Index

Home