1.uboot的文件结构
目录中主要包含以下文件
a)依赖与平台的:
board: 主要存放电路板的目录,每一种平台都有一个相应的目录,主要文件有Makefile,config.mk 等
cpu: cpu相关文件,每一个特定的cpu目录中都包括cpu.c interrupt.c 和start.s文件 cpu.c 初始化cpu,设置指令cache和数据 cache等;interrupt.c设置系统的各种终端和异常,比如快速中断、开关中断、时钟中断、软件中断、预取终止和未定义指令等;start.s时uboot启动时执行的第一个文件,主要是设置系统堆栈,工作方式等。
lib_ppc 主要存放powerpc体系结构的通用文件
lib_arm 存放arm体系结构的通用文件
lib_i386 存放x86体系结构的通用文件
b)通用文件
include 头文件 和开发板的配置文件
common 实现各种命令的C文件
drivers 通用设备驱动 如网卡、串口等
fs 支持文件系统的文件
lib_generic 通用的多功能函数实现
post 上点自检
rtc 实时时钟
tools 创建S-Record格式文件和U-BOOT images的工具
2.Makefile
1)Makefile中定义了源码及生成的目标文件存放的目录,目标文件存放目录BUILD_DIR可以通过make O=dir 指定。如果没有指定,则设定为源码顶层目录。一般编译的时候不指定输出目录,则BUILD_DIR为空。其它目录变量定义如下:
Architecture:定义芯片架构(如MIPS、POWERPC、ARM等)
CPU:定义芯片指令集版本(如ARM7、ARM9、ARM11等)
Board:芯片厂商,它细分为两类
[VENDOR]:按厂商划分(如AT9200、S3C44B0等)
[SOC]:按SOC类型(如S3C2440、S3C2410等)
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
export MKCONFIG
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
@rm -f $(obj)include/config.h $(obj)include/config.mk /
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
3.start.s
完成的功能主要包括
1:cpu自身的初始化:包括MMU,catch,时钟系统,SDRAM控制系统的初始话。
2:重定位:把自己从flash中搬到SDRAM 中
3:分配堆栈空间,设置堆栈指针
4:清零BSS数据段
5:跳转到第二阶段入口函数。
详细分析见源代码
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
;对临界寄存器的初始化,如果从ram中启动则不执行,如果重启则执行
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
;重定向代码,也就是从flash中复制到ram中
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
;当前代码地址,adr获取当前代码的地址信息,若从ram运行则_start=TEXT_BASE,否则_start=0x00000000
adr r0, _start /* r0 <- current position of code */
;获取_TEXT_BASE
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
;两者相等,表示从ram运行则跳转到堆栈设置
beq stack_setup
;不相等则表示从flash中运行,重定向代码
从Nand Flash启动U-BOOT的基本原理
如果S3C2410被配置成从Nand Flash启动(配置由硬件工程师在电路板设置), S3C2410
的Nand Flash控制器有一个特殊的功能,在S3C2410上电后,Nand Flash控制器会自动的把
Nand Flash上的前4K数据搬移到4K内部RAM中,并把0x00000000设置内部RAM的起始地址,
CPU从内部RAM的0x00000000位置开始启动。这个过程不需要程序干涉。
程序员需要完成的工作,是把最核心的启动程序放在Nand Flash的前4K中。
启动程序的安排
由于Nand Flash控制器从Nand Flash中搬移到内部RAM的代码是有限的,
所以在启动代码的前4K里,我们必须完成S3C2410的核心配置以及把启动代码(U-BOOT)
剩余部分搬到RAM中运行。
u-boot源码不支持从nand flash启动,可是s3c2410支持从nand flash启动,开发板(
sbc-2410x)加电后s3c2410将nand flash的前4k(保存有u-boot的部分功能--拷贝功能--把
nand flash中的内容拷贝到SDRAM)拷贝到sram(s3c2410芯片内的sram)。这就需要修改u-
boot源码,增加u-boot的功能: 使u-boot在得到执行权后能够将其自身拷贝到开发板上
SDRAM中,以便处理器能够执行u-boot
从NAND闪存启动U-BOOT的设计思路
闪存控制器会自动把NAND闪存中的前4K数据搬移到内部RAM中, 并把0x00000000
设置为内部RAM的起始地址, CPU从内部RAM的0x00000000
位置开始启动。因此要把最核心的启动程序放在NAND闪存的前4K中。
在启动代码的前4K里,必须完成S3C2410的核心配置,并把启动代码的剩余部分搬到RAM
中运行。在U-BOOT中, 前4K完成的主要工作就是U-BOOT启动的第一个阶段(stage1)。
根据U-BOOT的执行流程图,可知要实现从NAND闪存中启动U-BOOT,首先需要初始化NAND
闪存,并从NAND闪存中把U-BOOT搬移到RAM中,最后需要让U-BOOT支持NAND
闪存的命令操作。