今天接到了一个任务,实现显示屏的关和开
理了下思路:
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 命令的输出,知道终端支持以下视频接口:
- DFP1
- LVDS
- CRT1
注:很多时候会有VGA接口,它可外接显示器、投影仪等VGA 设备。
LVDS就是内置的液晶屏接口。
xrandr
不带参数的xrandr 命令会列出系统支持的视频接口名称和设备连接情况。
Screen 0: minimum 320 x 200, current 1080 x 1920, maximum 1920 x 1920LVDS 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