今天接到了一個任務,實現顯示屏的關和開
理了下思路:
1.需求:實現終端的開關屏,要求僅僅是終端的螢幕關掉了,但是系統仍舊在跑,可以用遙控器喚醒
2.方向:
2.1. 切斷顯示屏的電源,進入省電模式
其實這就包含了兩方面的
1) 用硬體切斷,即,直接關掉顯示器的電源
2) 軟體切斷,因為後續是要通過遙控喚醒
2.2. 關掉顯卡的輸出功能
說說我的彎彎的實現之路吧:
最開始想的是,我的台式電腦不就是直接把顯示器上面的電源開關一按就可以了嘛,那麼,終端上面有沒有對應的硬體介面,因為本人是硬體出身,幹什麼都喜歡先想想硬體上面有沒有介面。於是就問老大,硬體有介面嗎?結果預想中的一樣:沒有。
那好吧,沒有的話,那就換其他的方法。於是就在google和百度,搜尋的關鍵字“Linux 開關螢幕” 之類的,找到了一些資料,雖說對我這個功能的作用不大,但是對瞭解整個Linux環境還是很不錯的。上面介紹了好幾種怎麼樣實現讓系統掛起,讓其待機,睡眠或者休眠的方法。
首先說說待機的方法吧。
# cd /sys/power/
# cat state
顯示的是系統所支援的待機方式:mem disk
# echo "mem" > ./state
整個螢幕就黑了,看看終端的狀態,系統已經沒有工作,只有電源燈亮著,這是在給記憶體供電。
要想啟動系統,只用按主板上的power鍵就可以了。
但是很遺憾,我們的終端在用這個方法的時候,很不穩定,完全無法預估什麼時候系統就掛了,然後還要重新啟動。
這種悲劇往往都會發生在老大過來看成果的時候,所以,老大說,要的不是這樣的效果。不需要讓整個系統都停下來,因為這個產品的特殊性,要求開機之後直接上電,沒有特殊原因是不會斷電的,所以開機鍵也會在某種意義上不是經常用。而且最重要的是因為,我們的需求是要求能夠用遙控喚醒,但是在待機狀態的時候,系統的應用程式都沒有運行了,遙控訊號的接收都需要用應用程式來工作,所以,這個方法對我們的需求協助不大(所以說,需求才是老大)。
就是說,硬體切斷和軟體切斷都沒戲了(至少那個時候是這樣想的)
那好吧,只剩下關掉顯卡輸出這一個方法了,正好他們給我布置任務的時候,是要求我用ATI的顯卡SDK中的介面實現的,那就按照他們說的去看看。
其實很慚愧,因為本人對SDK的不是很熟悉,只好耐著頭皮看文檔了,然後看了下Sample,又去網頁版上面把每一個函數介面和struct以及常量都熟悉了一遍,其實是翻譯加理解了一遍。行,好像有兩個介面,一個是啟用或者禁用指定的Adapter,即int ADL_Adapter_Active_SetPrefer (int iAdapterIndex, int iStatus, int iNumPreferTarget,ADLDisplayTarget
*lpPreferTarget, int *lpNewlyActivate),另一個是動態使能GPU的顯示int ADL_DisplayEnable_Set (int iAdapterIndex, int *lpDisplayIndexList, int iDisplayListSize, int bPersistOnly)。
仔細研究了下參數和平台,發現一個不支援LINUX,一個要求randr版本在1.2以下,我們的是1.3。其實我也不是很拿的定把握,因為畢竟沒有實現……
後來就不知道怎麼辦了,想起上次要求找的介面,也是實現開關屏的,想了想,說不定可以參考下。
命令其實很簡單,xset
關屏:$ xset dpms force off
開屏:$ xset dpms force on
但是這種開關屏時間很短,敲擊鍵盤或者滑鼠,就可以開屏,想了好久,既然X可以實現關屏,那麼肯定是有介面的,但是這介面在哪裡呢?如果用這個命令,那麼就要屏蔽掉滑鼠和鍵盤的一系列事件,這也不是一個很輕鬆的活計,說不定會越弄越亂。
想了想,其實,我們所說的讓顯卡不輸出東西,是不是有點要求太高了,關於螢幕的開關,應該是在電源上做文章吧,切掉電源。顯卡不輸出,如果說顯卡依舊輸出,但是螢幕不接收可不可以?強行讓該螢幕不接收任何東西,就是把螢幕禁用。(螢幕,即顯示裝置,如LVDS、VGA、DFP1、CRT1、DVI等等)
於是就去google了“linux 關屏”,找到了一個不錯的文章,
如下:http://www.aiview.com/linux/
VGA 的輸出可以利用xrandr 命令控制,這個軟體包應該已經跟隨xorg-x11安裝好了。
通過xrandr 命令的輸出,知道終端支援以下視頻介面:
註:很多時候會有VGA介面,它可外接顯示器、投影儀等VGA 裝置。
LVDS就是內建的液晶屏介面。
xrandr
不帶參數的xrandr 命令會列出系統支援的視頻介面名稱和裝置串連情況。
Screen 0: minimum 320 x 200, current 1080 x 1920, maximum 1920 x 1920
LVDS connected 1080x1920+0+0 right (normal left inverted right x axis y axis) 930mm x 523mm
1920x1080 60.0*+
1680x1050 60.0
1400x1050 60.0
1600x900 60.0
1280x1024 60.0
1440x900 60.0
1280x960 60.0
1280x768 60.0
1280x720 60.0
1024x768 60.0
800x600 60.0
640x480 60.0
DFP1 disconnected (normal left inverted right x axis y axis)
CRT1 disconnected (normal left inverted right x axis y axis)
用以下命令將視頻輸出發送到某個介面裝置。
$ xrandr --output DFP1 --auto
用以下命令關閉某個介面裝置的視頻輸出。
$ xrandr --output LVDS --off嘗試了下,系統的顯示屏有3個 LVDS DFP1 CRT1 終於知道了為什麼在程式中去擷取系統的顯示器的資訊的時候,反饋回的是3個屏,2個顯示適配器,原來如此(很開心) LVDS是終端一直在使用的液晶顯示屏,DFP1是外接HDMI的屏的介面,至於這個CRT1,估計如上述文章所說只是硬體整合的有而已。 只能說,Linux博大精深,學習和探索不在一朝一日。 偉大的X