FL2440中U-boot框架完整分析

经过一周的努力,终于把U-boot的框架弄清楚了,终于把这几个地址搞清楚了,学习这些我花了很多时间,如果有人跟你讲解的话,你几分钟就能理解过来,自己摸索有点伤不起呀。一下是自己的总结,相信你把这篇文章看了,你会对U-boot的烧写和启动内核,最终的是一些地址空间的了解有深刻的印象,在这里我贴出来是希望大家少走弯路,希望大家懂得珍惜,尊重原创。在现在我U-boot具体的命令分析还没有弄懂,等我弄熟练了在贴以后的代码,如果自己都没有熟练,相信写出来的代码你们写不敢看,有点误人子弟,呵呵!

几个地址的讲解如下:
33F80000:U-boot在SDRAM中的运行地址,是我们在第一阶段把程序从nand flash或者nor flash中复制到sdram中的地址,在链接脚本里面也设置好了的。
30008000:kernel在SDRAM中的运行地址,这个地址讲解有点复杂,这的篇文章讲解的很清楚:http://blog.csdn.net/qq_21792169/article/details/50098749


30800000:用于存储ramdisk(相当于一个临时的硬盘),用来挂着根文件系统的。

CPU:三星S3C2440 主频:400MHZ

NAND Flash : 128M/256 M 字节  K9F2G08R0A 
内存:SDRAM 
start Address:0x30000000  
end Address  : 0x34000000 
size:0x4000000 =64M

从NAND FLASH 启动:SRAM起始地址是0,size=4KB  0x1000
在NAND FLASH 启动模式下内部的 4K Bytes BootSRam 被映射到 nGCS0 片选 的空间 。sdram被映射到 nGCS6 

下面是内核中的分区:

FL2440中U-boot框架完整分析_第1张图片

下面这个是U-boot中的分区情况:

在这里我得说明下,u-boot中的分区只是为了方便我们写代码到nand flash中,并没有什么实质的意义,在这里我举例说明下:

nand write 0 0x00020000    我们可以用nand write boot代替,就是这个意思很简单,在u-boot中有个mtdparts命令就是方便你写代码到flash中区,只是我们用了一个boot来代替那段地址。


我们烧写U-boot的方法:

首先下载程序到到初始化SDRAM的代码到内部的 4K Bytes BootSRam ,NAND FLASH是不能直接烧写的,Nor flash是可以直接烧写的,初始化完成后,把程序烧在SDRAM中地址是0x30000000到0x34000000 去,然后再烧写一个临时运行的U-boot.bin文件到0x33F80000(以后重新上电后U-boot程序还是会被复制在这个地址开始运行),这个U-boot.bin文件特殊一点,需要去掉需要在include/configs/开发板配置文件.h(fl2440.h)文件中添加:#define  CONFIG_SKIP_LOWLEVEL_INIT     1 //用来支持uboot在内存中
直接运行然后再利用U-boot自身的写命令把U-boot写到NAND FLASH,然后断电重启就启动了U-boot,记住启动U-boot还是把NAND FLASH中的程序复制到SDRAM中去运行的。
开发板中那个0x30800000是SDRAM中的地址,用于下载文件,临时放在SDRAM,还有通过命令或者U-boot本身功能把这个程序写到NAND FLASH相应的地址上去。

用ADS烧写U-boot
烧写的是.axf映像文件,利用映像文件来烧写真正U-boot到SDRAM,然后SDRAM借助DNW自动把程序写到NANDFLASH
 
U-boot补丁文件的制作
cd U-boot1.1.6
patch -p1 < ../补丁文件的路径  1代表去掉补丁文件里面路径的第一个"/"
 
 
 编译裸机程序(包括U-boot)
 可以用ADS和Linux两种方法编译,用ADS编译好用U-boot.bin然后用AXD下载带SDRAM
 或者用Linux,就得写链接脚本和Makefile
 
.axf是elf格式的文件它是有格式的,有文件头,里面还有section的信息等,不能直接烧入
需要烧入bin文件或者hex文件等,这些文件是从axf转化而来的


U-boot烧写步骤如下:

第一先烧写SDRAM初始化函数,
第二烧写特殊的u-boot_SDRAM.bin;
第三烧写u-boot.bin
u-boot_SDRAM.bin是特殊u-boot文件需要修改如下一个地方:
需要在include/configs/开发板配置文件.h(fl2440.h)文件中添加:
#define  CONFIG_SKIP_LOWLEVEL_INIT     1 //用来支持uboot在内存中直接运行


需要先安装J-Link驱动,下载Setup_JLinkARM_V408l.exe,并安装。
打开J-Link Commander
speed 12000
loadbin d:\2440init.bin  0       //就是光盘上的初始化内存函数
setpc 0
g


h  
loadbin d:\FL_2440bootV5.bin 0x30000000     //用来临时存放数据
//setpc 0x30000000      //是不能运行的,运行后会出错,相当于初始化两次SDRAM,数据将丢失
//g                     //在这里只是把这个需要烧写的程序放在这个地址空间。
                        //后面这个u-boot.bin(再次强调是个特殊u-boot) 你可以当作一个台阶,用着与烧写真正的u-boot.bin 
 
loadbin d:\u-boot.bin 0x33f80000 //0x33f80000 是把U-boot放在SDRAM内存最上面的512k的空间
setpc 0x33f80000  //u-boot-2010.09\board\fl2440\config.mk文件里面放在把U-boot放在内存的那个地址空间
g                //TEXT_BASE = 0x33F80000

 这时你应该可以在串口看到U-boot的输出信息了,然后我们在U-boot命令行模式输入NAND Flash擦除和写入命令即可:
 我们下载程序是下载到NAND FLASH
 nand erase 0 40000  //

 nand write 30000000 0 40000  //把前面下载到0x3000000的u-boot.bin下载NAND


下面的不用看,是我自己随便记得一些东西。。。。。。。。。。

 FL2440的U-boot移植如下:ln  链接命令

echo "ARCH   = ${arch}"  >  config.mk   //> 创建config.mk 把内容附加到config.mk
echo "CPU    = ${cpu}"   >> config.mk   //>>把内容附加到config.mk
echo "BOARD  = ${board}" >> config.mk   //>>把内容附加到config.mk


#define  CONFIG_SKIP_LOWLEVEL_INIT     1 //用来支持uboot在内存中直接运行  忽略SDRAM的初始化

U-boot根目录下面有一个u-boot.lds链接脚本很重要用的到
框架分析:
stage1:初始化一系列硬件,
_start_armboot: .word start_armboot
    ->for (;;) {main_loop ();}
->getenv("mdm_cmd"
->for (;;) {len = readline (CONFIG_SYS_PROMPT);
rc = run_command (lastcommand, flag);}
->parse_line (finaltoken, argv)) == 0
cmd_tbl_t *cmdtp;
struct cmd_tbl_s {
char *name;/* Command Name*/
int maxargs;/* maximum number of arguments*/
int repeatable;/* autorepeat allowed?*/
/* Implementation function*/
int (*cmd)(struct cmd_tbl_s *, int, int, char * const []);
char *usage;/* Usage message(short)*/
#ifdef CONFIG_SYS_LONGHELP
char *help;/* Help  message(long)*/
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
#endif
};


       cmdtp = find_cmd(argv[0])) == NULL

你可能感兴趣的:(FL2440中U-boot框架完整分析)