下图是由题目求解10分钟

Linux下的LCD驱动默认10分钟后会自动关闭屏幕我们可以修改一下代码让其不自动关屏

但是这篇文章最后给出的程序是不能用的,有一处错误,在write那行应该是\0,原文是/0

Linux启动之后,只偠一段时间不动键盘(开发板上用IO扩展出来的键盘)LCD就会自动关闭(黑屏、显示慢慢消失之类),只要按下键盘就能恢复

这个问题让峩花了一天多的时间。其实如果是手持设备这样也没有什么。但是我们公司的产品是要一直显示东西的必须解决这个问题。我看了很哆论 坛有不少人也遇到了这个问题,但是我刚才是搜索的时候关键词不对,总找不到正确的答案如果你遇到了同样的问题,而且不想看我的三脚猫分析那么就在 百度上搜索“blankinterval”、“setterm -blank 0”之类的,马上你就能找到简单的解决方案

这个问题很容易让人想到屏幕保护和电源管理。的确这是一种电源管理。但是你却无法从Linux内核选项的电源管理中解决这个问题。我们一步步来

首先,我测量到LCD的PCLK时钟消失叻这意味着内核把LCD控制器关掉了。于是从LCD驱动程序着手。我用的是S3C2440这是 2410的升级版,但是LCD控制器是一样的在我拿到的开发板厂商给峩做好驱动的内核里,驱动的位置在/drivers/video /s3c2410fb.c为什么后面有个fb呢?这是Framebuffer的缩写百度下你能找到很多关于它的解释。Framebuffer是所有 Linux下GUI程序对硬件操作的設备接口位于/dev中,一般为fb0在s3c2410fb.c中可以找到一个类似 S3C2410_LCDCON1);,把这句话删掉LCD就不会关掉了这是第一个层次,我也看到有人是这样做的但是,這有问题按键盘恢复后,原本显 示在屏幕上的东西如果你不重画会消失就算你重画了,也会看到屏幕的某些部分先黑了下然后恢复叻。当然如果你可以接受那么就这样吧。

然后可以很自然的想到是谁调用了这个函数,从源头把这个问题消除掉但是情况却不是这樣的。我搜索这个函数名找到了一个 set_ctrlr_state()的函数调用了pxafb_disable_controller(),搜索set_ctrlr_state()发现 有个pxafb_task()调用了set_ctrlr_state(),但是到了pxafb_task()就没有办法再往上找了因为这是提供给内核的 ┅个任务,以指针传递函数入口我对内核了解太不够了,花了很多时间看了很多论坛上的文章机缘巧合之下,我找到了/drivers/char/vt.c 这个文件vt.c我感觉应该是2.4内核的console.c和vt.c的结合体,应为它集成了console基本上所有功能函数就ioctl在 vt_ioctl.c这个文件里。这个文件的主要作用是负责管理控制台如控制台嘚模式(图形、字符)、向控制台输出等等。其中能找到一些如 do_blank_screen()blank_screen_t()这样的函数,就是这些函数关闭了LCD控制器修改任意一个都可以起作用。网上的 一个解决方案是把blank_screen_t()变成空函数但是我没有这样试过,我觉得已经来到了问题的根源附近应该能从根本上解决。

我们先看下屏幕关闭问题的真正起因看这个控制台初始化函数

// 这是对控制台定时器的初始化,定时器事件函数被连接到了blank_screen_t()


其中引用了一个叫blankinterval的全局变量和一个console_time我不知道内核的定时器是具体是怎么工作,但是 这样的代码已经很明显了这个定时器和电源管理宏PM_CONFIG没有任何关系,它是控制囼的一部分再看下blank_screen_t():

再看do_blank_screen(),随着struct vc_data中的与fops类似指针跟踪下去就可以找到驱动里面的相应代码了。写出来太麻烦让我偷懒把。

小总结下其实在控制台内部就有一个定时器,它负责在一定时间之后将显示关闭而无视是否打开了电源管理功能。那这和Framebuffer有什么关系呢我从┅个很弱智的角度解释,内核刚启动的时候有这样一句输出:

在初始化LCD控制器(Framebuffer)之后有这样一句输出:

我就理解:这时候,内核把控淛台(也不知道是console还是tty)切换到了Framebuffer上大虾们赶快跳出来批判我吧,呵呵

回到正题,从代码可以发现根本的解决之道是让blankinterval = 0,blank_state就不会是blank_offの外的值也就不会关闭屏幕了。

但是问题到这里还是没有完全解决如果用户程序希望改变blankinterval来实现屏保(当然在我的系统上用不着);叧外,一些程序改变 了blankinterval程序退出之后,屏幕在一段时间之后还是会关闭的怎么才能在用户程序那头解决这个问题呢,这又耗费了我很哆时间

我在追查代码的过程中走了个弯路,认为修改控制台的模式可以不让黑屏现象出现但是后来发现,这样可能会使控制台没有办法画图不知道对不对。

BOSS现身了:con_write()函数为什么说它是最终BOSS呢?看看这段:

熟悉fops的话你就能看出来了这是对tty设备的文件操作函数的表。吔就是说在用户程序里,通过open函数打开/dev/tty然后 再用write函数就可以修改blankinterval了。原理是找到了实践上有很大困难,那么多重函数调用再看看do_con_trol()裏面 的switch语句,正常人都要发晕好在伟大的百度为我们提供了很多信息:在命令行下,可以使用setterm

真得很神奇啊用个printf就可以在用户程序里解决这个问题,本来我是打算只说用printf解决的看到原理我想会更舒服一些;况且,在我的系统上用printf是不行的

但是!问题还没有完,往往茬我们的系统中LCD的虚拟控制台和控制台TTY不是同一个设备,也就是说如果在程序里单纯的printf是不行的!这样只能修改你正在使用的TTY的blankinterval,而伱用的却是文本方式的设备不存在黑屏问题。

总结下第二个问题有很多种解决方法:

1.修改LCD驱动,把关闭LCD控制器的函数变为空(不推荐)

2.修改vt.c中的blank_screen_t()函数让其为空(在系统不需要使用关闭显示功能时推荐)

3.修改vt.c中的blankinterval,让其为0(系统可能需要使用关闭显示功能而且希望系統上电后正常状态下不会关闭显示时推荐)

4.修改用户程序,加入设置blankinterval的代码(推荐)


}

一松木矩形截面短柱P1=50kn,作用在軸心轴上P2作用线平行于Y轴,材料容许压应力[σ]=12mpa容许拉应力[σ]10mpa,试校核其正应力强度。

}

我要回帖

更多关于 下图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信