嵌入式linux开发uboot移植(二)――uboot工程源码目录分析
本文分析的uboot为uboot_smdkv210,是三星官方发布的基于S5PV210评估开发板对应的uboot。
一、uboot源码目录结构解析
1、cpu
本文件夹下的子文件与处理器相关,每个文件夹代表一种CPU系列。每个子目录中都包括cpu.c、interrupts.c、start.S文件。
cpu.c主要用于初始化CPU、设置指令Cache和数据Cache等
interrupt.c主要用于设置系统的各种中断和异常
start.S是U-boot启动时执行的第一个文件,主要做最早期的系统初始化,代码重定向和设置系统堆栈,为进入U-boot第二阶段的C程序奠定基础。
S5PV210芯片对应的文件夹是s5pc11x。
cpu/s5pc11x/s5pc110/cpu_init.S主要用于SDRAM内存的初始化设置。
2、board
本文件下的子文件与开发板相关,每一个子文件代表一个芯片厂家,芯片厂家文件夹下存放的每一个子文件夹是一种开发板,由于历史原因,board目录下尚保留有大量的开发板文件夹没有归档到芯片厂家文件夹内,保持兼容性,因此整体显得比较混乱。如samsung的smdk2400、smdk2410开发板就位于samsung文件夹外。
S5PV210芯片对应的文件夹位于board/samsung/smdkc110,文件夹内的lowlevel_init.S文件主要用于时钟、串口、MMU、Flash底层驱动、板级初始化,u-boot.lds文件是链接脚本文件,对于工程项目编译后期的链接阶段非常重要,决定了程序的组装。
3、common
本文件夹下存放与处理器体系结构无关的通用代码,uboot的命令解析代码/common/command.c、所有命令的上层代码cmd_*.c、uboot环境变量处理代码env_*.c、CRC校验等都位于本目录下。
4、drivers
本目录下存放所有外围芯片的驱动,网卡、USB、串口、LCD、Nand Flash等。
5、disk
本目录存放于磁盘驱动的分区处理代码
6、fs
本目录下存放文件系统相关的代码,每一个子文件夹代表一种文件系统。
7、net
本目录下存放于网络协议相关的代码
8、doc
本目录下存放uboot的说明文档。
9、api、api_examples、examples
外部扩展程序的API和示例
10、include
头文件,包括各种CPU的寄存器定义,文件系统、网络等等
configs子目录下的文件是与目标板相关的配置头文件
11、lib_xxx
lib_arm、lib_avr32、lib_blackfin、lib_generic、lib_i386、lib_m68k、lib_microblaze、lib_mips、lib_nios、lib_nios2、lib_ppc、lib_sh、lib_sparc
每一个文件夹代表一种CPU体系架构。与S5PV210相关的文件夹有lib_arm、lib_generic,lib_generic目录存放的是各CPU体系架构通用的加密算法、压缩算法、字符处理相关代码。在每一种CPU体系架构文件夹内都存在board.c,是uboot启动第二阶段代码入口函数和相关初始化函数存放的地方。
12、libfdt
本目录下存放的是设备数相关的代码。
13、tools
编译S-Record或uboot映像等相关工具,如制作bootm引导的内核映像文件工具mkimage源码。
14、post
上电自检相关代码
15、nand_spl、onenand_bl1、onenand_ipl
Nand、onenand启动相关的代码。
16、sd_fusing
本目录下存放的是烧录相关的工具代码
17、工程编译配置文件
Makefile、MAKEALL、config.mk、rules.mk、mkconfig
控制工程编译过程的主Makefile文件和规则文件
config.mk文件内的TEXT_BASE指定了代码在内存中的地址。
18、版本、版权说明文件
CHANGELOG、CHANGELOG-before-U-Boot-1.1.5、COPYING、CREDITS、MAINTAINERS、README、Changelog_Samsung。
二、uboot工程编译配置
uboot工程编译配置主要是根据Makefile及子配置文件的配置信息控制uboot的编译过程。
1、编译命令分析
uboot编译命令有make xxxx_config和make
make xxxx_config为开发板信息配置命令,make为编译命令。make xxx_config中xxx_config的值由具体开发板决定,对应配置信息位于uboot顶层目录下的Makefile。
一般来说,三星的S5PV210开发板对应的值为smdkv210single_config,根据开发板的不同,还可以选择smdkv210vogue_config、smdkv210single_rev02_config、 smdkv210onenand_config等。smdkv210single_config开发板配置信息如下:
smdkv210single_config :unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk
@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110语句对应的执行语句是mkconfig smdkv210single arm s5pc11x smdkc110 samsung s5pc110,根据输入的arm s5pc11x smdkc110 samsung s5pc110参数利用顶层目录下的mkconfig脚本生成include/config.mk的配置文件。
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk语句用于创建board/samsung/smdkc110/config.mk文件,写入TEXT_BASE = 0xc3e00000内容。
2、mkconfig脚本分析
mkconfig脚本用于为某个开发板配置uboot创建头文件和链接文件。mkconfig脚本主要参数有Target Architecture CPU Board [VENDOR] [SOC]。S5PV210开发板执行脚本为:mkconfig smdkv210single arm s5pc11x smdkc110 samsung s5pc110
mkconfig脚本主要功能如下:
A、创建CPU架构相关的链接文件
在默认情况下,make命令不指定输出目录,在顶层目录include目录下创建链接文件/include/asm指向/include/asm_arm目录
B、创建开发板相关的链接文件
在顶层目录include目录下创建链接文件/include/regs.h指向开发板include目录下开发板的头文件/include/s5pv110.h
在顶层目录include下的asm-arm目录下创建链接文件arch,指向include目录下的arch-s5pc11x目录。
C、生成include/config.mk文件
根据选择的开发板,将开发板配置信息smdkv210single arm s5pc11x smdkc110 samsung s5pc110作为mkconfig输入参数,并将这些参数作为变量的值写入创建的include/config.mk文件中,config.mk文件内容入下:
ARCH = arm
CPU = s5pc11x
BOARD = smdkc110
VENDOR = samsung
SOC = s5pc110
D、创建开发板配置的头文件
在顶层目录include目录下创建config.h文件,写入文件内容:
/* Automatically generated - do not edit */
#include <configs/smdkv210single_config.h>
3、开发板配置头文件分析
开发板配置头文件为include/configs/smdkv210single_config.h
smdkv210single_config.h头文件主要用宏定义了两类变量,一类是选项,用CONFIG_做前缀,用来选择处理器、设备接口、命令、属性等。如:
#define CONFIG_S5PC1101
#define CONFIG_S5PC11X1
一类是参数,用CFG_做前缀,用来定义总线频率、串口波特率、Flash地址等参数。如:文件内主要配置的信息有:内存基地址、机器码、启动方式、串口、I2C、网络信息、系统时钟、内存参数等。
4、Makefile文件分析
Makefile主要的功能就是控制uboot编译的过程,Makefile内的配置信息有版本信息的配置,调用mkconfig脚本生成配置信息,交叉编译工具链设置(一般需要设置CROSS_COMPILE = arm-linux-)、依据开发板信息配置头文件include/configs/smdkv210single.h调用config.mk脚本生成/include/autoconf.mk控制编译过程。各主要功能部分代码如下:
uboot版本设置选项:
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h//根据配置选项生成自动的文件
交叉编译工具的设置:
ifeq ($(ARCH),arm)
#修改CROSS_COMPILE = arm-linux-
CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
交叉编译工具链配置、开发板配置后就可以进行编译了
本文主要参考三星smdkv210开发板的官方uboot源代码。
本文出自 “生命不息,奋斗不止” 博客,转载请与作者联系!