//主题:210开发板上UBOOT-2011.06启动过程解析
//作者:kevinjz2010@gmail.com
//平台:S5PV210 ARMV7 TINY210
//-------------------------------------------------------------------------------------------------
本文使用的UBOOT版本:u-boot for tiny210 ver3.1
源码地址:http://blog.csdn.net/liukun321/article/details/7438880#comments
一、配置与使用
1、在系统根目录下的Makefile中的第601行,通过下列语句:
sinclude$(obj).boards.depend
$(obj).boards.depend: boards.cfg
awk'(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config;$$(MAKE)" }' $< > $@
读取了boards.cfgboards.cfg中关于tiny210_onfig的配置项,其中.boards.depend是隐藏文件;
2、在Makefile的106行添加:
+ ifeq($(ARCH), arm)
+ CROSS_COMPILE= arm-none-linux-gnueabi-
+ endif
这样配置好了默认的编译器;
3、在根目录下执行:
$make tiny210_config
$make -j
即可在根目录得到tiny210-uboot.bin,可用于SD卡启动和NAND启动;
4、烧入SD卡的时候使用下面命令:
$sudodd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1
dd命令用于对SD进行烧写,根据三星手册《S5PV210_iROM_ApplicationNote_Preliminary_20091126》,将tiny210-uboot.bin烧写到,SD卡的第一个Block,保留第0个block不用,每个block=512B。
5、从SD卡启动后可以就可以将UBOOT烧写到nand里了:
$tftp 21000000 tiny210-uboot.bin
$nand erase 0 40000
$nand write 21000000 0 40000
二、启动流程分析
按照三星《S5PV210_UM_REV1.1》手册上说明的启动流程,S5PV210上电将从IROM处执行固化的启动代码,对时钟等初始化、对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(0xd002_0000处,其中0xd002_0010之前的16个字节储存的BL1的校验信息和BL1尺寸)中,并对BL1进行校验,校验OK转入BL1进行执行;BL1继续初始化,并将BL2复制到IRAM中并对其校验,OK后转入BL2;BL2则要进行比较复杂的初始化,包括DRAM的初始化,完成后将OS代码复制到DRAM中,并转入到OS中执行并完成启动引导。
但是,上述的IRAM只有96K大小,对于日益复杂的uboot来说,肯定是不够的,所以使用UBOOT启动引导的时候,也没全按三星手册上说的执行,具体如下:
首先解释一下我认为的BL0、BL1、BL2:
BL0:是指S5PV210的IROM中固化的启动代码;
BL1:是指在IRAM中执行的UBOOT的部分代码;
BL2:是指在内存中执行的的UBOOT的完整代码;
此版本的UBOOT,其实会编译两个UBOOT.bin,即最终生成的tiny210-uboot.bin包括两部分,前段是spl(重用u-boot中既有的驱动,来生成更小的secondaryprogramloader)文件夹内的tiny210-spl.bin,后段是用于在RAM中执行的完整UBOOT代码。所以学习UBOOT代码是也要两个部分来看。
1、第一步与三星手册上一致,执行IROM内固化的代码,即BL0,BL0会将存储于启动设备的UBOOT代码的前16KB:tiny210-spl.bin复制到IRAM。(tiny210-spl.bin设置为24KB了,但实际绝不会超过16KB,后面全填充的0,所以拷不完也OK。这里是liukun321为了统一MMC与NAND启动而作的修改,也许改成16K就应该OK了,应为IROM里的代码最多拷贝16K进IRAM嘛,一会改改试试。所以呢实际上执行BL1就是执行tiny210-spl.bin。在UBOOT的代码中并不会看到tiny210-spl.bin和完整的UBOOT代码分开两套文件进行编写,都在同样的文件中,只是通过宏定义来控制执行流程,SPL文件夹内由自己的Makefile文件。
//作者:kevinjz2010@gmail.com
//平台:S5PV210 ARMV7 TINY210
//-------------------------------------------------------------------------------------------------
本文使用的UBOOT版本:u-boot for tiny210 ver3.1
源码地址:http://blog.csdn.net/liukun321/article/details/7438880#comments
一、配置与使用
1、在系统根目录下的Makefile中的第601行,通过下列语句:
sinclude$(obj).boards.depend
$(obj).boards.depend: boards.cfg
awk'(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config;$$(MAKE)" }' $< > $@
读取了boards.cfgboards.cfg中关于tiny210_onfig的配置项,其中.boards.depend是隐藏文件;
2、在Makefile的106行添加:
+ ifeq($(ARCH), arm)
+ CROSS_COMPILE= arm-none-linux-gnueabi-
+ endif
这样配置好了默认的编译器;
3、在根目录下执行:
$make tiny210_config
$make -j
即可在根目录得到tiny210-uboot.bin,可用于SD卡启动和NAND启动;
4、烧入SD卡的时候使用下面命令:
$sudodd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1
dd命令用于对SD进行烧写,根据三星手册《S5PV210_iROM_ApplicationNote_Preliminary_20091126》,将tiny210-uboot.bin烧写到,SD卡的第一个Block,保留第0个block不用,每个block=512B。
5、从SD卡启动后可以就可以将UBOOT烧写到nand里了:
$tftp 21000000 tiny210-uboot.bin
$nand erase 0 40000
$nand write 21000000 0 40000
二、启动流程分析
按照三星《S5PV210_UM_REV1.1》手册上说明的启动流程,S5PV210上电将从IROM处执行固化的启动代码,对时钟等初始化、对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(0xd002_0000处,其中0xd002_0010之前的16个字节储存的BL1的校验信息和BL1尺寸)中,并对BL1进行校验,校验OK转入BL1进行执行;BL1继续初始化,并将BL2复制到IRAM中并对其校验,OK后转入BL2;BL2则要进行比较复杂的初始化,包括DRAM的初始化,完成后将OS代码复制到DRAM中,并转入到OS中执行并完成启动引导。
但是,上述的IRAM只有96K大小,对于日益复杂的uboot来说,肯定是不够的,所以使用UBOOT启动引导的时候,也没全按三星手册上说的执行,具体如下:
首先解释一下我认为的BL0、BL1、BL2:
BL0:是指S5PV210的IROM中固化的启动代码;
BL1:是指在IRAM中执行的UBOOT的部分代码;
BL2:是指在内存中执行的的UBOOT的完整代码;
此版本的UBOOT,其实会编译两个UBOOT.bin,即最终生成的tiny210-uboot.bin包括两部分,前段是spl(重用u-boot中既有的驱动,来生成更小的secondaryprogramloader)文件夹内的tiny210-spl.bin,后段是用于在RAM中执行的完整UBOOT代码。所以学习UBOOT代码是也要两个部分来看。
1、第一步与三星手册上一致,执行IROM内固化的代码,即BL0,BL0会将存储于启动设备的UBOOT代码的前16KB:tiny210-spl.bin复制到IRAM。(tiny210-spl.bin设置为24KB了,但实际绝不会超过16KB,后面全填充的0,所以拷不完也OK。这里是liukun321为了统一MMC与NAND启动而作的修改,也许改成16K就应该OK了,应为IROM里的代码最多拷贝16K进IRAM嘛,一会改改试试。所以呢实际上执行BL1就是执行tiny210-spl.bin。在UBOOT的代码中并不会看到tiny210-spl.bin和完整的UBOOT代码分开两套文件进行编写,都在同样的文件中,只是通过宏定义来控制执行流程,SPL文件夹内由自己的Makefile文件。