好文档 - 专业文书写作范文服务资料分享网站

uboot源代码分析及移植 

天下 分享 时间: 加入收藏 我要投稿 点赞

uboot源代码分析及移植

2009-10-20 22:33:35

标签:u-boot移植

本文从以下几个方面粗浅地分析u-boot并移植到FS2410板上: 1、u-boot工程的总体结构

2、u-boot的流程、主要的数据结构、内存分配。 3、u-boot的重要细节,主要分析流程中各函数的功能。

4、基于FS2410板子的u-boot移植。实现了NOR Flash和NAND Flash启动,网络功能。 这些认识源于自己移植u-boot过程中查找的资料和对源码的简单阅读。下面主要以smdk2410为分析对象。

一、u-boot工程的总体结构: 1、源代码组织

对于ARM而言,主要的目录如下:

board 平台依赖 存放电路板相关的目录文件,每一套板子对 应一个目录。如smdk2410(arm920t)

cpu 平台依赖 存放CPU相关的目录文件,每一款CPU对应一个目录,例如:arm920t、 xscale、i386等目录

lib_arm 平台依赖 存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数,如软件浮点。

common 通用 通用的多功能函数实现,如环境,命令,控制台相关的函数实现。

include 通用 头文件和开发板配置文件,所有开发板的配置文件都在configs目录下 lib_generic 通用 通用库函数的实现

net 通用 存放网络协议的程序

drivers 通用 通用的设备驱动程序,主要有以太网接口的驱动,nand驱动。 .......

2.makefile简要分析

所有这些目录的编译连接都是由顶层目录的makefile来确定的。

在执行make之前,先要执行make $(board)_config 对工程进行配置,以确定特定于目标板的各个子目录和头文件。

$(board)_config:是makefile 中的一个伪目标,它传入指定的CPU,ARCH,BOARD,SOC参数去执行mkconfig脚本。

这个脚本的主要功能在于连接目标板平台相关的头文件夹,生成config.h文件包含板子的配置头文件。

使得makefile能根据目标板的这些参数去编译正确的平台相关的子目录。 以smdk2410板为例,执行 make smdk2410_config, 主要完成三个功能:

@在include文件夹下建立相应的文件(夹)软连接,

#如果是ARM体系将执行以下操作: #ln -s asm-arm asm #ln -s arch-s3c24x0 asm-arm/arch #ln -s proc-armv asm-arm/proc

@生成Makefile包含文件include/config.mk,内容很简单,定义了四个变量: ARCH = arm CPU = arm920t BOARD = smdk2410 SOC = s3c24x0

@生成include/config.h头文件,只有一行: /* Automatically generated - do not edit */ #include \

顶层makefile先调用各子目录的makefile,生成目标文件或者目标文件库。 然后再连接所有目标文件(库)生成最终的u-boot.bin。 连接的主要目标(库)如下: OBJS = cpu/$(CPU)/start.o LIBS = lib_generic/libgeneric.a LIBS += board/$(BOARDDIR)/lib$(BOARD).a LIBS += cpu/$(CPU)/lib$(CPU).a ifdef SOC

LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a endif

LIBS += lib_$(ARCH)/lib$(ARCH).a

LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \\

fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a LIBS += net/libnet.a LIBS += disk/libdisk.a LIBS += rtc/librtc.a LIBS += dtt/libdtt.a LIBS += drivers/libdrivers.a LIBS += drivers/nand/libnand.a

LIBS += drivers/nand_legacy/libnand_legacy.a LIBS += drivers/sk98lin/libsk98lin.a LIBS += post/libpost.a post/cpu/libcpu.a LIBS += common/libcommon.a LIBS += $(BOARDLIBS) 显然跟平台相关的主要是: cpu/$(CPU)/start.o

board/$(BOARDDIR)/lib$(BOARD).a cpu/$(CPU)/lib$(CPU).a

cpu/$(CPU)/$(SOC)/lib$(SOC).a lib_$(ARCH)/lib$(ARCH).a

这里面的四个变量定义在include/config.mk(见上述)。

其余的均与平台无关。

所以考虑移植的时候也主要考虑这几个目标文件(库)对应的目录。 关于u-boot 的makefile更详细的分析可以参照

http://blog.mcuol.com/User/lvembededsys/Article/4355_1.htm。 3、u-boot的通用目录是怎么做到与平台无关的? include/config/smdk2410.h 这个头文件中主要定义了两类变量。

一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等,主要用来 决定是否编译某些文件或者函数。

另一类是参数,前缀是CFG_,用来定义总线频率、串口波特率、Flash地址等参数。这些常数参量主要用来支持通用目录中的代码,定义板子资源参数。

这两类宏定义对u-boot的移植性非常关键,比如drive/CS8900.c,对cs8900而言,很多操作都是通用的,但不是所有的板子上面都有这个芯片,即使有它在内存中映射的基地址也是平台相关的。所以对于smdk2410板,在smdk2410.h中定义了

#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */ #define CS8900_BASE 0x19000300 /*IO mode base address*/ CONFIG_DRIVER_CS8900 的定义使得cs8900.c可以被编译(当然还得定义CFG_CMD_NET才行),因为cs8900.c中在函数定义的前面就有编译条件判断:#ifdef CONFIG_DRIVER_CS8900 如果这个选项没有定义,整个cs8900.c就不会被编译了。

而常数参量CS8900_BASE则用在cs8900.h头文件中定义各个功能寄存器的地址。u-boot的CS8900工作在IO模式下,只要给定IO寄存器在内存中映射的基地址,其余代码就与平台无关了。

uboot源代码分析及移植 

uboot源代码分析及移植2009-10-2022:33:35标签:u-boot移植本文从以下几个方面粗浅地分析u-boot并移植到FS2410板上:1、u-boot工程的总体结构2、u-boot的流程、主要的数据结构、内存分配。3、u-boot的重要细节,主要分析流程中各函数的功能。4、基于FS241
推荐度:
点击下载文档文档为doc格式
5c7z28og0q9y6ym8bd1m
领取福利

微信扫码领取福利

微信扫码分享