今天接到了一个任务,实现显示屏的关和开

        理了下思路:

1.需求:实现终端的开关屏,要求仅仅是终端的屏幕关掉了,但是系统仍旧在跑,可以用遥控器唤醒

2.方向:

2.1. 切断显示屏的电源,进入省电模式

       其实这就包含了两方面的

        1) 用硬件切断,即,直接关掉显示器的电源

        2) 软件切断,因为后续是要通过遥控唤醒

2.2. 关掉显卡的输出功能


说说我的弯弯的实现之路吧:

        最开始想的是,我的台式电脑不就是直接把显示器上面的电源开关一按就可以了嘛,那么,终端上面有没有对应的硬件接口,因为本人是硬件出身,干什么都喜欢先想想硬件上面有没有接口。于是就问老大,硬件有接口吗?结果预想中的一样:没有。

        那好吧,没有的话,那就换其他的方法。于是就在google和百度,搜索的关键字“Linux 开关屏幕” 之类的,找到了一些资料,虽说对我这个功能的作用不大,但是对了解整个Linux环境还是很不错的。上面介绍了好几种怎么样实现让系统挂起,让其待机,睡眠或者休眠的方法。

        首先说说待机的方法吧。

        # cd /sys/power/

        # cat state  

        显示的是系统所支持的待机方式:mem disk

        # echo "mem" > ./state

        整个屏幕就黑了,看看终端的状态,系统已经没有工作,只有电源灯亮着,这是在给内存供电。

        要想启动系统,只用按主板上的power键就可以了。

        但是很遗憾,我们的终端在用这个方法的时候,很不稳定,完全无法预估什么时候系统就挂了,然后还要重新启动。

        这种悲剧往往都会发生在老大过来看成果的时候,所以,老大说,要的不是这样的效果。不需要让整个系统都停下来,因为这个产品的特殊性,要求开机之后直接上电,没有特殊原因是不会断电的,所以开机键也会在某种意义上不是经常用。而且最重要的是因为,我们的需求是要求能够用遥控唤醒,但是在待机状态的时候,系统的应用程序都没有运行了,遥控信号的接收都需要用应用程序来工作,所以,这个方法对我们的需求帮助不大(所以说,需求才是老大)。

        就是说,硬件切断和软件切断都没戏了(至少那个时候是这样想的)

        那好吧,只剩下关掉显卡输出这一个方法了,正好他们给我布置任务的时候,是要求我用ATI的显卡SDK中的接口实现的,那就按照他们说的去看看。

ADL_Adapter_Active_SetPrefer (int iAdapterIndex, int iStatus, int iNumPreferTarget,ADLDisplayTarget *lpPreferTarget, int *lpNewlyActivate),另一个是动态使能GPU的显示int ADL_DisplayEnable_Set

        仔细研究了下参数和平台,发现一个不支持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 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