嵌入式linux开发uboot移植(二)――uboot工程源码目录分析

时间:2021-03-22 18:38:05

嵌入式linux开发uboot移植(二)――uboot工程源码目录分析

    本文分析的ubootuboot_smdkv210,是三星官方发布的基于S5PV210评估开发板对应的uboot

一、uboot源码目录结构解析

1cpu

    本文件夹下的子文件与处理器相关,每个文件夹代表一种CPU系列。每个子目录中都包括cpu.cinterrupts.cstart.S文件。

    cpu.c主要用于初始化CPU、设置指令Cache和数据Cache

    interrupt.c主要用于设置系统的各种中断和异常

    start.SU-boot启动时执行的第一个文件,主要做最早期的系统初始化,代码重定向和设置系统堆栈,为进入U-boot第二阶段的C程序奠定基础。

    S5PV210芯片对应的文件夹是s5pc11x

    cpu/s5pc11x/s5pc110/cpu_init.S主要用于SDRAM内存的初始化设置。

 

2、board

本文件下的子文件与开发板相关,每一个子文件代表一个芯片厂家,芯片厂家文件夹下存放的每一个子文件夹是一种开发板,由于历史原因,board目录下尚保留有大量的开发板文件夹没有归档到芯片厂家文件夹内,保持兼容性,因此整体显得比较混乱。如samsungsmdk2400smdk2410开发板就位于samsung文件夹外。

    S5PV210芯片对应的文件夹位于board/samsung/smdkc110,文件夹内的lowlevel_init.S文件主要用于时钟、串口、MMUFlash底层驱动、板级初始化,u-boot.lds文件是链接脚本文件,对于工程项目编译后期的链接阶段非常重要,决定了程序的组装。


3common

    本文件夹下存放与处理器体系结构无关的通用代码,uboot的命令解析代码/common/command.c、所有命令的上层代码cmd_*.cuboot环境变量处理代码env_*.cCRC校验等都位于目录下


4、drivers

    本目录下存放所有外围芯片的驱动,网卡、USB、串口、LCDNand Flash等。


5、disk

    本目录存放于磁盘驱动的分区处理代码


6fs

    本目录下存放文件系统相关的代码,每一个子文件夹代表一种文件系统。


7、net

    本目录下存放于网络协议相关的代码


8doc

    本目录下存放uboot的说明文档。


9apiapi_examples、examples

    外部扩展程序的API和示例


10include

    头文件,包括各种CPU的寄存器定义,文件系统、网络等等

         configs子目录下的文件是与目标板相关的配置头文件


11、lib_xxx

    lib_arm、lib_avr32lib_blackfinlib_generic、lib_i386lib_m68klib_microblazelib_mipslib_nioslib_nios2lib_ppclib_shlib_sparc

每一个文件夹代表一种CPU体系架构。与S5PV210相关的文件夹有lib_armlib_generic,lib_generic目录存放的是各CPU体系架构通用的加密算法、压缩算法、字符处理相关代码。在每一种CPU体系架构文件夹内都存在board.c,是uboot启动第二阶段代码入口函数和相关初始化函数存放的地方


12libfdt

    本目录下存放的是设备数相关的代码。


13tools

    编译S-Recorduboot映像等相关工具,制作bootm引导的内核映像文件工具mkimage源码


14post

    上电自检相关代码


15nand_splonenand_bl1onenand_ipl

    Nandonenand启动相关的代码。


16、sd_fusing

本目录下存放的是烧录相关的工具代码


17、工程编译配置文件

          MakefileMAKEALLconfig.mkrules.mkmkconfig

    控制工程编译过程的主Makefile文件和规则文件

    config.mk文件内的TEXT_BASE指定了代码在内存中的地址。


18、版本、版权说明文件

        CHANGELOGCHANGELOG-before-U-Boot-1.1.5COPYINGCREDITSMAINTAINERSREADMEChangelog_Samsung


二、uboot工程编译配置

    uboot工程编译配置主要是根据Makefile及子配置文件的配置信息控制uboot的编译过程。

1、编译命令分析

    uboot编译命令有make xxxx_configmake

    make xxxx_config为开发板信息配置命令,make为编译命令。make xxx_config中xxx_config的值由具体开发板决定,对应配置信息位于uboot顶层目录下的Makefile。    

    一般来说,三星的S5PV210开发板对应的值为smdkv210single_config,根据开发板的不同,还可以选择smdkv210vogue_configsmdkv210single_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内容。

2mkconfig脚本分析

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源代码。


本文出自 “生命不息,奋斗不止” 博客,转载请与作者联系!