首页 > 代码库 > U-Boot-2014.01 for Tiny210移植手册(零) ---- 移植前的准备
U-Boot-2014.01 for Tiny210移植手册(零) ---- 移植前的准备
启动过程分析
其实S5PV210的启动过程网上一搜一大把,这里就不详细讲了。下面我们结合U-Boot的启动过程和S5PV210启动过程结合起来对比。
根据S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf,我们可以得知,S5PV210的启动过程分为3个阶段:
- BL0:固化在内部ROM中的执行步骤,每次打开电源就执行。它将BL1阶段的代码复制到内部RAM
- BL1:在内部RAM里面执行。它将负责加载BL2的代码到内部RAM。BL1的大小规定不超过16K,并且头部要加上16字节的校验码
- BL2:在内部RAM里面执行。它的工作是初始化DRAM控制器,并把OS的数据加载到SDRAM。因为内部RAM的大小是96K,BL1占了16K,所以BL2最多为80K
关于BL0
BL0阶段,三星固化在内部ROM里面的代码究竟做了什么工作?查阅S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf我们可以得知,BL0的固化代码做了以下的工作:
-
关闭看门狗
-
初始化iCache (即 instruction cache, 指令用的缓存)
-
初始化栈
-
初始化堆
-
初始化块设备拷贝函数库 (它是个函数库,我们待会移植时会用到从SD卡复制到SDRAM的函数)
-
初始化PLL和系统时钟 (默认的系统时钟频率才400MHz,我们待会将它提高到1GHz)
-
把BL1的代码复制到内部RAM
-
检查BL1的校验码 (这就是BL1代码前16字节的作用)
如果校验失败,内部ROM将会以第二启动顺序 (SD/MMC 通道2) -
查看是否安全启动模式 (我们这里不关心)
-
跳转到BL1
关于BL1、BL2和U-Boot启动顺序
我们先看看U-Boot的启动顺序。在U-Boot中,我们先启动SPL (位于U-Boot源码的SPL文件夹中),SPL负责把U-Boot代码从启动设备 (SD卡/Nand Flash)拷贝到SDRAM中,再跳转到SDRAM执行剩下的U-Boot代码。
这里对比一下S5PV210的启动顺序,我们可以知道,SPL就是所谓的BL1阶段,然后我们没有BL2阶段,而是直接跳到SDRAM执行剩下的U-Boot代码。为什么?因为前面说了,内部RAM只有96K大小,而一个U-Boot也有100+K,SPL有16K,内部RAM肯定放不下。所以我们只能把SPL放在内部RAM,让SPL把U-Boot代码从启动设备拷贝到SDRAM里面,再跳转执行。
总结一下:
BL0:固化在内部ROM
BL1:U-Boot里面的SPL
BL2:没有BL2阶段
精简U-Boot目录结构
下面我们来做一件很爽的事情。下载完U-Boot源码之后你会发现,U-Boot占用很大,支持很多开发板和CPU。但是其实对于嵌入式来说,我们每次移植只关心我们的目标开发板和CPU,其它开发板和CPU对于我们来说都是多余的。因此,我们可以进行U-Boot目录的精简。而且,精简U-Boot目录结构有个好处,就是移植时出现的错误,你使用grep "错误信息" . -nR查询错误相关文件时,能少显示很多无关的文件。还有,对于我这种有“洁癖”的人来说,必须精简..... 唉~
这里我们以Tiny210开发板为例,它使用的是armv7的CPU架构,here we go:
-
arch目录
- 除arm目录,其它架构的目录全部删掉。删去后的目录结构:(请自动忽略掉.gitignore文件)
- 进入arm目录,除CPU、include、lib目录和config.mk文件,其它目录全部删掉
- 进入CPU目录,除了armv7目录、.depend、Makefile、u-boot.lds、u-boot-spl.lds,其它全部删掉 (built-in.o是编译后才生成的)
- 进入armv7目录,保留如下图所示的目录和文件,其它全部删掉 (.o文件是编译后生成的,请自动忽略 - -b)
-
board目录
-
- 进入board目录,除了samsung目录,其它全删去
- 进入samsung目录,除了smdkc100目录,其它全部删去
-
include/configs目录
-
- 进入include/configs目录,除了smdkc210.h,其它全部删去
Source Code: https://github.com/a226035102/U-Boot-2014.01_for_tiny210