让framebuffer不显示光标,在没有控制台的framebuffer上显示logo

来源:互联网 发布:淘宝众筹在哪 编辑:程序博客网 时间:2024/05/16 12:20

  使用Framebuffer显示画面,总有一个小黑方块,一看就像是控制台光标。为了去掉它,上网一查,有人说把fbcon.c文件里的fbcon_cursor()函数改成空函数。我觉得这样改内核代码太野蛮了,以后也不好维护移植,不作为首选方案。自己看代码,发现在bit_cursor()里面,如果驱动注册了光标函数,就调用驱动的光标函数,否则调用soft_cursor()。赶紧翻到驱动代码amba-clcd.c一看,果然没注册光标函数,那就自己写个空的注册进去,就像下面这样,然后编译验证,果然小方块没有了。

static struct fb_ops clcdfb_ops = {
    .owner = THIS_MODULE,
    .fb_check_var = clcdfb_check_var,
    .fb_set_par = clcdfb_set_par,
    .fb_setcolreg = clcdfb_setcolreg,
    .fb_blank = clcdfb_blank,
    .fb_fillrect = cfb_fillrect,
    .fb_copyarea = cfb_copyarea,
    .fb_imageblit = cfb_imageblit,
    .fb_mmap = clcdfb_mmap,
    .fb_cursor = clcdfb_fb_cursor,
};

  按说到这里问题已经解决了,但仍然觉得不够完美。我们用framebuffer只用来做界面,不需要控制台功能,那么直接把控制台功能关了不是更好。于是make menuconfig,从配置里去除FRAMEBUFFER_CONSOLE,原以为这样就好了,可结果屏幕完全没有显示,连背光都不亮。

  由于背光不亮,首先想到是控制LCD电源的GPIO没有设置。设置这些GPIO的代码在spear320.c的lcd_enable()函数中,它又经过辗转被clcdfb_set_par()、fb_set_var()调用。在fb_set_var()中发现由于var->activate值的缘故,前面的函数并未执行。于是又回到驱动代码amba-clcd.c中,在clcdfb_register()里面给fb->fb.var.activate增加一个FB_ACTIVATE_FORCE属性,然后屏幕就又能显示了。

  事情还没有结束,原先配置有FRAMEBUFFER_CONSOLE的时候,启动时是会显示logo的,但现在却没有logo了,还要想办法把logo弄出来。参考了另一硬件驱动au1200fb.c,把如下代码加到clcdfb_probe()中,放在调用register_framebuffer()之后。


#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)
        if (fb_prepare_logo(&fb->fb, FB_ROTATE_UR)) {
            /* Start display and show logo on boot */
            fb_set_cmap(&fb->fb.cmap,
                    &fb->fb);
            fb_show_logo(&fb->fb, FB_ROTATE_UR);
        }
#endif


  至此,显示小方块的问题解决,只修改了本设备的驱动,没有改其它内核文件。


原创粉丝点击