i.MX6UL #2 - 關閉X的電源管理(讓板子上的屏幕成爲永不消逝的亮光,DPMS+Screen Saver混合雙打)

裏先森:移植完ubuntu到imx6ul上後發現LCD會在無操作一段時間後自動熄滅,
究其原因可能有兩種(當然也有可能是兩種的混合作用)

  1. Linux中blankinterval的熄屏休眠設置(linux/drivers/tty/vt/vt.c)
    以下找到幾篇文章供以參考和備忘
    主體文章轉載自:https://blog.csdn.net/bojue01/article/details/53468026 (比較言簡意賅)
    參考文章2:https://blog.csdn.net/wxxgoodjob/article/details/74988143(感覺像是大雜燴)
    參考文章3:https://community.nxp.com/thread/323250 (nxp社區解答)

  2. X中的DPMS和Screen Saver的作用


1. Linux中blankinterval的熄屏休眠設置(linux/drivers/tty/vt/vt.c)

以下內容來自https://blog.csdn.net/bojue01/article/details/53468026

正常情況下Linux會在一段時間後默認關閉屏幕,默認爲10分鐘。開始一直認爲是Gnome或KDE等桌面環境設置的屏幕保護程序電源管理功能,即使不安裝桌面環境屏幕照樣會自動關閉。

下面就來分析下原因。

看到網上的資料說這是由vt驅動來設置的。

下面進入內核源碼目錄下的drivers文件夾,後執行

grep blankinterval ./* -R

搜索那個文件中設置了該變量。


搜索結果如下:

./tty/vt/vt.c:static void blank_screen_t(unsigned long dummy);
./tty/vt/vt.c:static DEFINE_TIMER(console_timer, blank_screen_t, 0, 0);
./tty/vt/vt.c:static void blank_screen_t(unsigned long dummy)

下面打開該文件修改大約180行的位置

  1. static int vesa_blank_mode; /* 0:none 1:suspendV 2:suspendH 3:powerdown */
  2. static int vesa_off_interval;
  3. //static int blankinterval = 10*60;
  4. static int blankinterval = 0;
  5. core_param(consoleblank, blankinterval, int, 0444);
將blankinterval初始化設置爲0即可


還有一種方法就是在自己的應用程序中添加:

 system("echo -e \"\033[9;0]\" > /dev/tty0");

當然還有其他的解決方法,總結如下:

1.修改LCD驅動,把關閉LCD控制器的函數變爲空(不推薦)
2.修改vt.c中的blank_screen_t()函數,讓其爲空(在系統不需要使用關閉顯示功能時推薦)
3.修改vt.c中的blankinterval,讓其爲0(系統可能需要使用關閉顯示功能,而且希望系統上電後正常狀態下不會關閉顯示時推薦)
4.修改用戶程序,加入設置blankinterval的代碼(推薦)

2.X中的DPMS和Screen Saver的作用

其實這也是後來才發現的,當我將1中的方法一個一個的試過之後(沒錯一次又一次的修改內核然後用mfgtools燒錄到板子上)發現沒有用

這裏可以參考http://adam8157.info/blog/2010/06/turn-off-x-screensaver/
爲了防止丟失,我將文章轉載在此 ↓

這兩天看世界盃的時候總是在精彩或者關鍵的時刻因爲屏幕保護而黑屏, 太煩了.

Google如何關閉屏幕保護, 大多都是說關閉DPMS也就是Energy Star模塊, 這個我之前試過, 不行. 但當時沒什麼需求, 所以就沒管, 這個現在影響我了, 還是好好研究下吧.

查看xset的手冊後發現屏幕保護是由X的兩個部分控制的, 一個是BlankTime(較新的X中放在ScreenSaver選項中), 一個是DPMS. BlankTime設置的是黑屏, 也就是說只黑屏而不關顯示器電源, 對於液晶顯示器來說就是不關背燈. DPMS設置的是電源, 三個子選項Standby, Suspend和Off對於CRT顯示器是一個逐步關閉電源的過程, 對於液晶顯示器應該是一樣的.

正因爲X的屏幕保護由兩部分控制, 單純的關閉DPMS或者BlankTime都不行, 必須都關掉. 所以我在.xinitrc中加入了下面的命令, 具體解釋和其它xset命令參數見Manual.

xset s off
xset dpms 0 0 0

但是這樣暴力關閉顯得不大環保, 尤其是整宿不關機下載的情況, 可以選擇把DPMS和BlankTime的超時時間設置得久一點, 或者加一條alias用來手動關閉顯示器電源(筆記本沒顯示器開關).

alias soff='sleep 5 && xset dpms force off'

之所以sleep 5是爲了防止命令執行以後因爲手抖或者合上筆記本的蓋子而喚醒顯示器. 同時這也解釋了我爲什麼在上一步不用xset -dpms, 因爲關顯示器的時候會再次啓用DPMS模塊, 屏保又開始生效了, 而置0只是關屏保而不關DPMS, 留着這個模塊用來關顯示器. 還有一個原因在於有的桌面環境會不停得去檢測並啓用DPMS模塊, 無法簡單地關閉DPMS模塊.

此外, 如果你的筆記本電腦合上蓋子時dmesg能夠檢測到lid button信號, 可以在acpi的配置文件/etc/acpi/events/lm_lid設置相應的動作, 我的完全沒有檢測到, 也就沒有細研究了.

—————-用來補充的分割線—————-

我用xlockmore鎖屏幕的, 它有個-dpmsoff的參數, 後接秒數, 用來關屏幕電源. 這下方便多了, 現在的狀態是: 平時沒有屏保, 鎖屏幕順便關掉顯示器電源.

PS: 貌似這個參數有個小bug, 它要求加個秒數, 但是不理會具體的值, 算了, 能關就好.


總結

在使用

xset s off
xset dpms 0 0 0
xset -dpms

這樣關閉了X的電源管理和屏幕保護後,板子目前屏幕不會自動關閉 (終於擺脫了600s就黑屏的噩夢)

爲了使得開機自動載入X環境並且設置好DPMS和屏保程序關閉,我們首先修改/etc/X11/xinit/xinitrc中代碼如下(爲了方便我並沒有拷貝一份xinitrc到用戶目錄,startx會最終到/etc/X11/xinit/目錄下執行xinitrc):

#!/bin/sh

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
#. /etc/X11/Xsession

sleep 5										#休眠5s,也可以去掉

export DISPLAY=:0.0					#載入DISPLAY變量
echo "DO MY COMMAND"			#隨便輸出的東西
xset s off										#關閉X Screen Save
xset dpms 0 0 0							#關閉DPMS
xset -dpms

/home/sements/G-TimerCounter &			#後臺執行我自己的一個小程序
openbox-session								#喚起我板子上的openbox
#. /etc/X11/Xsession						#導回原本默認的Xsession

然後,爲了開機執行,我們在/etc/目錄下建立 rc.local文件

#!/bin/bash

startx&

exit 0

賦予其+x屬性

sudo chmod +x /etc/rc.local

這樣,在linux啓動後,會執行/etc/rc.local下的命令,即
startx&

startx最終會調用/etc/X11/xinit/xinitrc下的命令·

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章