LCD 每隔10分钟 自动熄灭 --打开Framebuffer console的时候【转】

转自:http://blog.csdn.net/liujia2100/article/details/9009063

版权声明:本文为博主原创文章,未经博主允许不得转载。

之前移植LCD的时候,一切正常,但是当尝试把log输出到lcd的时候,总是会出现10分钟黑屏,无论如何都唤不醒
通过打log,最终定位到s3c_fb_blank这个函数。

[cpp] view plain copy

  1. static int s3c_fb_blank(int blank_mode, struct fb_info *info)  
  2. {  
  3.     struct s3c_fb_win *win = info->par;  
  4.     struct s3c_fb *sfb = win->parent;  
  5.     unsigned int index = win->index;  
  6.     u32 wincon;  
  7. printk("lj:s3c_fb_blank:blank mode:%d\n",blank_mode);  
  8.     dev_dbg(sfb->dev, "blank mode %d\n", blank_mode);  
  9.   
  10.     pm_runtime_get_sync(sfb->dev);  
  11.   
  12.     wincon = readl(sfb->regs + sfb->variant.wincon + (index * 4));  
  13.   
  14.     switch (blank_mode) {  
  15.     case FB_BLANK_POWERDOWN:  
  16.         wincon &= ~WINCONx_ENWIN;  
  17.         sfb->enabled &= ~(1 << index);  
  18.         /* fall through to FB_BLANK_NORMAL */  
  19.   
  20.     case FB_BLANK_NORMAL:  
  21.         /* disable the DMA and display 0x0 (black) */  
  22.         shadow_protect_win(win, 1);  
  23.         dump_stack();  
  24.         writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x00),//liujia  disable the black screen  
  25.                sfb->regs + sfb->variant.winmap + (index * 4));  
  26.         shadow_protect_win(win, 0);  
  27.         break;  
  28.   
  29.     case FB_BLANK_UNBLANK:  
  30.         shadow_protect_win(win, 1);  
  31.         writel(0x0, sfb->regs + sfb->variant.winmap + (index * 4));  
  32.         shadow_protect_win(win, 0);  
  33.         wincon |= WINCONx_ENWIN;  
  34.         sfb->enabled |= (1 << index);  
  35.         break;  
  36.   
  37.     case FB_BLANK_VSYNC_SUSPEND:  
  38.     case FB_BLANK_HSYNC_SUSPEND:  
  39.     default:  
  40.         pm_runtime_put_sync(sfb->dev);  
  41.         return 1;  
  42.     }  
  43.   
  44.     shadow_protect_win(win, 1);  
  45.     writel(wincon, sfb->regs + sfb->variant.wincon + (index * 4));  
  46.     shadow_protect_win(win, 0);  
  47.   
  48.     /* Check the enabled state to see if we need to be running the 
  49.      * main LCD interface, as if there are no active windows then 
  50.      * it is highly likely that we also do not need to output 
  51.      * anything. 
  52.      */  
  53.   
  54.     /* We could do something like the following code, but the current 
  55.      * system of using framebuffer events means that we cannot make 
  56.      * the distinction between just window 0 being inactive and all 
  57.      * the windows being down. 
  58.      * 
  59.      * s3c_fb_enable(sfb, sfb->enabled ? 1 : 0); 
  60.     */  
  61.   
  62.     /* we're stuck with this until we can do something about overriding 
  63.      * the power control using the blanking event for a single fb. 
  64.      */  
  65.     if (index == sfb->pdata->default_win) {  
  66.         shadow_protect_win(win, 1);  
  67.         s3c_fb_enable(sfb, blank_mode != FB_BLANK_POWERDOWN ? 1 : 0);  
  68.         shadow_protect_win(win, 0);  
  69.     }  
  70.   
  71.     pm_runtime_put_sync(sfb->dev);  
  72.     return 0;  
  73. }  

问题就出在
writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x00),//liujia  disable the black screen
      sfb->regs + sfb->variant.winmap + (index * 4));
发现执行到这里,LCD就黑屏了。
查数据手册发现:

这个寄存器的意思是,当MAPCOLEN_F使能的时候,他会把LCD显示成MAPCOLOR设置成颜色,关闭LCD的DMA功能,然后Framebuffer就不能刷新LCD了。
这也许就是FB_BLANK_NORMAL,这个的功能吧,把LCD一直刷成某个颜色。
参考http://blog.csdn.net/zanget/article/details/6569743这个 大侠的博客,
加入dump_stack

[cpp] view plain copy

  1. case FB_BLANK_NORMAL:  
  2.     /* disable the DMA and display 0x0 (black) */  
  3.     shadow_protect_win(win, 1);  
  4.     dump_stack();  
  5.     writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x00),//liujia  disable the black screen  
  6.            sfb->regs + sfb->variant.winmap + (index * 4));  
  7.     shadow_protect_win(win, 0);  
  8.     break;  

log:

[cpp] view plain copy

  1. <7>[   61.285759] lj:s3c_fb_blank:blank mode:1  
  2. <7>[   61.285772] lj:shadow_protect_win:1  
  3. <7>[   61.285816] [<80013120>] (unwind_backtrace+0x0/0xec) from [<801af0b8>] (s3c_fb_blank+0x84/0x180)  
  4. <7>[   61.285835] [<801af0b8>] (s3c_fb_blank+0x84/0x180) from [<801a2bcc>] (fb_blank+0x3c/0x68)  
  5. <7>[   61.285852] [<801a2bcc>] (fb_blank+0x3c/0x68) from [<801a9690>] (fbcon_blank+0x118/0x260)  
  6. <7>[   61.285875] [<801a9690>] (fbcon_blank+0x118/0x260) from [<801c7594>] (do_blank_screen+0x1b8/0x258)  
  7. <7>[   61.285892] [<801c7594>] (do_blank_screen+0x1b8/0x258) from [<801c884c>] (console_callback+0xe4/0x114)  
  8. <7>[   61.285909] [<801c884c>] (console_callback+0xe4/0x114) from [<8002e12c>] (process_one_work+0x1e8/0x318)  
  9. <7>[   61.285927] [<8002e12c>] (process_one_work+0x1e8/0x318) from [<800301c0>] (worker_thread+0x1b4/0x2b4)  
  10. <7>[   61.285947] [<800301c0>] (worker_thread+0x1b4/0x2b4) from [<80033438>] (kthread+0x88/0x94)  
  11. <7>[   61.285969] [<80033438>] (kthread+0x88/0x94) from [<8000ec20>] (kernel_thread_exit+0x0/0x8)  
  12. <7>[   61.285979] lj:shadow_protect_win:0  
  13. <7>[   61.285984] lj:shadow_protect_win:1  
  14. <7>[   61.285990] lj:shadow_protect_win:0  
  15. <7>[   61.285995] lj:shadow_protect_win:1  
  16. <7>[   61.286001] lj:s3c_fb_set_par  
  17. <7>[   61.286005] lj:shadow_protect_win:0  

找到了调用关系
console_callback--->do_blank_screen--->fb_blank--->s3c_fb_blank.
按照http://blog.csdn.net/zanget/article/details/6569743修改方法
将vt.c   179行
static int blankinterval = 10*60;
修改为
static int blankinterval = 0;
这样就不会出现黑屏的现象了。

时间: 2024-11-01 05:05:56

LCD 每隔10分钟 自动熄灭 --打开Framebuffer console的时候【转】的相关文章

Linux下LCD 10分钟自动关屏的问题总结

Linux下的LCD驱动默认10分钟后会自动关闭屏幕,我们可以修改一下代码让其不自动关屏 在有一个 drivers/char/vt.c 文件其中有一个变量(blankinterval)可以设置它来修改自动关屏的时间,也可以在函数(blank_screen_t)开头直接返回,这样就永远不会关屏了   在用LCD显示的时候,发现10分钟LCD就不再工作了.确实,Linux下有一个参数blankinterval的值就是10*60*Hz. 它决定了LCD只显示10分钟,然后LCD控制器就被关掉了. 具体

MYSQL每隔10分钟进行分组统计的实现方法_Mysql

前言 本文的内容主要是介绍了MYSQL每隔10分钟进行分组统计的实现方法,在画用户登录.操作情况在一天内的分布图时会非常有用,之前我只知道用「存储过程」实现的方法(虽然执行速度快,但真的是太不灵活了),后来学会了用高级点的「group by」方法来灵活实现类似功能. 正文: -- time_str '2016-11-20 04:31:11' -- date_str 20161120 select concat(left(date_format(time_str, '%y-%m-%d %h:%i'

10分钟自动部署Kubernetes1.6.1集群

Kubernetes是非常流行的容器管控平台,阿里云的容器服务团队为Kubernetes提供的基于阿里云服务的CloudProvider,让Kubernetes可以更好的和阿里云的计算资源深度集成,提供更好的性能和网络特性.本文主要目的是为大家提供一种非常简单的方法,在阿里云上部署Kubernetes集群. 本文所描述的部署过程基于阿里云资源编排服务(ROS),部署过程中会自动创建Kubernetes运行所需的VPC网络.安全组.子用户.ECS等资源,无需关注资源创建和安装细节.使大家能够非常简

每隔两分钟就显示数据库里的10条最新数据怎么做

问题描述 每隔两分钟就显示数据库里的10条最新数据怎么做 解决方案 解决方案二:那就每隔10分钟刷新一下页面了解决方案三:数据查询操作放到Timer控件的Tick事件里,每隔两分钟就显示数据库里的10条记录,查询语句里指明求最新追加的10条记录,如有自增的id则,selecttop10*fromtableorderbyiddesc解决方案四:selecttop10*fromtableorderbyiddesc访问数据库写对就OK了其他只要想办法实现定时刷新就可以刷新页面方法很多..整理了一下第一

用药提醒程序设计(原创)(定时、定时3次、按用户定时,前半小时2分钟提醒一次,后一个半小时10分钟提醒一次)

思路大致是这样的: 1.用户手动输入(模拟服务器发来的消息),将用药提醒时间存入SQLITE数据库,同时,每隔2分钟的间隔录入一个时间点,持续录入15个(即30分钟),每隔10分钟的间隔录入一个时间点,持续录入9个(即90分钟),共计2小时,24个标记位状态都列为0: 2.如果到了时间点,响起闹铃,用户取消,所有的标志位都重新置为1: 3.如果到了SQLITE录入时间点3小时以后的时间,所有的标志位重新置为0: 4.监听进程一直获取当前的时间,如果当前的时间到了数据库记录的时间点,并且标志位是0

10分钟定时访问某网址

问题描述 为了加快某网页的访问速度,设置缓存:问题是如果20分钟没人访问,缓存会被自动回收,有没有办法让程序每隔20分钟自动访问该网址???求大神解惑 解决方案 解决方案二:那你干脆把缓存设置为不删除,为何要加这20分钟限制呢解决方案三:可是如果一直不回收的话,系统会不会崩溃啊解决方案四:用在Global文件里面用定时器来实现定期访问,当低访问量的时候,缺点是受到iis的的影响,可能出现漏访问解决方案五:学习一下windows的计划任务.你要在一台(或者多台)电脑的windows计划中注册一个控

PowerPoint2007设置每隔一分钟就自动保存方法图解教程

看到过本文作者以前写过的有关Word和Excel每隔1分钟就自动保存文件的文章,就直接可以忽略本文了,因为Word.Excel和PPT的自动保存方法几乎是一模一样的,最多也就是名字叫法不同而已. 本文作者Office PowerPoint版本是2007的. Office PowerPoint 2007自动保存设置方法 1.打开在开始菜单找到并打开Microsoft Office PowerPoint 2007软件. 2.正常打开PowerPoint2007之后,如下图所示,找到PowerPoin

cron表达式:我想表达:1.每天的3:10到6:40每隔20分钟执行一次,怎么写呢

问题描述 cron表达式:我想表达:1.每天的3:10到6:40每隔20分钟执行一次,怎么写呢 cron表达式:我想表达:1.每天的3:10到6:40每隔20分钟执行一次,2.从3:10开始每隔20分钟执行一次,但执行20次,这两个cron表达式该怎么写呢 解决方案 可以设置每天几点几分,不能直接间隔 比如每小时的00,20,40,分钟执行

如何做到打开一个页面,过几分钟自动转到另一页面_基础知识

如何做到打开一个页面,过几分钟自动转到另一页面 1楼 <script>        window.setInterval("location='2.asp'",分钟数*60*1000);      </script> 2楼 setInterval("window.location='yourUrl'",youIntevalTime);