mini2440 U-boot-1.1.6 分析

本文详细介绍了U-Boot的文件结构及其依赖关系,并深入探讨了Makefile配置过程和start.s文件的功能。同时,文章还阐述了如何通过修改源码使U-Boot支持NAND闪存启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为空。其它目录变量定义如下:

#OBJTREE和LNDIR为存放生成文件的目录,TOPDIR与SRCTREE为源码所在目录
Target:宿主机平台
Architecture:定义芯片架构(如MIPS、POWERPC、ARM等)
CPU:定义芯片指令集版本(如ARM7、ARM9、ARM11等)
Board:芯片厂商,它细分为两类
[VENDOR]:按厂商划分(如AT9200、S3C44B0等)
[SOC]:按SOC类型(如S3C2440、S3C2410等)
OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE  := $(CURDIR)
TOPDIR  := $(SRCTREE)
LNDIR  := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
2)定义变量MKCONFIG:这个变量指向一个脚本,即顶层目录的mkconfig。
Mkconfig源码详解见http://student.youkuaiyun.com/space.php?uid=91306&do=blog&id=6389
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
在编译U-BOOT之前,先要执行
# make mini2440_config
mini2440_config是Makefile的一个目标,定义如下:
mini2440_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
 unconfig::
 @rm -f $(obj)include/config.h $(obj)include/config.mk /
  $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
显然,执行# make mini2440_config时,先执行unconfig目标,注意不指定输出目标时,obj,src变量均为空,unconfig下面的命令清理上一次执行make *_config时生成的头文件和makefile的包含文件。主要是include/config.h 和include/config.mk文件。
然后才执行命令
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的设计思路
       如果S3C2410被配置成从NAND闪存启动,上电后,S3C2410的NAND
闪存控制器会自动把NAND闪存中的前4K数据搬移到内部RAM中, 并把0x00000000
设置为内部RAM的起始地址, CPU从内部RAM的0x00000000
位置开始启动。因此要把最核心的启动程序放在NAND闪存的前4K中。
       由于NAND闪存控制器从NAND闪存中搬移到内部RAM的代码是有限的,所以,
在启动代码的前4K里,必须完成S3C2410的核心配置,并把启动代码的剩余部分搬到RAM
中运行。在U-BOOT中, 前4K完成的主要工作就是U-BOOT启动的第一个阶段(stage1)。
根据U-BOOT的执行流程图,可知要实现从NAND闪存中启动U-BOOT,首先需要初始化NAND
闪存,并从NAND闪存中把U-BOOT搬移到RAM中,最后需要让U-BOOT支持NAND
闪存的命令操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值