先说说开发环境吧:

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!!!问题完美解决。。。。。。。。。。。。。。

uboot启动完成,kernel启动时lcd屏幕出现杂色解决办法的更多相关文章

  1. 运行OpenGL红宝书第9版源码时Visual Studio提示“无法启动程序...ALL_BUILD。拒绝访问“的问题的解决办法

    问题描述: OpenGL红宝书第9版源码采用CMake编译后,用相应的Visual Studio(如VS2012)打开“vermilion9.sln”解决方案,并运行时Visual Studio提示“ ...

  2. 爬虫爬数据时,post数据乱码解决办法

    最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler.     F ...

  3. Bootstrap中关闭第二个模态框时出现的问题和解决办法

    Bootstrap中关闭第二个模态框时出现的问题和解决办法 1.关闭第二个模态框时,第一个模态框跟着消失. 解决办法: 第二个模态框的代码不要写在第一个模态框里面,确保两个模态框相对独立; 2.关闭第 ...

  4. oracle执行update语句时卡住问题分析及解决办法

    转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...

  5. 返回xml过长时被nginx截断的解决办法

    返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...

  6. IDEA使用maven构建时控制台中文乱码的解决办法

    使用maven clean install 项目时控制台中文乱码,解决办法如下: Setting->maven->runner VMoptions: -Dfile.encoding=UTF ...

  7. mongodb 更新数据时int32变为double的解决办法 & 教程

    https://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html mongodb 更新数据时int32变为double的解决办法   ...

  8. java下载文件时文件名出现乱码的解决办法

    转: java下载文件时文件名出现乱码的解决办法 2018年01月12日 15:43:32 橙子橙 阅读数:6249   java下载文件时文件名出现乱码的解决办法: String userAgent ...

  9. 全网最详细的zkfc启动以后,几秒钟以后自动关闭问题的解决办法(图文详解)

    不多说,直接上干货! 问题详情 情况描述如题所示,zkfc启动以后,几秒钟以后自动关闭. 解决办法: 1.检查下每台机器的时间是否同步: 2.检查下每台机器的防火墙是否关闭: 3.查看zkfc的日志路 ...

随机推荐

  1. ES6——箭头函数与普通函数的区别

    ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头: 语法: //1.没有形参的时候 let fun = () ...

  2. Linux C++轻量级开发指南

    作为一名产品开发,一套顺手的集成开发环境必不可少.大多数时候,开发经理将精力投入在产品需求分析上而忽视了研发质量甚至连基本的集成开发环境都没有统一.当然,如果你们的项目仅仅需要部署在单一的环境中或没有 ...

  3. ‎Cocos2d-x 学习笔记(19) Control Invocation

    [Cocos2d-x 学习笔记 目录链接] 1. 简介 control为其子类提供了touch回调函数,当子类触发EventType相关事件时,会调用相关的回调函数. control对象接收到的事件类 ...

  4. ‎Cocos2d-x 学习笔记(21.1) ScrollView “甩出”效果与 deaccelerateScrolling 方法

    1. 简介 “甩出”效果是当我们快速拖动container并松开后,container继续朝原方向运动,但是渐渐减速直到停止的效果. ScrollView的onTouchEnded方法会设置Timer ...

  5. mysql连接方法

    一.MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) mysql -h localhost -u root -p123或mysql -u ...

  6. 魏永明: MiniGUI的涅槃重生之路

    本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 魏永明 来源: 微信公众号linux阅码场(id: linuxdev) 本文背景 MiniGUI是最负盛名的 ...

  7. Apache Flink 入门示例demo

    在本文中,我们将从零开始,教您如何构建第一个Apache Flink (以下简称Flink)应用程序. 开发环境准备 Flink 可以运行在 Linux, Max OS X, 或者是 Windows ...

  8. Ubuntu18.04 安装谷歌BBR

    说明:Ubuntu 18.04前几天发布了,改变挺大的,内核也直接升到了正式版4.15,而BBR内核要求为4.9,也就是说满足了,所以我们不需要换内核就可以很快的开启BBR,这里简单说下方法. 提示: ...

  9. SQlserver高效分页,还在使用row_number(),top之类的?

    row_number() ,还是top 这些分页的方法比较老了,效率不是很高效的, Sqlserve2012就有了,效率对比比较明显,尤其是数据比较大的情况下(我们可以观看查询执行计划) Offset ...

  10. 数据结构(三十四)最短路径(Dijkstra、Floyd)

    一.最短路径的定义 在网图和非网图中,最短路径的含义是不同的.由于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径:而对于网图来说,最短路径是指两顶点之间经过的边上权值之 ...