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を駆動して、動かなかったら、本当にあきらめましょ。やってみたけど、やっぱり死因不明でしたよ。