大家好,小弟一直不明白对linux烧写uboot或uboot源码包打补丁的原因。在网上查了资料也没有详细的介绍。

UBOOT源代码下载,最全面的UBOOT源代码下载文章 - 电子工程世界网
UBOOT源代码下载
在电子工程世界为您找到如下关于“UBOOT源代码下载”的新闻
UBOOT源代码下载资料下载
三星官方S3C2440 SOC Linux下 UBOOT源代码下载。...
三星官方S3C2440 SOC Linux下 UBOOT源代码下载...
详细说明:三星 ARM 的Uboot下载上位机源代码
........\bulkusb.h
........\DEF.H
........\dnw.001
........\dnw.aps
........\dnw.cpp
........\dnw.cpp.bak
........\dnw.dsp...
UBOOT源代码下载相关帖子
硬件工程添加VGA的部分和在linux内核中添加音视频驱动,以及设备树的修改,这里只用下载编译即可使用。
作者:knat
实验环境:ubuntu 16.04(也可以在win10 linux子系统下操作)
实验步骤如下:
从GitHub上下载硬件工程和Linux的源代码.
1.硬件工程
& &&&git...
,都是在Windows下quarters和eds全搞定,出来sof、dtb头文件,preloader、uboot、可以编译裸的和Linux下的应用,试着在cygwin下编译内核没成功,希望有搞成的不吝赐教。
还剩下内核和驱动需要在Linux下。首先编译内核:.cn/thread--1.html
过程就是安装工具链和下载源代码,工具链包括...
在TI sdk 7.0.0.0.0 中UBOOT目录下make am335x_evm 生成的Uboot,不能保存Uboot环境变量,Beaglebone black SD卡启动输出如下
上电后进入uboot命令行,
1setenv xxxx,提示
T22:11:38.333 - Saving Environment to NAND...
数个月,有几个命令不那么常用,下次使用时记不起参数(我也不可能写个man page),通常都是查阅源代码,或者打印一张纸上写下命令调用方法。
工程采用readline库作为依赖,要实现上面的功能(自动补全、命令历史)都不是上面难事。
使用举例:
1. 控制台或网络方式传递命令:
cmd1 argv1 argv2 argv3
想必不用多解释,与uboot一样cmd1是查询命令的简称...
重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的。所以我试了一下笔记上的uboot命令,有些无法使用,可能是uboot版本问题或者文件系统问题。具体原因我目前还不是很清楚,建议第五部分uboot命令可以先不用尝试。一切以配套视频为准。一、为什么是uboot1.uboot从哪里来的?(1)uboot是SourceForge上的开源项目(2)uboot...
expat库& && && &Gdb编译的时候需要对XML的解析库expat,我们需要在边编译的时候加入这个库。& && && &首先下载expat的压缩包。& && && &解压之后cd到解压的文件中执行以下几条命令...
(S3C2410_GPH(6), S3C2410_GPH6_TXD2);  s3c2410_gpio_pullup(S3C2410_GPH(6), 1);  s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);  s3c2410_gpio_pullup(S3C2410_GPH(7), 1);  }  10.用git工具下载最新的yaffs2源代码。  具体为在...
一张光盘,如下图,光盘目录如下。 下面简单的做一下了解,在需要使用这些资料的时候,会针对性的做详细介绍。将文件以及文件夹按照“名称+递增”的方式排列,如下:Android 源码-- -----安卓系统源代码(包括底层内核和 uboot 源码)Datasheet --------开发板上芯片手册image --------编译好的可直接下载烧写到开发板上运行的映像linux ---------QT...
移植最新u-boot-2015.04-rc4.tar1,配置uboot& & & & 去官网下载最新uboot源代码u-boot-2015.04-rc4.tar,开发环境采用JZ2440光盘上的vmware虚拟机ubuntu9.10。本次采用smdk2410的默认配置来配置uboot,然后启动类似linux一样的menuconfig菜单进行配置,然后make...
今天在迅为电子的开发板群里找到了最新版4412开发板使用手册,觉得手册很详细,写得够认真,适合初级学习,文件太大附件传不了,通过网盘分享给大家,需要的可以下载来看看。 4412开发板使用手册分享地址:/s/1bnpowWZ
网盘手册内容来自 迅为电子: iTOP-4412开发板之全功能版使用手册_V1.7_底板...
UBOOT源代码下载视频
你可能感兴趣的标签
热门资源推荐自己学驱动(18)
●Board:和一些已有开发板相关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。
●Common:与体系结构无关的文件,实现各种命令的C文件。
●CPU:CPU相关文件,其中的子目录都是以u-boot所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c和start.S。其中cpu.c初始化cpu、设置指令cache和数据cache等;interrupt.c设置系统的各种终端和异常,比如快速中断,开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是u-boot启动时执行的第一个文件,他主要是设置系统堆栈和工作发式,为进入C程序奠定基础。
●Disk:Disk驱动的分区处理代码。
●Doc:UBOOT的开发和使用文档。
●Drivers:通用设备驱动程序,比如各种网卡、支持CFI的flash、串口和USB总线等。
●Dtt:数字温度测量器或者传感器的驱动。
●Examples:一些独立运行的应用程序的例子。
●Fs:支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2、yaffs和registerfs。
●Include:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。Include目录下有一个asm文件夹,同时有一个asm-arm文件夹,这两个文件夹里面的内容在我自己下载的u-boot-1.2.0版本下是一致的,是为了适配以前的一些版本做出的妥协。
●Net:与网络有关的代码,BOOTP协议、TFTP协议RARP协议和NFS文件系统的实现。
●Lib_ppc:存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数,与PowerPC体系结构相关的码。
●Lib_i386:存放对X86体系结构通用的文件,主要用于实现X86平台通用的函数,与PowerPc体系结构相关的代码。
●Lib_arm:存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数,与ARM体系结构相关的代码。
●Lib_generic:通用的多功能函数实现。
●Post:上电自检。
●Rtc:&实时时钟驱动。
●Tools:创建S-Record格式文件和U-BOOT&images的工具。
注:如果是需要使用sourceInsight来查看uboot的源码的话,Board、CPU、Include文件夹里面的内容需要根据实际的处理器或者平台板来选择,然而Lib库就只需要选择Lib_arm就可以了。其他的文件都是一些公用的文件都可以添加到工程当中去。
对于linux内核源码,使用S3C2440目标板,需要移除的目录如下:
●arch目录下除arm外的所有目录;
●arch/arm目录下以mach-开头的目录(mach-s3c2410、mach-s3c2440除外);
●arch/arm目录下以plat-开头的目录(plat-s3c24xx除外);
●include目录下以asm-开头的目录(asm-arm、asm-generic除外);
●include/asm-arm目录下以arch-开头的目录(arch-s3c2410除外)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:208291次
积分:4185
积分:4185
排名:第7304名
原创:215篇
转载:29篇
评论:43条
(1)(7)(2)(5)(5)(35)(24)(16)(14)(3)(3)(6)(12)(97)(14)博客访问: 305029
博文数量: 82
博客积分: 2535
博客等级: 少校
技术积分: 3119
注册时间:
京都医院/杭州京都医院
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
u-boot-1.3.4 移植到S3C2440 (带有某些解析)
一.预备知识:
首先,还没有支持,移植仍是用的文件稍作修改而成的。
和的区别:
和的区别主要是的主频更高,增加了摄像头接口和音频接口;寄存器方面,除了新增模块的寄存器外,移植所要注意的是控制器的寄存器有较大的变化、芯片的时钟频率控制寄存器(芯片的寄存器)有一定的变化。其他寄存器基本是兼容的。
你开发板的方式是什么,开发板上电以后是怎么执行的。
一般来说三星的开发板有三种启动方式:、、。
具体用那一种方式来启动决定于的这两个引脚,具体请参考的
:对于来说,是不给分配地址空间的,只相当于的一个外设,做了一个从启动的机制。开发板一上电,就自动复制
里面的前内容到内部集成的,然后把内容所在的映射到的地址,从地址开始执行。这的内容主要负责下面这些工作:初始化中断矢量、设定的工作模式为模式、屏蔽看门狗、屏蔽中断、初始化时钟、把整个重定向到外部、跳到主要的函数入口。
早期的时候利用启动的方式比较多,就是把烧写到里面,直接把映射到的地址,上电从地址开始执行。
直接把放到外部上跑,这一般时候用到。
程序的入口地址问题
要理解程序的入口地址,自然想到的是连接文件,首先看看开发板相对于某个开发板的连接文件你的开发板看一个的例子:
从可以看出的入口函数是这个没错
从也许可以看出的地址是事实并不是这样的,这里的没效,在连接的时候最终会被所代替的,具体请参考根目录下的
网上很多说法是,我想这种说法也是正确的,但没有说具体原因。
本人的理解是这样的,表示段的起始地址,而从
看,放在段的第一个文件就是编译后的内容,而中的第一个函数就是
,所以应该是放在段的起始位置,因此说也不为过。
一直不明白的是怎样从跳到中执行的,现在终于明白了。关键在于:
这两条语句,指令把这个标签的地方存放的内容也即是移到寄存器里面,是一个函数地址,在编译的时候给分配了一个绝对地址,所以上面语句实际上是完成了一个绝对地址的跳转。而我一直不明白的为什么在里面有很多跳转语句都没有跳出,原因是他们都是相对于的便宜的跳转,而不是绝对地址的跳转。还有要补充一下伪指令的区别。
把地址存放的内容放到里面
把立即数放到里面,必须是一个的数移到偶数次得到的数。
把立即数放到里面
在移植以上版本的时候要注意:
&&& 在u-boot1.3.3及以上版本Makefile有一定的变化,使得对于24x0处理器从nand启动的遇到问题。也就是网上有人说的:无法运行过lowlevel_init。其实这个问题是由于编译器将我们自己添加的用于nandboot的子函数nand_read_ll放到了4K之后造成的(到这不理解的话,请仔细看看24x0处理器nandboot原理)。我是在运行失败后,利用mini2440的4个LED调试发现u-boot根本没有完成自我拷贝,然后看了uboot根目录下的System.map文件就可知道原因。
解决办法其实很简单:
将__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
改为__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
然后说一下跳转指令。有两种跳转方式。
()mov p跳转地址〉
这种向程序计数器直接写跳转地址,能在连续空间内任意跳转。
()通过可以完成在当前指令向前或者向后的地址空间的跳转(为什么是呢?寄存器是位的,此时的值是位有符号数,所以)。
是最简单的跳转指令。要注意的是,跳转指令的实际值不是绝对地址,而是相对地址——是相对当前值的一个偏移量,它的值由汇编器计算得出。
非常常用。它在跳转之前会在寄存器中保存的当前内容。的经典用法如下:
&&&bl NEXT& ; 跳转到NEXT
&&&&&& ……
&&&&&& ……
&&&&&& mov pc, lr&& ; 从子程序返回。
二.开始上机移植:红色字体为添加的内容,蓝色字体为修改的内容,下同
给自己的开发板取名为。
随便找个目录解压,
进入目录修改你要编译那当然少不了配置啦
修改内容如下:
__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
sbc2410x_config: unconfig @$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0
qljt2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t qljt2440 qljt s3c24x0
各项的意思如下
这个名字是将来你配置板子时候用到的名字,参见命令。
的类型,其对应于子目录。
开发板的型号,对应于目录。
开发者或经销商。片上系统。
在子目录中建立自己的开发板目录
由于我在上一步板子的开发者或经销商中填了,所以开发板目录一定要建在子目录中的目录下,否则编译会出错。
可以看到下面这些文件:
在中建立开发板所需要的配置头文件
测试交叉编译能否成功
详细信息如下:
编译信息最后两行:
到此交叉编译成功。
三.开始针对自己的开发板移植
修改寄存器地址定义
该地址用来屏蔽看门狗
该地址用来屏蔽中断
该地址用来屏蔽子中断
该地址用来决定、、的比例
从中可以看出该寄存器是存放和的
参见表,同时要知道本开发板的是,需要的也就
同上,同时设定和的值,和参见
修改中断禁止部分
根据芯片手册,有位可用,
也是,不知为什么-一直没改过来。但是由于芯片复位默认
所有的终端都是被屏蔽的,所以这个不影响工作
根据芯片手册,有位可用
修改时钟设置
时钟控制逻辑单元能够产生需要的时钟信号,包括使用的主频总线使用的总线设备使用的,里面的两个锁相环,其中一个对应、、,另外一个对应
注意:、总线的简介参见“与总线”
这三条协处理器命令确实不知道什么意思,在中搜和,只知道它们执行以后会把协处理器的寄存器的最高两位置,但的最高两位是没有意义啊,弄不懂它的真正意思
不过我却知道这三条语句是从哪里出来的,详细请参考的和中的和
改变总线模式为异步模式网上某位朋友说不知到在哪里看到过
如果与不同的话就要选择这种模式的
(的主频可达,但听说设到时系统
很不稳定,不知是不是和总线配置的影响,所以现在先设到,以后在改进。)
实际上是设置寄存器的值
将从启动改成从启动。(特别注意:这和的程序有不同,不可混用!!!是拷贝的代码。)
将以下-的重定向语句段:
然后添加:
下载了一个源代码看了一下,还真的有下面哪一段代码
往下四段内容都是针对的关于的寄存器的设置,具体有什么作用,看了,有些明白有些不明白
这些宏是在中被定义的
还是弄不懂为什么上面一句以后还要有这句的命令??难道是多余的?
等待的复位完毕信号
在这里先先,在函数中对进行
操作的时候才,为什么这样操作不太清楚
下面这段用来初始化栈指针和帧指针至于它们的定义和作用参考文件夹栈指针和帧指针里面的内容
记住它们都是与函数调用时候相关的。简单来讲就是子函数被调用以后是通过指针的相对位置来查找调用参数和局部变量的,但是由于经常变化,所以需要来协助。
是指堆栈指针
里面应该是有一段是针对的程序,也许使用来用的信号灯,这里省略了
是自己的入口地址,在的中定义
有趣的是外国人的逆向思维很厉害,它们很灵活地把它放在的最后地方,也就是
把复制到的那个位置
从的那个位置开始复制
复制多大的内容
跳到执行复制的程序入口这个函数从哪里来?也是来自的,没办法
这里特别注意的值是指执行完以后的返回值,而不是上面
的值,初学者往往在这里想不通
如果读失败的话,那么,重来,或者检查硬件
计算机就是好,很容易就可以检测我们放在中的是不是中的。
本开发板使用的是的启动方式,板子一上电并不是马上进入执行程序的。是这样的:板子一上电,自动把中从地址开始的复制到集成的某个缓冲区里面起始地址是,从那里开始执行,那程序负责把整个复制到,然后才跳到开始正真的这个技术是有个专业名字的我忘记了
下面这段程序的作用就是用开始执行的程序跟我们复制到中的的前程序进行比较,从而校验
在跳到函数执行前,也就是跳出前,添加几个灯的控制,说明程序跑到这里了,移植的第一阶段完成了。
本开发板上面有四个灯,分别接到的这四个引脚上
在后加入:
这里我一直不明白为什么是因为如果按照的规则,意思是按照的次方的
方式对齐,那么就是半个字节对齐,有可能吗?
从这里可以看出该堆栈是从高地址向低地址增长的
注意这里的和还没定义,在节中定义
2. 修改include/configs/qljt2440.h文件,在结尾处添加如下内容(注意:s3c2410与s3c2440的Nand Flash控制器寄存器不同,不能混用!!):
&* Nandflash Boot
#define CONFIG_S3C2440_NAND_BOOT 1
#define STACK_BASE && 0x33f00000
#define STACK_SIZE && 0x8000
/* NAND Flash Controller */
#define NAND_CTL_BASE&&& &&& 0x4E000000
/* Offset */
#define oNFCONF&&& &&& &&& 0x00&&&&&& /*这些宏是在start.S中被调用的*/
#define oNFCONT&&& &&& &&& 0x04
#define oNFCMD&&& &&& &&& 0x08
#define oNFADDR&&& &&& &&& 0x0c
#define oNFDATA&&& &&& &&& 0x10
#define oNFSTAT&&& &&& &&& 0x20
#define oNFECC&&& &&& &&& 0x2c
/* GPIO */
#define GPIO_CTL_BASE&&& &&& 0x
#define oGPIO_F&&& &&& &&& 0x50
#define oGPIO_CON&&&&&& 0x0&& /* R/W, Configures the pins of the port */
#define oGPIO_DAT&&& &&& 0x4&&& /* R/W,&&& Data register for port */
#define oGPIO_UP&&& &&& 0x8&&& /* R/W, Pull-up disable register */
#endif&&& /* __CONFIG_H */
3.& 在board/qljt/qljt2440加入NAND Flash读函数文件,拷贝vivi中的nand_read.c文件到此文件夹即可,基本上大陆上移植的都是这样做的,在此把该文件的内容贴出来,目的是对一些难理解的代码进行解析:
下面的三个参数来自里面调用前的、、
下面这个保证对的读操作是从某一页的页头开始的,从直观来看是保证位都为,
为什么呢?因为本的一页的大小位,也就是从到
到此应该可以明白相关寄存器的确切含义了,就是说里面已经集成了对操
作的相关寄存器,只要你的接线符合的接法,就可以随便使用对于
的相关寄存器,例如如果你想像写一个命令,那么只要对命令寄存器写入你的命令就可以了,可以自动帮你完成所有的时序动作,写地址也是一样。反过来说如果没有了对的支持,那么我们对的操作就会增加好多对口的控制,例如对的控制。已经帮我们完成了这部分工作了
下面这个送地址的过程可以说是这段程序里最难懂的一部分了,难就难于为什么送进的地址忽略了,
纵观整个循环,并不是一个随机的地址,而应该是每一页的首地址。其实并不是忽略了这个
地址,而是早就被定下来了,什么时候定下来,就是上面的语句,本支持从
半页开始读取,从而它有两个读的命令,分别是从一页的上半页开始读和从一页的下半页开始读,
当取时,,当取时
每读一次就往口送下一个,直到送
4. 修改board/qljt/qljt2440/Makefile文件,让刚刚添加的nand_read.c编译进来
COBJS&:= qljt2440.o& nand_read.o flash.o
/*===========================================================
到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误
===========================================================*/
依照开发板的内存区的配置情况修改文件,
下面这个配置都可以参考的寄存器
这个值可以参考本版子上的的
也就是里面的本来这个地方是,但从里面的调用来看,应该是寄存器REFRESH
的才对,好多地方都没有改过来,我我觉得只是个名字而已,不影响结果
注意:如果这里改了,那么下面这句中的也要改为相应的:
,这个从里面的调用来看是属于的保留位,不知道为什
么还要给他赋值
这个值的算法参考的Refresh Counter
下面不厌其烦地解析一下这个原文件
要知道上面这些配置的最终会被用到下面这个数据池里面,所以必须要明白这个数据池是用
来干什么的,后面每一个后面防止的数据都是将要写入开始的寄存器的,总共有个它们后面放置的值将会分别别写入、、一直到共个寄存器。
上面那些配置的值是怎样决定的呢,详细请参考和你所用的。细心找总是能找到的。
而上面的那些配置值最终是通过下面后面的这段函数写到寄存器里面的,下面对该段函数逐一分析:
其实明白了前三条语句这段程序就不难懂了,归根到底就是为什么将的值减
去的值?原因是这样的:我们使用的是从的方式,目前程序
仍然在 ‘Steppingstone’(这里为什么突然冒出个Steppingstone’,这个就是我前面提到从nand flash 引导的方法,但不知道名字,后来重新看的那一章的开头才知道)上面运行,在后面的的内容仍然在Steppingstone里面。但是的值是相对于值的地址,而且是放置的开始地方,所以用就可以得到后面内容在Steppingstone里面相对于地址的放置的所在地方相对于的地址值。
从这三条语句可以看出前人为了实现从启动可谓费尽心思啊!
总共个寄存器
数据缓冲池,上网可以查得资料
需要注意的是CAS Latency的值在这里直接配置
/*===========================================================
到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误
===========================================================*/
6 修改/board/qljt/qljt2440/qljt2440.c,修改这个文件主要针对下面两点:
(1) GPIO的控制
(2) PLL,毕竟s3c2410跟s3c2440不同
修改其对GPIO和PLL的配置(请参阅SBC2440的硬件说明和2440芯片手册): ......
#elif FCLK_SPEED==1 /* Fout = 405MHz */
//#define M_MDIV 0x5c
//#define M_PDIV 0x4
//#define M_SDIV 0x0
#define M_MDIV 0x7f
#define M_PDIV 0x2
#define M_SDIV 0x1
#elif USB_CLOCK==1
//#define U_M_MDIV 0x48
//#define U_M_PDIV 0x3
#define U_M_MDIV 0x38
#define U_M_PDIV 0x2
#define U_M_SDIV 0x2
/* set up the I/O ports */
gpio-&GPACON = 0x007FFFFF;
// gpio-&GPFCON = 0x000055AA;
gpio-&GPFCON = 0x5500; /*for LED*/
/* arch number of S3C2440 -Board */
gd-&bd-&bi_arch_number = MACH_TYPE_S3C2440 ;
/* adress of boot parameters */
gd-&bd-&bi_boot_params = 0x;
icache_enable();
dcache_enable();
gpio-&GPFDAT = 0 /*for LED*/
//int board_init (void)设置完成后,LED1和LED2会亮起!
/*===========================================================
到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误
===========================================================*/
7. 为了实现NAND Flash的读写,再次修改/include/configs/qljt2440.h
&* High Level Configuration Options
&* (easy to change)
#define CONFIG_ARM920T&&& &&& 1&&& /* This is an ARM920T Core&&& */
//#define&&& CONFIG_S3C2410&&&&&& 1&& /* in a SAMSUNG S3C2410 SoC&&&& */
//#define CONFIG_SBC2410X&&&&&&& 1&& /* on a friendly-arm SBC-2410X Board& */
#define&&& CONFIG_S3C2440&&& &&& 1&&/* 在前面很多地方调用到CONFIG_S3C2440&,他是在这里定义& */
#define CONFIG_qljt2440&&& 1& /* 针对一些本开发板配置的宏控制*/
/***********************************************************
&* Command definition
&***********************************************************/
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_ELF
#define CONFIG_CMD_PING&&&&
#define CONFIG_CMD_NAND&&&&&&&&&&
#define CONFIG_CMD_NET
#define CONFIG_CMD_ENV
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
#include &cmd_confdefs.h&
#define&&& CFG_LONGHELP&&& &&& &&& &&&
/* undef to save memory&&& &&& */
#define&&& CFG_PROMPT&& "[qljt2440]#" /*这个就是你启动开发板后命令行显示的内容了*/
/*Monitor Command Prompt& */
#define&&& CFG_CBSIZE&&& &&& 256&&& &&&
/* Console I/O Buffer Size&&& */
#define&&& CFG_LOAD_ADDR&&& & 0x&& /*以后linux kernel就要放在这里执行 */
&/* default load address&&& */
//#define CFG_ENV_IS_IN_FLASH&&&&&& 1 /这里的flash应该是指nor了,都不知道外国人为什么这么默认/
#define&&& CFG_ENV_IS_IN_NAND && 1 /*定义这个宏的目的是为了调用nand flash类型的saveenv
因为还有其它类型存储器的saveenv,在u-boot中查看saveenv
的定义,有多少中定义就有多少种*/
/*在linux对nand flash分区的时候,给u-boot分配256k的空间(0~0x40000)
其中 u-boot.bin&&& [0x0~0x30000]& 占192K
而&& u-boot的参数 [0x00] 占64k
#define CFG_ENV_OFFSET& 0x30000&&&&&&&&&
#define CFG_ENV_SIZE&&&&&&&& 0x10000
/*注意:网上很多地方都有关于CONFIG_CMD_NAND 、CFG_NAND_LEGACY、drivers/mtd/nand/nand.c中的nand_init()函数以及board/qljt/qljt2440/qljt2440.c中的nand_init()函数这四个东西的关系,但大多说的不清不楚,我把它门的关系用表格一一列出来,请参考附录。*/
#define CFG_NAND_LEGACY&&& &&&&&&&&&&&&& 1
/*----------------------------------------------------------------------
&* NAND flash settings
#if defined (CONFIG_CMD_NAND)
#define CFG_NAND_BASE 0x4E000000 &&& /*这个鬼东西在drivers/mtd/nand/nand.c中被调用,它
是NAND控制寄存器的基地址*/
/* NandFlash控制器在SFR区起始寄存器地址 */
#define CFG_MAX_NAND_DEVICE 1
&/* 支持的最在Nand Flash数据 */
#define SECTORSIZE 512
/* 1页的大小 */
#define NAND_SECTOR_SIZE SECTORSIZE /*这两个东西好像也是多余的,备用吧,在次文章搜一下
就知道其它用到的地方也有定义*/
#define NAND_BLOCK_MASK 511&&&&&&&& /*本flash一个block的大小-1*/
/* 页掩码 */
#define ADDR_COLUMN 1 /*意思是你所用的nandflash的Column地址占多少个字节*/
/* 一个字节的Column地址 */
/*意思是你所用的nandflash的(row)page地址占多少个字节*/
字节的页块地址
/*意思是你所用的nandflash的column地址+page地址共占多少个字节*/
总共字节的页块地址
未知芯片的号
命令层底层接口函数
下面部分内容是修改的
命令层底层接口函数
允许写校验 打开下面宏定义
8. 在/board/qljt/qljt2440/qljt2440.c文件的末尾添加对Nand Flash 的初始化函数(在后面Nand Flash的操作都要用到)
#if defined(CONFIG_CMD_NAND) /*大概在145行*/
typedef enum {
&&&&NFCE_LOW,
&&&&NFCE_HIGH
} NFCE_STATE;
static inline void NF_Conf(u16 conf)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&nand-&NFCONF =
static inline void NF_Cmd(u8 cmd)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&nand-&NFCMD =
static inline void NF_CmdW(u8 cmd)
&&&&NF_Cmd(cmd);
&&&&udelay(1);
static inline void NF_Addr(u8 addr)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&nand-&NFADDR =
static inline void NF_WaitRB(void)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&while (!(nand-&NFSTAT & (1&&0)));
static inline void NF_Write(u8 data)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&nand-&NFDATA =
static inline u8 NF_Read(void)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&return(nand-&NFDATA);
static inline u32 NF_Read_ECC(void)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&return(nand-&NFECC);
#if defined(CONFIG_S3C2440)
static inline void NF_Cont(u16 cont)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&nand-&NFCONT =
static inline void NF_SetCE(NFCE_STATE s)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&switch (s) {
&&&&case NFCE_LOW:
&&&&&&&&nand-&NFCONT &= ~(1&&1);
&&&&case NFCE_HIGH:
&&&&&&&&nand-&NFCONT |= (1&&1);
static inline void NF_Init_ECC(void)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&nand-&NFCONT |= (1&&4);
static inline void NF_SetCE(NFCE_STATE s)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&switch (s) {
&&&&case NFCE_LOW:
&&&&&&&&nand-&NFCONF &= ~(1&&11);
&&&&case NFCE_HIGH:
&&&&&&&&nand-&NFCONF |= (1&&11);
static inline void NF_Init_ECC(void)
&&&&S3C2410_NAND * const nand = S3C2410_GetBase_NAND();
&&&&nand-&NFCONF |= (1&&12);
#endif /*对应#if defined(CONFIG_S3C2440)*/
static inline void NF_Init(void)
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
#define TACLS 0
#define TWRPH0 4
#define TWRPH1 2
#if defined(CONFIG_S3C2440)
&&&&NF_Conf((TACLS&&12)|(TWRPH0&&8)|(TWRPH1&&4));
&&& NF_Cont((0&&13)|(0&&12)|(0&&10)|(0&&9)|(0&&8)|(0&&6)|(0&&5)|(1&&4)|(0&&1)|(1&&0));
&&&&NF_Conf((1&&15)|(0&&14)|(0&&13)|(1&&12)|(1&&11)|(TACLS&&8)|(TWRPH0&&4)|(TWRPH1&&0));
&&&&/*nand-&NFCONF = (1&&15)|(1&&14)|(1&&13)|(1&&12)|(1&&11)|(TACLS&&8)|(TWRPH0&&4)|(TWRPH1&&0); */
&&&&/* 1 1 1 1, 1 xxx, r xxx, r xxx */
&&&&/* En 512B 4step ECCR nFCE=H tACLS tWRPH0 tWRPH1 */
&&&&NF_Reset();
9. cpu\arm920t\s3c24x0\ Nand.c ,很多人说u-boot-1.3.4已经不支持CFG_NAND_LEGACY了,但其实还是支持的,定义了CFG_NAND_LEGACY后Nand.c要做如下修改:
#error "U-Boot legacy NAND support not available for S3C2410"
// #error "U-Boot legacy NAND support not available for S3C2410"
/*===========================================================
到这里,编译是不能通过的,原因上一节中CONFIG_S3C2410这个宏定义被注释掉,下面要用CONFIG_S3C2440这个宏打开CONFIG_S3C2410所打开的内容===========================================================*/
10.& 在S3C2440与s3c2410能够共用的文件中添加“CONFIG_S3C2440”,使得原来s3c2410的代码可以编译进来。
(1)/include/common.h文件的第492行:/*一些公用的常用函数,例如get_fclk()*/
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X) || defined(CONFIG_S3C2440)
(2)/include/s3c24x0.h:文件的第85、95、99、110、148、404行:/*一些关于S3C2440寄存器的结构体*/
#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(3)/cpu/arm920t/s3c24x0/interrupts.c文件的第33行:/*主要把一些头文件包含进去*/
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(4)/cpu/arm920t/s3c24x0/serial.c文件的第22行:/*主要把一些头文件包含进去*/
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(5)/cpu/arm920t/s3c24x0/speed.c文件的第33行:
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
顺便修改源代码,以匹配s3c2440:
static ulong get_PLLCLK(int pllreg)
//qljt &/*这两个PLL的算法参见S3C2440datasheet的254页*/
/* CONFIG_SYS_CLK_FREQ 在qljt2440.h中定义*/
&&& else if (pllreg == UPLL)
return((CONFIG_SYS_CLK_FREQ * m) / (p && s));
/* return FCLK frequency */
ulong get_FCLK(void)
&&& return(get_PLLCLK(MPLL));
/* return HCLK frequency */
ulong get_HCLK(void)
&&& S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
&/*看看s3c2410与s3c2440的datasheet就知道s3c2440的HCLK可选择的值多很多*/
& if (clk_power-&CLKDIVN & 0x6)&&&
& {/*这里注意:编译的时候发现CLKDIVN ,这个将会在12节解决*/
&&&&&& if ((clk_power-&CLKDIVN & 0x6)==2)&&&&&&& return(get_FCLK()/2);
if ((clk_power-&CLKDIVN & 0x6)==6)&&&&&&& return((clk_power-&CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);&&&&&&&& /*注意这里的CAMDIVN还没有被定义,在/include/s3c24x0.h中定义 */
&&&&& if ((clk_power-&CLKDIVN & 0x6)==4)&&&&&&& return((clk_power-&CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);&&&&&&&&
&&&&&&& return(get_FCLK());
&&&&&&& return(get_FCLK());
(6)/cpu/arm920t/s3c24x0/usb_ohci.c文件的第45行:
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
(7)drivers/rtc/s3c24x0_rtc.c文件的第35行:
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)&
(8)在文件中添加“defined(CONFIG_qljt2440)”,使得原来SBC2410X开发板的代码可以编译进来,
/cpu/arm920t/s3c24x0/interrupts.c文件的第181行:&
&&&#elif defined(CONFIG_SBC2410X) || \
&&&&& defined(CONFIG_SMDK2410) || \
&&&&& defined(CONFIG_VCMA9) || defined(CONFIG_qljt2440)
&&& tbclk = CFG_HZ;&& /*对于CFG_HZ 的值,结合uboot的说明和s3c2440的datasheet就比较容易理解*/
(9)/cpu/arm920t/s3c24x0/usb.c文件的第31行:
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(10)/cpu/arm920t/s3c24x0/i2c.c文件的第35行:
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
第66、85、142、150、174行:
将“#ifdef CONFIG_S3C2410”改为
#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(11)drivers/usb/usb_ohci.c文件的第68行附近:
#if defined(CONFIG_ARM920T) || \
&&&&defined(CONFIG_S3C2400) || \
&&&&defined(CONFIG_S3C2410) || \
&&&&defined(CONFIG_S3C2440) || \
&&&&defined(CONFIG_440EP) || \
&&&&defined(CONFIG_PCI_OHCI) || \
&&&&defined(CONFIG_MPC5200)
在/include/s3c24x0.h中加入2440&的NAND FLASH 寄存器定义和CAMDIVN定义:
typedef struct {
&&&&&&&& S3C24X0_REG32&& LOCKTIME;
&&&&&&&& S3C24X0_REG32&& MPLLCON;
&&&&&&&& S3C24X0_REG32&& UPLLCON;
&&&&&&&& S3C24X0_REG32&& CLKCON;
&&&&&&&& S3C24X0_REG32&& CLKSLOW;
&&&&&&&& S3C24X0_REG32&& CLKDIVN;
&&&&&&&& S3C24X0_REG32&& CAMDIVN;
} S3C24X0_CLOCK_POWER;
#if defined(CONFIG_S3C2410)& //2440&的NAND FLASH 寄存器
typedef struct {
&&&&&&&& S3C24X0_REG32&& NFCONF;
&&&&&&&& S3C24X0_REG32&& NFCMD;
&&&&&&&& S3C24X0_REG32&& NFADDR;
&&&&&&&& S3C24X0_REG32&& NFDATA;
&&&&&&&& S3C24X0_REG32&& NFSTAT;
&&&&&&&& S3C24X0_REG32&& NFECC;
} S3C2410_NAND;
#if defined (CONFIG_S3C2440)
typedef struct {
&&&&&&&& S3C24X0_REG32&& NFCONF;
&&&&&&&& S3C24X0_REG32&& NFCONT;
&&&&&&&& S3C24X0_REG32&& NFCMD;
&&&&&&&& S3C24X0_REG32&& NFADDR;
&&&&&&&& S3C24X0_REG32&& NFDATA;
&&&&&&&& S3C24X0_REG32&& NFMECC0;
&&&&&&&& S3C24X0_REG32&& NFMECC1;
&&&&&&&& S3C24X0_REG32&& NFSECC;
&&&&&&&& S3C24X0_REG32&& NFSTAT;
&&&&&&&& S3C24X0_REG32&& NFESTAT0;
&&&&&&&& S3C24X0_REG32&& NFESTAT1;
&&&&&&&& S3C24X0_REG32&& NFECC;
} S3C2410_NAND;
12. 修改/lib_arm中的board.c。
#include &common.h&
#include &command.h&
#include &malloc.h&
#include &devices.h&
#include &version.h&
#include &net.h&
#include &s3c2410.h&&
13. 修改common/env_nand.c
#ifdef CONFIG_INFERNO
#error CONFIG_INFERNO not supported yet
int nand_legacy_rw (struct nand_chip* nand, int cmd,
&&&&&&&&size_t start, size_t len,
&&&&&&&&size_t * retlen, u_char * buf);
extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
extern int nand_legacy_erase(struct nand_chip *nand, size_t ofs, size_t len, int clean);
/* info for NAND chips, defined in drivers/nand/nand.c */
nand_info_t nand_info[CFG_MAX_NAND_DEVICE];
#else /* ! CFG_ENV_OFFSET_REDUND */
int saveenv(void)
&& &int ret = 0;
&& &nand_erase_options_t nand_erase_
&& &nand_erase_options.length = CFG_ENV_RANGE;
&& &nand_erase_options.quiet = 0;
&& &nand_erase_options.jffs2 = 0;
&& &nand_erase_options.scrub = 0;
&& &nand_erase_options.offset = CFG_ENV_OFFSET;
&& &if (CFG_ENV_RANGE & CFG_ENV_SIZE)
&& &&&& return 1;
&& &puts ("Erasing Nand...\n");
/*在248行附近*/
//&& &if (nand_erase_opts(&nand_info[0], &nand_erase_options))
&&if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0))&&&&&&&&&&&
&&& return 1;
&& &puts ("Writing to Nand... ");
&& &total = CFG_ENV_SIZE;
/*在254行附近*/
//&& &if (writeenv(CFG_ENV_OFFSET, (u_char *) env_ptr)) {
//&& &&& &puts("FAILED!\n");
//&& &&& &return 1;
ret = nand_legacy_rw(nand_dev_desc + 0,0x00 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE,&total, (u_char*)env_ptr);
&if (ret || total != CFG_ENV_SIZE)
&&&&&&& return 1;
&& &puts ("done\n");
#else /* ! CFG_ENV_OFFSET_REDUND */
&* The legacy NAND code saved the environment in the first NAND device i.e.,
&* nand_dev_desc + 0. This is also the behaviour using the new NAND code.
void env_relocate_spec (void)
#if !defined(ENV_IS_EMBEDDED)
&& &total = CFG_ENV_SIZE;
/*在360行附近*/
//&& &ret = readenv(CFG_ENV_OFFSET, (u_char *) env_ptr);
&& & ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET,CFG_ENV_SIZE, &total, (u_char*)env_ptr);/*edited by yaoyi .3.4是先进入到readenv,而非直接调用nand_legacy_rw。 因此干脆就不用到readenv了,直接注释掉,添加以上代码 */
&& &if (ret || total != CFG_ENV_SIZE)
&& &&&& return use_default();
&& &if (crc32(0, env_ptr-&data, ENV_SIZE) != env_ptr-&crc)
&& &&&& return use_default();
#endif /* ! ENV_IS_EMBEDDED */
u-boot运行至第二阶段进入start_armboot()函数。其中nand_init()函数是对nand flash的最初初始化函数。Nand_init()函数在两个文件中实现。其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用 drivers/nand/nand.c中的nand_init();否则调用自己在board/qljt/qljt2440/qljt2440.c中的nand_init()函数。这里我选择第二种方式。*/
14. 修改include/nand.h
//#ifndef CFG_NAND_LEGACY
#include &linux/mtd/compat.h&
#include &linux/mtd/mtd.h&
#include &linux/mtd/nand.h&
//#endif /* !CFG_NAND_LEGACY */
/*===========================================================
到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误
===========================================================*/
9、在 include/linux/mtd/nand_ids.h的结构体nand_flash_ids加入 /*至于这个结构体的值怎么得来,有待研究*/
static struct nand_flash_dev nand_flash_ids[] = {
....../*结构体nand_flash_dev 在doc2000.h中定义*/
/*厂家 型号,生产商编号,本模块的编号,总共容纳地址的位数,存储页字节数是否为256 ,地址需要多少字节数减一(行列地址总共) ,擦除1个block的大小,是否为16位总线*/
{"Samsung K9F1208U0B",& NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0},
&&& {"Samsung unknown 4Mb", NAND_MFR_SAMSUNG, 0x6b, 22, 0, 2, 0x2000, 0},
下面说说上面结构体的个参数是怎么得出来的,以便日后再次移植的时候会更换
“厂家型号”:这个从的就可以直接找到了吧。
生产商的编号:也就是里面的,它也同时被存放在里面的应该有一个读命令的信息里面)。
本模块的编号:也就是里面的,跟一样它也被放到信息里面。
总共容纳的地址位数:也就是有效的地址位数。针对于本可以参考它的第页。
一页所存储的字节数是否为个:针对于本可以参考它的第页。
地址需要多少字节数减一行列地址总共:举个例子可能更容易明白,第点中可以知道本有位,而对本地址的写入每次只能写位,所以至少要写次才能把位地址写入本,次的写入针对于编程来说就是,所以本相对于该结构体的该变量的值是
擦除个的大小:简单来说就是个的大小,本,所以,也就是。
是否为位总线:本地址和数据总线共用,都是位的,所以上面值为
15. 修改/lib_arm中的board.c。添加几个debug信息& (这一步可以不用修改)
#include &common.h&
#include &command.h&
#include &malloc.h&
#include &devices.h&
#include &version.h&
#include &net.h&
static int display_banner (void)
gpio-&GPFDAT = 0x8f;
//consoleLED1LED2LED3
printf ("\n\n%s\n\n", version_string);
debug ("U-Boot code: %08lX -& %08lX BSS: -& %08lX\n",
_armboot_start, _bss_start, _bss_end);
printf ("U-Boot code: %08lX -& %08lX BSS: -& %08lX\n", //qljt
_armboot_start, _bss_start, _bss_end);
#ifdef CONFIG_MODEM_SUPPORT
debug ("Modem Support enabled\n");
#ifdef CONFIG_USE_IRQ
debug ("IRQ Stack: %08lx\n", IRQ_STACK_START);
debug ("FIQ Stack: %08lx\n", FIQ_STACK_START);
&&&&&&&& gpio-&GPFDAT = 0x7f;& //qljtninja
/*===========================================================
到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误
===========================================================*/
16. 裁减flash的支持 (这一步也可以不执行)
(1)在board/qljt/qljt2440/flash.c的头部加上:#if 0,尾部加上:#endif
(2)在include/configs/qq2440.h加上:
#undef CONFIG_CMD_FLASH
#undef CONFIG_CMD_IMLS
#define CFG_NO_FLASH& 1
(3)在common/cmd_bootm.c的”#include”语句后加上
#ifdef CONFIG_CMD_IMLS
#undef CONFIG_CMD_IMLS
U-boot的命令默认配置存放在/include/config_cmd_default.h里,可以修改该文件或者在qq2440.h里添加#undef里裁减不需要的内容
在前不含函数的调用关系,它的调用是被“
”和“”控制的,:表示该值为真,:表示该值为假
www.teng-xin.net
在后含函数的调用关系,它的调用是被“”和“”控制的,:表示该值为真,:表示该值为假
阅读(89765) | 评论(3) | 转发(76) |
相关热门文章
给主人留下些什么吧!~~
需要有耐心去学习。
请登录后评论。

我要回帖

更多关于 linux 编译 uboot 的文章

 

随机推荐