嵌入还开发U-boot框架完整分析

               

经过一周的努力,终于把U-boot的框架弄清楚了,终于把这几个地址搞清楚了,学习这些我花了很多时间,如果有人跟你讲解的话,你几分钟就能理解过来,自己摸索有点伤不起呀。一下是自己的总结,相信你把这篇文章看了,你会对U-boot的烧写和启动内核,最终的是一些地址空间的了解有深刻的印象,在这里我贴出来是希望大家少走弯路。


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 

下面是内核中的分区:


下面这个是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



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


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值