zoukankan      html  css  js  c++  java
  • uboot启动完成,kernel启动时lcd屏幕出现杂色解决办法

    先说说开发环境吧:

    1 内核:linux2.6.xx

    2 uboot:买开发板带的

     注释:在最后我又添加了问题得到完美解决的办法。

    问题:uboot启动完成,kernel启动时lcd屏幕出现杂色(比如:下半屏出现红色等

    分析原因:造成这个问题的原因可能是因为uboot启动完成,lcd显示缓冲区内有其

    他数据,而这时kernel启动还未完成lcd相关初始化,还未向缓冲器写数据造成的

    解决办法:在uboot完成启动内核的结尾,关闭lcd(也就是把背光关了),再在内

    核启动时lcd初始化中把lcd背光给打开。

    有两种方法可以实现方法
       1  就是最直接的办法:在uboot关lcd背光,在kernel中打开lcd背光
      
       2  在uboot中关闭lcd控制器的输出功能,在kernel中打开lcd控制器输出功能

    分析两种方法:最有用的还是1方法,直接见效。
                  方法2 不能从根本上解决问题

    解决中的难点:就是如何操作kernel中的相关寄存器,这是难点,因为内核中开启

    了MMU功能,不能使用绝对物理地址。而uboot中可以使用绝对物理地址,没有开启

    MMU


    具体修改代码:

    1 uboot修改地方:/cpu/s3c24xx/cpu.c在函数cleanup_before_linux中最后添加

    #define GPBCONEX (*(unsigned long *) 0x56000010)
    #define GPBDATEX (*(unsigned long *) 0x56000014)
    //turn off lcd 
    //sfx add   
    GPBCONEX &= ~0x03;
    GPBCONEX |= 0x01;
    GPBDATEX &= ~0x01;

    如果想把lcd控制器的输出也关了可以如下实现
    #define WINCON0 (* ((unsigned long *)(0x4c800014)))
    #define WINCON1 (* ((unsigned long *)(0x4c800018)))
    #define VIDCON0 (* ((unsigned long *)(0x4c800000)))
    #define VIDCON1 (* ((unsigned long *)(0x4c800004)))
    WINCON0 &= ~0x01;
    WINCON1 &= ~0x01;
    VIDCON0 &= ~0x03;
     

    2 kernel修改地方:/drivers/video/s3cfb.c在函数s3c-fb_probe中添加
    //**************turn on lcd backlight*****************

    printk("***********************setting lcd turn

    on**************************");
            int dat=0;
            dat=ioread32(S3C2410_GPBCON);
            iowrite32((dat&(~0x03)|0x01),S3C2410_GPBCON);
            dat=ioread32(S3C2410_GPBDAT);
            iowrite32(dat|0x01,S3C2410_GPBDAT);
    如果uboot中把lcd控制器的输出关闭了,这里这样打开就行了

        //********************turn on lcd output********************
            iowrite32(S3C_VIDCON0_ENVID_ENABLE,S3C_VIDCON0);
            iowrite32(S3C_WINCONx_ENWIN_F_ENABLE,S3C_WINCON0);
            iowrite32(S3C_WINCONx_ENWIN_F_ENABLE,S3C_WINCON1);

    学习心得:linux kernel中如何控制寄存器,用的是操作函数iowrite32

    (val,register)、ioread32(register)来实现
    相应寄存器的封装定义在include/asm/arch/regs-lcd.h
    include/asm/arch/regs-gpio.h

    终于找到问题的根本原因了,特在此进行一次修正,上面的方法也是可行的(经过验证的),不过为了追求完美可以用一下方法:

    前段时间移植在找uboot的原因,分析了uboot中lcd相关代码;今天想了想可不可以修改kernel来实现,于是乎就看了内核的lcd driver代码,当分析道lcd帧缓冲区建立且初始化时问题出现了,就是这里,我发现他们把这个缓冲区内存初始化为0xf0,很是奇怪,为什么不是0x00呢,于是把这试一试的心里,突然发现成功了,特在此和大家分享。由于内核中相关驱动代码的不同,仅提供参考,但遇到这类问题时可以首先考虑到缓冲区的初始化就对了。

    我的代码修改过程:/drivers/video/s3c_150inch.c

    在 int __init s3c_fb_map_video_memory(struct s3c_fb_info *fbi)函数中找到

    memset(fbi->map_cpu_f1, 0xf0, fbi->map_size_f1);

    memset(fbi->map_cpu_f2, 0xf0, fbi->map_size_f2);

    修改成:

    memset(fbi->map_cpu_f1, 0x00, fbi->map_size_f1);

    memset(fbi->map_cpu_f2, 0x00, fbi->map_size_f2);

    ok!!!问题完美解决。。。。。。。。。。。。。。

  • 相关阅读:
    python3-常用模块之openpyxl(1)
    测试团队的工作模式
    接口测试之HttpClient
    接口测试之PostMan
    接口测试之HTTP协议
    ant+jmeter安装配置
    数据库结构比较和结构迁移工具
    MS SQLServer表数据生成Insert语句
    MS SQLServer数据库结构及数据对比
    HTTP协议
  • 原文地址:https://www.cnblogs.com/skyred99/p/5684000.html
Copyright © 2011-2022 走看看