启动引导(boot loader)是包括两个部分:1.引导加载os 2. 为了让os能够正常运行所要做的硬件和软件初始化工作。从OS引导的方式来看,启动又分两种模式,一种是用于开发人员调试的“下载模式”,配置好网络环境、网络文件系统变量之后,OS可以从PC宿主机进行引导;另一种是量产产品的启动模式,OS已经存在于产品系统的外存设备中,启动即从外存中加载。
常见的启动引导模块技术如下图:
uboot是一个通用的boot loader,被广泛应用于多种芯片架构的不同操作系统的引导。uboot是由德国 DENX中心维护的开项目,至今已经支持超过200块不同的主板启动. S5PV210是三星研发的基于arm cortex a8的SOC,也得到uboot支持。由于S5PV210和S5PC11X基本一致(不同点请看上一篇:嵌入式启动之四),uboot在源码目录支持体现的是SP5PC11X。
uboot源码目录如下:
主要目录解释如下,用source insight可以将这些相关目录添加进去。
1)CPU是与体系相关的代码。source insight添加\cpu\s5pc11x 文件夹的文件。UBOOT 第一阶段的第一条语句就包含在这个目录的start.S中。CPU目录配置的是S5PV210芯片的硬件初始化。
2)board是厂商开发板定制部分相关代码,source insight添加\board\samsung\smdkc110文件夹的文件。smdkc110是三星针对S5PV210芯片研发的开发板。国内大部分基于A8的学习开发板都是仿照这个开发板进行研制。因此此类开发板的UBOOT移植工作量不大。
3)common是UBOOT与平台(体系架构)无关的命令代码,如setenv,nand等命令相关的代码实现。source insight添加\common\ 文件夹的文件
4)lib_arm是UBOOT与系统相关的一些命令的代码实现。source insight添加\lib_arm。
5)driver 驱动,rtc,lcd,i2c,mtd等等。如果开发板连接了跟smdkc110开发板不同的外围器件,那需要对该目录的对应驱动进行移植。source insight添加\driver目录。
6)fs,文件系统支持,如fat32,yaffs2,cramfs等。source insight添加\fs目录。
7)net,网络协议栈支持,如tftp、nfs等。source insight添加\net目录。
8)include,头文件。选择s5pc11x,arm相关的头文件添加 。
9)根目录的makefile, mkconfig. mkconfig是字符配置方式,在makefile之前进行配置,并创建一些配置文件,在makefile阶段会使用。mkconfig方便项目进行多体系支持,当需要产生某个开发板的引导固件时,就需要先配置好要编译哪个体系的哪个开发板,配置的结果就是产生一个特定的文件。然后makefile编译链接前会读取该文件获得配置信息,进行相应的编译过程。
mkconfig的目标在include/configs/目录,如smdk110.h。要支持S5PV210,可以拷贝smdk110.h为s5pv210_config.h,并修改相关的配置(以后移植时会谈到)。然后./mkconfig s5pv210_config即完成配置。接着make完成编译链接过程,生成uboot.bin。
uboot.bin可以通过sd_fuse目录创建card启动,也可以通过UBOOT自身的tftp命令和nand读写命令进行uboot更新。
tftp下载固件到内存,需要先配置好网络环境,开发板和宿主机需要设置在同一个局域网。如果是vmare的linux需要和板子连通,需要设置为bridge方式,不能用NAT方式。同时,还需要在宿主机上配置好tftp服务器。设置同一个局域网的命令是:(通过uboot命令行设置:)
setenv ipaddr 192.168.1.xxx (开发板的网卡IP)
setenv serverip 192.168.1.yyy (宿主机的网络IP)
setenv gatewayip 192.168.1.1
saveenv
tftp的格式为:tftp 内存地址 文件名,即将文件的内容下载到内存地址所指的地方。文件所在的目录在tftp服务器上设定。
nand write 内存地址 nand起始地址(为0) 长度,即可将内存中的文件内容写到nand。重新上电即可。