博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCD 每隔10分钟 自动熄灭 --打开Framebuffer console的时候【转】
阅读量:5775 次
发布时间:2019-06-18

本文共 4299 字,大约阅读时间需要 14 分钟。

转自:

之前移植LCD的时候,一切正常,但是当尝试把log输出到lcd的时候,总是会出现10分钟黑屏,无论如何都唤不醒

通过打log,最终定位到s3c_fb_blank这个函数。

[cpp]
  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]
  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]
  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;
这样就不会出现黑屏的现象了。

转载于:https://www.cnblogs.com/sky-heaven/p/7650478.html

你可能感兴趣的文章
SAP上阿里云白皮书-第四章 SAP上阿里云规划
查看>>
第7章 使用Keras开发神经网络
查看>>
Linux上的TIME_WAIT和tcp_fin_timeout
查看>>
回顾工作经历,工业“大数据”是发展的必然吗?
查看>>
大二上册生活总结
查看>>
开发手记(一)准备新的征途
查看>>
OS X Keyboard Shortcuts
查看>>
Mutual information and Normalized Mutual information 互信息和标准化互信息
查看>>
python用作监控
查看>>
Centos 升级python2.7到python3.4.2
查看>>
布局小窍门之----让头部和主干内容居中
查看>>
日志分析代码实现(正则表达式)
查看>>
Linux RH5平台下使用Oracle ASM创建数据库
查看>>
js closure ,copy from stackoverflow
查看>>
小型企业局域网免费上网行为管理方案
查看>>
linux PATH变量
查看>>
LoadRunner编程之文件的操作
查看>>
redis报错
查看>>
unit 4
查看>>
React Native 参考资料 (转自简书)
查看>>