「バックライト」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎概要: 削除)
(→‎ACPI: 英語版の記事を転載)
13行目: 13行目:
 
{{Note|OLED 画面にはバックライトがないため、OLED 画面を搭載したラップトップのバックライト電力を変更して明るさを制御することはできません。この場合、知覚される画面の明るさは、PWMコントロール(Linux カーネルには実装されていません)または、[[#色補正|ソフトウェアの色補正]]を使用して調整できます。}}
 
{{Note|OLED 画面にはバックライトがないため、OLED 画面を搭載したラップトップのバックライト電力を変更して明るさを制御することはできません。この場合、知覚される画面の明るさは、PWMコントロール(Linux カーネルには実装されていません)または、[[#色補正|ソフトウェアの色補正]]を使用して調整できます。}}
   
  +
== ハードウェアインターフェイス
== ACPI ==
 
  +
=== ACPI ===
 
スクリーンバックライトの明るさはバックライト LED やカソードの電力レベルの設定によって調整されます。電力レベルは大抵の場合ビデオ用の ACPI カーネルモジュールを使用することで操作することが可能です。このモジュールのインターフェイスは sysfs のフォルダ {{ic|/sys/class/backlight}} によって提供されます。
 
スクリーンバックライトの明るさはバックライト LED やカソードの電力レベルの設定によって調整されます。電力レベルは大抵の場合ビデオ用の ACPI カーネルモジュールを使用することで操作することが可能です。このモジュールのインターフェイスは sysfs のフォルダ {{ic|/sys/class/backlight}} によって提供されます。
   
69行目: 70行目:
   
 
このルールで値を固定しても、systemd-backlight サービスによって起動時に以前の輝度レベルに戻されます。このルールを使いたいときは、[[#systemd-backlight サービス|systemd-backlight サービス]]で説明されているように system-backlight サービスをマスクする必要があります。
 
このルールで値を固定しても、systemd-backlight サービスによって起動時に以前の輝度レベルに戻されます。このルールを使いたいときは、[[#systemd-backlight サービス|systemd-backlight サービス]]で説明されているように system-backlight サービスをマスクする必要があります。
  +
  +
  +
=== setpci ===
  +
  +
In some cases (e.g. Intel Mobile 945GME [https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/397617]), it is possible to set the register of the graphic card to adjust the backlight. It means you adjust the backlight by manipulating the hardware directly, which can be risky and generally is not a good idea. Not all of the graphic cards support this method.
  +
  +
When using this method, you need to use {{ic|lspci}} first to find out where your graphic card is.
  +
  +
# setpci -s 00:02.0 F4.B=0
  +
  +
=== External monitors ===
  +
  +
[[Wikipedia:Display_Data_Channel#DDC.2FCI|DDC/CI]] (Display Data Channel Command Interface) can be used to communicate with external monitors implementing MCCS (Monitor Control Command Set) over I2C. DDC can control brightness, contrast, inputs, etc on supported monitors. Settings available via the OSD (On-Screen Display) panel can usually also be managed via DDC. The [[kernel module]] {{ic|i2c-dev}} may need to be loaded if the {{ic|/dev/i2c-*}} devices do not exist.
  +
  +
{{Pkg|ddcutil}} can be used to query and set brightness settings:
  +
  +
{{hc|# ddcutil capabilities {{!}} grep "Feature: 10"|
  +
Feature: 10 (Brightness)
  +
}}
  +
  +
{{hc|1=# ddcutil getvcp 10|2=
  +
VCP code 0x10 (Brightness ): current value = 60, max value = 100
  +
}}
  +
  +
# ddcutil setvcp 10 70
  +
  +
Alternatively, one may use {{AUR|ddcci-driver-linux-dkms}} to expose external monitors in sysfs. Then, after loading the {{ic|ddcci}} [[kernel module]], one can use any [[#Backlight utilities|backlight utility]].
  +
  +
{{Note|
  +
* Using {{ic|ddcci}} and {{ic|i2c-dev}} simultaneously may result in resource conflicts such as a {{ic|Device or resource busy}} error.
  +
* Users of NVIDIA's proprietary drivers may need to add {{ic|1=Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100"}} to the {{ic|Device}} section in {{ic|/etc/X11/xorg.conf.d/20-nvidia.conf}} (generated by ''nvidia-xconfig'') or {{ic|1=options nvidia NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100}} to {{ic|/etc/modprobe/conf.d/nvidia.conf}}. Confirm that the settings are correctly applied with {{ic|grep RegistryDwords /proc/driver/nvidia/params}} and check that the values are not empty. See [https://forums.developer.nvidia.com/t/gddccontrol-issues-with-nvidia-drivers-i2c-monitor-display-ddc-dp-hdmi-failing/30427/33] and [https://forums.developer.nvidia.com/t/gddccontrol-issues-with-nvidia-drivers-i2c-monitor-display-ddc-dp-hdmi-failing/30427/61]
  +
* {{ic|ddcutil}} will fail to set some VCP features if there is a feature enabled on the monitor which already automatically adjusts them (e.g. [[Wikipedia:Contrast ratio#Dynamic contrast (DC)|Dynamic Contrast Ratio]] or BenQ's ''Eye Care'' technology).
  +
* To facilitate binding screen brightness control to a keyboard shortcut, it may be convenient to enable non-superuser access to the relevant I2C devices. This can be achieved by adding a group {{ic|i2c}} and configuring [[udev]] to set this group as the owner of the I2C devices. See [https://raspberrypi.stackexchange.com/a/4472].
  +
* If {{Pkg|ddcutil}} is installed, it provides the {{ic|/usr/share/ddcutil/data/90-nvidia-i2c.conf}} file, which can be copied to {{ic|/etc/X11/xorg.conf.d/}} instead of manually editing [[Xorg]] configuration files. It also provides {{ic|/usr/share/ddcutil/data/45-ddcutil-i2c.rules}} and {{ic|/usr/share/ddcutil/data/45-ddcutil-usb.rules}} for [[udev]] rules.
  +
}}
   
 
== バックライトをオフにする ==
 
== バックライトをオフにする ==

2023年2月1日 (水) 15:24時点における版

画面の輝度を操作するのは難易度が高いことがしばしばです。多くのマシンでは、物理的なハードウェアスイッチが付いておらず、ソフトウェアによる方法は動いたり動かなかったりとまちまちです。ハードウェアにあった方法を使うようにしてください。画面が明るすぎると眼精疲労を起こす可能性があります。

ソフトウェアを使ってモニターやノートパソコン、統合パネル (iMac など) の画面のバックライトを調整する方法は多数存在します。これらの 議論とこの wiki ページによると、制御方法は次のカテゴリに分類できます。

  • 明るさはベンダー指定のホットキーによって制御され、OS が明るさを調整するためのインターフェイスはありません。
  • 明るさは、ACPI、グラフィック、またはプラットフォーム ドライバーのいずれかによって制御されます。この場合、バックライト制御は、ユーザー空間の バックライト ユーティリティで使用できる /sys/class/backlight を通じてユーザーに公開されます。
  • 明るさは、setpci を介してグラフィック カード レジスタに書き込むことによって制御されます。
ノート: OLED 画面にはバックライトがないため、OLED 画面を搭載したラップトップのバックライト電力を変更して明るさを制御することはできません。この場合、知覚される画面の明るさは、PWMコントロール(Linux カーネルには実装されていません)または、ソフトウェアの色補正を使用して調整できます。

== ハードウェアインターフェイス

ACPI

スクリーンバックライトの明るさはバックライト LED やカソードの電力レベルの設定によって調整されます。電力レベルは大抵の場合ビデオ用の ACPI カーネルモジュールを使用することで操作することが可能です。このモジュールのインターフェイスは sysfs のフォルダ /sys/class/backlight によって提供されます。

フォルダの名前はグラフィックカードのモデルによります。

# ls /sys/class/backlight/
intel_backlight

この例ではバックライトは Intel のグラフィックカードによって管理されています。ATI のカードでは acpi_video0 と呼ばれます。下の例では acpi_video0 を使っています。

ディレクトリには以下のファイルとフォルダが含まれています:

actual_brightness  brightness         max_brightness     subsystem/    uevent             
bl_power           device/            power/             type

最大輝度は max_brightness を見ることでわかります、多くの場合15です。

# cat /sys/class/backlight/acpi_video0/max_brightness
15

数値を brightness に書き込むことで明るさを設定できます。最大輝度よりも高い数値を設定することはできません。

# tee /sys/class/backlight/acpi_video0/brightness <<< 5

カーネルコマンドラインオプション

たまに、マザーボードの実装が ACPI と異なっているために ACPI が上手く動作しないことがあります。これにはデュアルグラフィックのノートパソコンなども含まれます (例: Nvidia/Radeon のディスクリート GPU と Intel/AMD の内蔵 GPU) - この問題が発生するノートパソコンの例として Dell Studio, Dell XPS 14/15/17 や Lenovo のノートパソコンなどが挙げられます。カーネル開発者の Kamal Mostafa がこの問題を解決するパッチを作成しました - パッチは Linux 3.1 から含まれています。さらに、Nvidia-optimus ノートパソコンでは、nomodeset カーネルパラメータがバックライトの調整機能に干渉することがあります。以下のカーネルパラメータをブートローダー (grub, syslinux...) に追加してみてください:

video.use_native_backlight=1
ノート: このカーネル設定は Linux 3.13 で追加されました。

または

acpi_osi=Linux acpi_backlight=vendor

または

acpi_osi=Linux acpi_backlight=legacy

acpi_backlight=vendor は ACPI video.ko ドライバーの代わりにベンダー固有のドライバー (例: thinkpad_acpi, sony_acpi など) を優先して使用します。

Lenovo IdeaPad ノートパソコンの場合、blacklist ideapad_laptop/etc/modprobe.d/blacklist.conf に追加して ideapad_laptop モジュールをブラックリスト化する必要があるかもしれません (必要に応じてファイルを作成してください)。ソース

ヒント: Asus のノートパソコンでは次を実行する必要があるかもしれません: # modprobe asus-nb-wmi
ノート: Disabling legacy boot on Dell XPS13 breaks backlight support.

Udev ルール

ACPI インターフェイスが利用できる場合、udev ルールを使って起動時にバックライトのレベルを設定することができます。

/etc/udev/rules.d/81-backlight.rules
# Set backlight level to 8
SUBSYSTEM=="backlight", ACTION=="add", KERNEL=="acpi_video0", ATTR{brightness}="8"

このルールで値を固定しても、systemd-backlight サービスによって起動時に以前の輝度レベルに戻されます。このルールを使いたいときは、systemd-backlight サービスで説明されているように system-backlight サービスをマスクする必要があります。


setpci

In some cases (e.g. Intel Mobile 945GME [1]), it is possible to set the register of the graphic card to adjust the backlight. It means you adjust the backlight by manipulating the hardware directly, which can be risky and generally is not a good idea. Not all of the graphic cards support this method.

When using this method, you need to use lspci first to find out where your graphic card is.

# setpci -s 00:02.0 F4.B=0

External monitors

DDC/CI (Display Data Channel Command Interface) can be used to communicate with external monitors implementing MCCS (Monitor Control Command Set) over I2C. DDC can control brightness, contrast, inputs, etc on supported monitors. Settings available via the OSD (On-Screen Display) panel can usually also be managed via DDC. The kernel module i2c-dev may need to be loaded if the /dev/i2c-* devices do not exist.

ddcutil can be used to query and set brightness settings:

# ddcutil capabilities | grep "Feature: 10"
  Feature: 10 (Brightness)
# ddcutil getvcp 10
VCP code 0x10 (Brightness                    ): current value =    60, max value =   100
# ddcutil setvcp 10 70

Alternatively, one may use ddcci-driver-linux-dkmsAUR to expose external monitors in sysfs. Then, after loading the ddcci kernel module, one can use any backlight utility.

ノート:
  • Using ddcci and i2c-dev simultaneously may result in resource conflicts such as a Device or resource busy error.
  • Users of NVIDIA's proprietary drivers may need to add Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100" to the Device section in /etc/X11/xorg.conf.d/20-nvidia.conf (generated by nvidia-xconfig) or options nvidia NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100 to /etc/modprobe/conf.d/nvidia.conf. Confirm that the settings are correctly applied with grep RegistryDwords /proc/driver/nvidia/params and check that the values are not empty. See [2] and [3]
  • ddcutil will fail to set some VCP features if there is a feature enabled on the monitor which already automatically adjusts them (e.g. Dynamic Contrast Ratio or BenQ's Eye Care technology).
  • To facilitate binding screen brightness control to a keyboard shortcut, it may be convenient to enable non-superuser access to the relevant I2C devices. This can be achieved by adding a group i2c and configuring udev to set this group as the owner of the I2C devices. See [4].
  • If ddcutil is installed, it provides the /usr/share/ddcutil/data/90-nvidia-i2c.conf file, which can be copied to /etc/X11/xorg.conf.d/ instead of manually editing Xorg configuration files. It also provides /usr/share/ddcutil/data/45-ddcutil-i2c.rules and /usr/share/ddcutil/data/45-ddcutil-usb.rules for udev rules.

バックライトをオフにする

(ノートブックをロックした時などに) バックライトを切ることはバッテリーの節電に役に立ちます。グラフィカルセッションから次のコマンドを実行すればオフにできます:

sleep 1 && xset dpms force off

マウスを動かしたりキーボードで入力したりするとバックライトはまたオンになります。上のコマンドが使えない場合でも、vbetool が使える可能性があります。ただし、この場合バックライトを戻すには手動で有効にする必要があるので注意してください。コマンドは以下の通りです:

vbetool dpms off

バックライトをもう一度有効にするには:

vbetool dpms on

例えば、Acipd のエントリで書かれているように、ノートパソコンのフタを閉じた時にこのコマンドを使用することが可能です。

systemd-backlight サービス

systemd パッケージにはサービス systemd-backlight@.service が含まれており、デフォルトで有効になっていて"固定"されています。シャットダウン時にバックライトの明るさのレベルを保存して、起動時にそれを復元します。このサービスは #ACPI で説明されている ACPI による方法を使っていて、/sys/class/backlight/ にあるフォルダごとにサービスを生成します。例えば、acpi_video0 という名前のフォルダがあった場合、systemd-backlight@backlight:acpi_video0.service という名前のサービスを生成します。起動時に他の方法を使ってバックライトを設定するときは、systemd-backlight@.service サービスをマスクすることが推奨されます。

バックライトユーティリティ

xbacklight

xorg-server のコマンド xbacklight を使ってバックライトを調整することが可能です。このユーティリティは [extra] の xorg-xbacklight パッケージに入っています。

YouTube の gotbletu によってデモンストレーションが投稿されています。彼は以下のコマンドを使ってバックライトを調整することを提案しています:

  • 明るくする:
xbacklight -inc 40
  • 弱くする:
xbacklight -dec 40
ヒント: Xorg での特別なキーボードキーで説明されているようにしてこれらのコマンドをキーボードのキーに結びつけることが可能です。

light

light をインストールし、video グループにユーザーを追加してください。

バックライトの輝度を 5% 上げる:

$ light -A 5

バックライトの輝度を 5% 下げる。

$ light -U 5

バックライトの輝度を 100% に設定する。

$ light -S 100

relight

relightXyne のリポジトリ から利用でき、また、AUR からはパッケージ relightAUR として取得可能です。このパッケージは上記の ACPI による方法を使って、再起動時に以前のバックライト設定を自動的に復元させるサービスを提供します。また、スクリーンごとにバックライトを選択・設定できるダイアログベースのメニューも入っています。

setpci (細心の注意を払って使用してください)

グラフィックカードのレジスタをセットして、バックライトの調整をすることが可能です。ハードウェアを直接操作してバックライトを調整するので、危険性が存在し、あまり勧められる方法ではありません。また、グラフィックカードによってはこの方法をサポートしていません。

この方法を使う際には、まず lspci を使ってあなたの使っているグラフィックカードの場所を確認する必要があります。

# setpci -s 00:02.0 F4.B=0

Calise

ソフトウェア calise は AUR にあります。

光センサーを搭載していないノートパソコンのために、ウェブカメラからキャプチャして周りの明るさを計算し、画面のバックライトを設定します。 詳細は calise の wiki を見て下さい: Calise wiki

このプログラムの主な特徴としては、計算が非常に正確で、リソースの使用量がかなり少なく、デーモンバージョンが存在し (systemd ユーザーのための .service ファイルもあります)、バッテリー持ちにほとんど影響がないことが挙げられます。

brightd

Macbook にインスパイアされた brightdAUR はユーザーの操作がしばらくないと自動的に画面を薄暗くします (スタンバイ状態にはしません)。さっくり画面をオフにする Display Power Management Signaling と上手く併用することができます。

KDE

KDE のユーザーは System Settings > Power Management > Energy Saving からバックライトを調整できます。 kdm よりも前にバックライトを設定したい場合は /usr/share/config/kdm/Xsetup に次を記述してください:

xbacklight -inc 10

色補正

Wayland

Redshift は Wayland (パッチなし) をサポートしていません。ただし、コンポジタを開始する前に、 tty で目的の温度を適用することは可能です。例:

$redshift-m drm-PO 3000

そうしないと、一部のコンポジタがランタイム中にカラー補正を適用する可能性があります。

xcalib

AUR にあるパッケージ xcalib (上流のサイト) を使って画面を調光することができます。これも同じく、ユーザーの gotbletu が Youtube にデモンストレーションを投稿しています。このプログラムはガンマ補正と色の反転、コントラストの低減をすることが可能で、ここでは後者を使用します:

  • 暗くする:
xcalib -co 40 -a

このプログラムは ICC を使って X11 と通信するので、画面が暗くなっても、マウスカーソルの明るさは変わりません。

Xflux

Xflux は X-Windows system 向けの f.lux ポートです。日中は青に夜は黄色・橙色に画面を変化させることで、一日の流れに画面の輝度を合わせて夜ふかしを止めるのに役立ちます。

AUR には f.lux を使用するためのパッケージがいくつか存在します [5]。「メイン」のパッケージは xfluxAUR で、f.lux のコマンドライン機能を扱います。xflux パッケージの自動起動を行うためのデーモンも様々あります。

redshift

公式リポジトリに入っているプログラム redshift は、時刻と地理情報にあわせて randr を使って画面の明るさを調整します。RGB ガンマ補正をしたり色温度の設定も可能です。xcalib と同じように、ソフトウェアによる方法なのでマウスカーソルの見た目は変わりません。明るさのクイック調整を実行するために、次のようなコマンドを使ってみて下さい:

redshift -o -l 0:0 -b 0.8 -t 6500:6500
ヒント: 西経や南緯の場合は、負の値で入力してください。例えばカリフォルニア州バークレーならば:
redshift-gtk -l 37.8717:-122.2728 

NVIDIA の設定

NVIDIA のプロプライエタリドライバーを使っている場合、nvidia-settings ユーティリティの "X Server Color Correction" からディスプレイの輝度を変更することができます。ただし、バックライト (の強さ) には全く変更がされないので注意してください、あくまでカラー出力の調整だけが行われます (この方法で明るさを下げても電力効率は良くならないので他の方法が全て使えない時の最後の手段といったところです。明るさを上げると、露出オーバーの写真と同じように、色味が完全に落ちます)。

トラブルシューティング

バックライト PWM 変調周波数 (Intel i915 のみ)

LED バックライトを搭載したノートパソコンではときどき画面にちらつきが発生することが知られています。これは LED の点灯と消灯をヒトの目には識別できない時間で高速に切り替えることで明るさを制御しているためですが、(PWM 変調周期と呼ばれる) 切り替えの周波数が高くないために、はっきり判別できるほどのちらつきが生じたり、人によっては頭痛や眼精疲労の原因になることがあります。

Intel i915 GPU を使っている場合、PWM 変調周期を調整することでちらつきを取り除くことが可能です。

公式リポジトリから intel-gpu-tools をインストールしてください。PWM 変調周期を決めているレジスタの値を取得します:

# intel_reg_read 0xC8254
0xC8254 : 0x12281228

戻り値が PWM 変調の周期を表しています。PWM 変調周期を増加させるには、レジスタの値を減らす必要があります。例えば、上の例から周期を2倍にするには、次を実行します:

# intel_reg_write 0xC8254 0x09140914

オンラインの計算器を使って設定すべき値を計算できます http://devbraindom.blogspot.com/2013/03/eliminate-led-screen-flicker-with-intel.html

詳しくは次のトピックを参照してください https://bbs.archlinux.org/viewtopic.php?pid=1245913

Intel GM45 チップセットを使用している場合は 0xC8254 の代わりにアドレス 0x61254 を使用してください。

カーネル 3.13 で Intel チップセットでバックライトが調整できない

以下のファイルを追加すると直ります。

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
        Identifier  "Backlight fix"
        Driver      "intel"
        Option      "Backlight"  "intel_backlight"
EndSection

sysfs を変更しても明るさが変更されない

ノート: この問題と解決方法は Dell M6700 と Nvidia K5000m (A10 より前の BIOS バージョン), Clevo P750ZM (Eurocom P5 Pro Extreme) と Nvidia 980m で確認済みです。

環境によっては、キーボードの輝度ホットキーで /sys/class/backlight/acpi_video0/actual_brightness の acpi インターフェイスの値は変更されるのに、画面の輝度が変更されないことがあります。また、デスクトップ環境の輝度アプレットが使えないこともあります。

カーネルパラメータの変更をテストしてみて xbacklight だけが動作する場合、BIOS とカーネルドライバーの互換性がない可能性があります。

その場合、BIOS や GPU ドライバーのメーカーから修正がリリースされるのを待つしかありません。

応急手段として inotify カーネル api を使って /sys/class/backlight/acpi_video0/actual_brightness の値が変更されるたびに xbacklight を実行することができます。

まず inotify-toolsインストールしてください。そして inotify を使用するスクリプトを作成して、自動起動するように設定します。

/usr/local/bin/xbacklightmon
#!/bin/bash
max=/sys/class/backlight/acpi_video0/max_brightness
level=/sys/class/backlight/acpi_video0/actual_brightness
factor=$(awk '{print $1/100}' <<< $(<$max)) 

xblevel() { awk '{print int($1/$2)}' <<< "$(<$level) $factor"; }
xbacklight -set $(xblevel)
inotifywait -m -qe modify $level | while read -r file event; do
    xbacklight -set $(xblevel)
done