嵌入还开发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转化而来的
第一先烧写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.****.net/jiangjunshow