uboot启动完成,kernel启动时lcd屏…

原创 2013年12月02日 09:12:48

先说说开发环境吧:

1 内核:linux2.6.xx

2 uboot:买开发板带的

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

 

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

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

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

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

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

有两种方法可以实现方法
   就是最直接的办法:在uboot关lcd背光,在kernel中打开lcd背光
  
   在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!!!问题完美解决。。。。。。。。。。。。。。

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

相关文章推荐

uboot中关于LCD的代码分析

以下内容源于朱有鹏《物联网大讲坛》课程的学习,如有侵权,请告知删除。 1、在uboot-jiuding/board.c中,init_sequence中的display_banner中的open_b...

LCD 在uboot和Kernel中的基本流程

转自http://blog.csdn.net/li_heaven1/article/details/9786431 一、LCD显示的基本原理   通过framebuffer,应用程序用mmap把显...

imx6下uboot设置启动时默认显示方式为LCD显示

进入uboot后输入以下命令:                                 # setenv lcdtype 7.0                        //设置为7寸...

IMX6Solo启动流程-从上电到Uboot

RIotBoard开发板/i.MX6 Solo的启动流程,从上电到内核。

UBoot开机图片显示

By Toradex胡珊逢 1). 简介 在之前的文章中,我们已经介绍了如何在 Linux中添加开机图片,实现定制化的开机 Logo 显示。或许你也已经注意到了,在设备刚上电启动的时候,L...

在uboot里面添加环境变量使用run来执行并启动时自动执行run

在移植uboot的时候,可以在uboot里面添加定义一些自己的环境变量,这些环境变量可以大大提高以后的工作效率,比如我在uboot里面添加如下环境变量: mirror=sf probe 0;mw.b...

linux kernel是如何做到释放仅在启动时使用的内存的?

linux内核释放启动内存

Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文

Init.h中有相关initcall的启动次序,在system.map中可看出具体的__initcall指针的前后次序   #define pure_initcall(fn) __define_i...

手机启动到Kernel阶段LCD黑屏

1. 使用LCD IC为ili9806e,手机从preloader-lk-kernel时启动到kernel时屏幕黑屏,从串口log看手机已经开机,开机动画已经播放完全 2. 屏幕黑掉原因猜测如下: 2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uboot启动完成,kernel启动时lcd屏…
举报原因:
原因补充:

(最多只允许输入30个字)