天天看點

LCD 每隔10分鐘 自動熄滅 --打開Framebuffer console的時候【轉】

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

之前移植LCD的時候,一切正常,但是當嘗試把log輸出到lcd的時候,總是會出現10分鐘黑屏,無論如何都喚不醒

通過打log,最終定位到s3c_fb_blank這個函數。

static int s3c_fb_blank(int blank_mode, struct fb_info *info)  

{  

    struct s3c_fb_win *win = info->par;  

    struct s3c_fb *sfb = win->parent;  

    unsigned int index = win->index;  

    u32 wincon;  

printk("lj:s3c_fb_blank:blank mode:%d\n",blank_mode);  

    dev_dbg(sfb->dev, "blank mode %d\n", blank_mode);  

    pm_runtime_get_sync(sfb->dev);  

    wincon = readl(sfb->regs + sfb->variant.wincon + (index * 4));  

    switch (blank_mode) {  

    case FB_BLANK_POWERDOWN:  

        wincon &= ~WINCONx_ENWIN;  

        sfb->enabled &= ~(1 << index);  

        /* fall through to FB_BLANK_NORMAL */  

    case FB_BLANK_NORMAL:  

        /* disable the DMA and display 0x0 (black) */  

        shadow_protect_win(win, 1);  

        dump_stack();  

        writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x00),//liujia  disable the black screen  

               sfb->regs + sfb->variant.winmap + (index * 4));  

        shadow_protect_win(win, 0);  

        break;  

    case FB_BLANK_UNBLANK:  

        writel(0x0, sfb->regs + sfb->variant.winmap + (index * 4));  

        wincon |= WINCONx_ENWIN;  

        sfb->enabled |= (1 << index);  

    case FB_BLANK_VSYNC_SUSPEND:  

    case FB_BLANK_HSYNC_SUSPEND:  

    default:  

        pm_runtime_put_sync(sfb->dev);  

        return 1;  

    }  

    shadow_protect_win(win, 1);  

    writel(wincon, sfb->regs + sfb->variant.wincon + (index * 4));  

    shadow_protect_win(win, 0);  

    /* Check the enabled state to see if we need to be running the 

     * main LCD interface, as if there are no active windows then 

     * it is highly likely that we also do not need to output 

     * anything. 

     */  

    /* We could do something like the following code, but the current 

     * system of using framebuffer events means that we cannot make 

     * the distinction between just window 0 being inactive and all 

     * the windows being down. 

     * 

     * s3c_fb_enable(sfb, sfb->enabled ? 1 : 0); 

    */  

    /* we're stuck with this until we can do something about overriding 

     * the power control using the blanking event for a single fb. 

    if (index == sfb->pdata->default_win) {  

        s3c_fb_enable(sfb, blank_mode != FB_BLANK_POWERDOWN ? 1 : 0);  

    pm_runtime_put_sync(sfb->dev);  

    return 0;  

}  

問題就出在

writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x00),//liujia  disable the black screen

      sfb->regs + sfb->variant.winmap + (index * 4));

發現執行到這裡,LCD就黑屏了。

查資料手冊發現:

LCD 每隔10分鐘 自動熄滅 --打開Framebuffer console的時候【轉】

這個寄存器的意思是,當MAPCOLEN_F使能的時候,他會把LCD顯示成MAPCOLOR設定成顔色,關閉LCD的DMA功能,然後Framebuffer就不能重新整理LCD了。

這也許就是FB_BLANK_NORMAL,這個的功能吧,把LCD一直刷成某個顔色。

參考http://blog.csdn.net/zanget/article/details/6569743這個 大俠的部落格,

加入dump_stack

case FB_BLANK_NORMAL:  

    /* disable the DMA and display 0x0 (black) */  

    dump_stack();  

    writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x00),//liujia  disable the black screen  

           sfb->regs + sfb->variant.winmap + (index * 4));  

    break;  

log:

<7>[   61.285759] lj:s3c_fb_blank:blank mode:1  

<7>[   61.285772] lj:shadow_protect_win:1  

<7>[   61.285816] [<80013120>] (unwind_backtrace+0x0/0xec) from [<801af0b8>] (s3c_fb_blank+0x84/0x180)  

<7>[   61.285835] [<801af0b8>] (s3c_fb_blank+0x84/0x180) from [<801a2bcc>] (fb_blank+0x3c/0x68)  

<7>[   61.285852] [<801a2bcc>] (fb_blank+0x3c/0x68) from [<801a9690>] (fbcon_blank+0x118/0x260)  

<7>[   61.285875] [<801a9690>] (fbcon_blank+0x118/0x260) from [<801c7594>] (do_blank_screen+0x1b8/0x258)  

<7>[   61.285892] [<801c7594>] (do_blank_screen+0x1b8/0x258) from [<801c884c>] (console_callback+0xe4/0x114)  

<7>[   61.285909] [<801c884c>] (console_callback+0xe4/0x114) from [<8002e12c>] (process_one_work+0x1e8/0x318)  

<7>[   61.285927] [<8002e12c>] (process_one_work+0x1e8/0x318) from [<800301c0>] (worker_thread+0x1b4/0x2b4)  

<7>[   61.285947] [<800301c0>] (worker_thread+0x1b4/0x2b4) from [<80033438>] (kthread+0x88/0x94)  

<7>[   61.285969] [<80033438>] (kthread+0x88/0x94) from [<8000ec20>] (kernel_thread_exit+0x0/0x8)  

<7>[   61.285979] lj:shadow_protect_win:0  

<7>[   61.285984] lj:shadow_protect_win:1  

<7>[   61.285990] lj:shadow_protect_win:0  

<7>[   61.285995] lj:shadow_protect_win:1  

<7>[   61.286001] lj:s3c_fb_set_par  

<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;

這樣就不會出現黑屏的現象了。

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/7650478.html,如需轉載請自行聯系原作者

繼續閱讀