Adjust monitor brightness/backlight from Linux desktop .
長期以來我一直有一個困擾:無法從作業系統端直接控制電腦螢幕的亮度/背光。
Linux能自由調整螢幕亮度的通常是筆電或平板的螢幕,因為多半是用eDP與主機板連接的。我們可以透過桌面環境提供的滑桿快速修改背光亮度。
Surface的螢幕亮度調整滑桿
不過一般桌上型電腦的螢幕,或說顯示器,是透過HDMI或DisplayPort連接到電腦顯示卡輸出的。通常要調整電腦螢幕亮度,就得去按螢幕的實體鍵,叫出OSD選單來調整,不能直接從作業系統端的界面調整。偏偏這個實體按鍵不太好按。
ASUS VP229HA顯示器的調整亮度的界面,要按螢幕下的實體按鍵,打開兩個選單才能進入亮度調整界面,好麻煩。
我不是很喜歡把螢幕亮度開到90%以上的人,我很多時候亮度都是在10%以下。因此方便控制亮度很重要。
我從Windows的使用經驗,了解到從作業系統端控制螢幕亮度是可能的。
一種方法是修改Gamma數值,讓螢幕看起來變暗了,但其實物理亮度並沒有改變。而且這會導致螢幕產生色偏,非常難看。
我要的是可以直接從作業系統控制螢幕亮度的方法,那就是得透過「DDC/CI」這個協定來控制,全稱「Display Data Channel / Command Interface」,這個協定從2005年就存在了,很多大廠牌螢幕都有支援,除非你是超級老的螢幕。
在螢幕OSD選單裡面可以找到DDC/CI的開關。
在Windows,有Monitorian這類軟體能走DDC/CI控制螢幕亮度。
Linux要使用DDC/CI,得手動安裝套件來補足缺少的驅動,還需要一個專門的GUI來控制DDC/CI。不過現在有些Linux桌面環境也能夠透過DDC/CI控制背光了。
如圖,使用KDE Plasma桌面提供的選單(上)來調整螢幕亮度,而非使用螢幕硬體的選單(下)調整。
1. i2c與ddcci-driver-linux的差異#
Linux要使用DDC/CI控制螢幕亮度,需要一個核心模組來控制。
截至撰文當下的Linux 6.12.63,有兩個核心模組可以達成這個效果。
i2c提供i2c-dev核心模組。Linux核心提供一個userland可以直接存取 I²C Bus的介面,會在/dev下出現device node,userland的程式可以修改/dev/i2c-N的內容,透過DDC/CI溝通,進而改變螢幕的亮度、色溫、對比度、RGB、輸入源等等。ddcci-driver-linux提供ddcci核心模組,為每台支援DDC/CI的顯示器建立各自的device node,例如/dev/bus/ddcci/ddcci-backlight。然後它會把顯示器嫁接到Linux核心控制背光的子系統/sys/class/backlight/,讓userland的程式控制螢幕亮度。但是ddcci-driver-linux有其限制,它只能控制螢幕亮度,不能修改其他參數。
Linux控制背光的方式是調整/sys/class/backlight/,預設是不認識DDC/CI的。從以上的原理來看,ddcci-driver-linux是一個比較用途比較廣的方案,它讓軟體不用特地支援DDC/CI就能直接透過/sys/class/backlight/界面控制螢幕亮度,方便桌面環境整合。所以在這篇文章我們將安裝這個版本。
2. 桌面環境對DDC/CI支援度#
如果我們使用ddcci-driver-linux,Linux桌面環境可以直接透過/sys/class/backlight/控制螢幕亮度,不用煩惱DDC/CI的支援度了。
反之,若使用i2c,Linux桌面環境的程式必須額外支援DDC/CI的處理邏輯。
我是希望不要安裝額外的GUI就能控制螢幕亮度。
GNOME:目前GNOME 50依然需要安裝擴充套件才能夠使用DDC/CI。
KDE Plasma:在KDE Plasma 6.0以上版本支援DDC/CI。如果DDC/CI不可用,KDE會回退到調整Gamma值來改變螢幕亮度的模式(僅限Wayland)。即使螢幕物理亮度固定也能進一步降低亮度。
獨立的DDC/CI控制程式:你可以安裝ddcui來控制亮度,就是ddcutil工具的前端。這個GUI除了亮度之外還可以看到螢幕所支援的其他功能。
3. 安裝ddcci-driver-linux套件#
ddcci-driver-linux可以在X11與Wayland桌面使用。
- Ubuntu使用系統的套件管理器安裝ddcci-driver-linux,應該會以DKMS裝載
sudo apt install ddcci-dkms
- (選擇性)使用ddcutil檢查螢幕是否支援DDC/CI,如果正常的話不會輸出任何錯誤訊息
sudo apt install ddcutil
sudo ddcutil detect
重開機,桌面環境螢幕亮度調整的滑桿應該就能調整螢幕亮度了。我注意到我這個ASUS VP229螢幕需要以十位數為單位來調整,不然亮度不會變化。
要確認DDC/CI是否有成功啟用,用Linux調整亮度,再按下電腦螢幕硬體鍵盤叫出OSD,看亮度數值有無跟著變化。