uboot-xlinx-v2013.4源码分析

uboot-xlinx-v2013.4,从xilinx的github上面下载过来。
https://github.com/Xilinx
基于这个版本进行移植。
先分析uboot的代码结构和关键宏定义。
ZYNQ相关的:
(1)arch/arm/cpu/armv7/zynq/,与CPU相关代码,我们不用改动。
(2)board/xilinx/zynq/,与BOARD相关的代码,我们需要改动,添加适合自己的板子的代码。
(3)common/,uboot支持的命令的实现代码,我们需要改动,添加自己需要的命令。
(4)include/configs/,uboot需要使用的H文件,其中存放与BOARD相关的配置头文件,如zynq_zed.h就是ZED的配置宏。
当我们使用make <board_name>_config时,make工具会在里面找对应的<board_name>.h文件,抽取其中定义的宏。
(5)board.cfg,make工具需要使用的文件,在里面找board_name 对应的配置行,并抽取字符串,export给对应的变量。例如可以找到zynq_zed配置行。当我们的板子与zed相似时,在这个文件中,复制zynq_zed的配置行,并将名称改为我们的板子名称即可。
当我们make <board_name>_config后,会生成config.mk,供Makefile使用,同时,在include下生成config.h。这是板子相关的配置信息。可以看到,其中有一句关键的语句
#include <configs/zynq_zed.h>
这是将我们想要的板子的配置头文件包含进来了。
总makefile不需要修改,但是某些子目录的makefile需要修改。分析makefile可以发现,
通常,在没有配置BUILD_DIR环境变量时,SRCTREE,src,OBJTREE,obj变量,都时赋值为uboot的源代码的根目录。
MKCONFIG指向脚本mkconfig。
LIBS变量,指明了uboot需要的库文件,这些都是通过相应的子目录编译的.o文件得到的。
all目标,最终会生成u-boot,这是一个ELF文件,但是没有后缀,如果在VIVADOSDK中使用,需要改名,添加后缀,改成u-boot.elf。

uboot的运行过程分析。
uboot的运行,从start.S汇编文件开始,这是CPU文件,位于arch/arm/cpu/armv7/目录下。不需要修改,但是要看懂它。
其中一句:
.word CONFIG_SYS_TEXT_BASE
这是存放的一个常数,定义TEXT_BASE,为0x04000000,也就是DDR的起始地址。
这个宏,在include/configs/zynq_common.h中定义。
其中一句:
bl lowlevel_init
调用lowlevel_init函数,该函数在lowlevel_init.S文件中,位于arch/arm/cpu/armv7/目录下。不需要修改。
lowlevel_init函数,将会调用board_init_f函数,位于/arch/arm/lib/board.c文件中。
board_init_f函数,会调用relocate_code函数,进行重定位,之后跳转到board_init_r函数运行。这几个函数,不需要修改。位于/arch/arm/lib/中。
board_init_r的最后,跳转到main_loop执行。在main.c文件中,位于common/目录下。
其中,board_init_f函数,用到一个宏,PHYS_SDRAM_1。

PHYS_SDRAM_1这个宏,在板子相关的配置头文件中定义。
例如,zynq_zed.h。
#define PHYS_SDRAM_1_SIZE (512 * 1024 * 1024)

CONFIG_SYS_SDRAM_BASE这个宏,在ZYNQ公共配置头文件中定义。例如zynq_common.h。
#define CONFIG_SYS_SDRAM_BASE 0
CONFIG_SYS_SDRAM_SIZE这个宏,被定义成全部SDRAM空间。
#define CONFIG_SYS_SDRAM_SIZE PHYS_SDRAM_1_SIZE
CONFIG_SYS_MALLOC_LEN这个宏,定义了malloc可以使用的大小。
#define CONFIG_SYS_MALLOC_LEN 0x400000

/common/main.c中的main_loop函数,就是最终死循环的位置,用于不断的处理用户命令。
其中的核心子程序是builtin_run_command函数。
其中用到的宏CONFIG_SYS_CBSIZE,在zynq_common.h中定义。
#define CONFIG_SYS_CBSIZE 2048
其中用到的宏CONFIG_SYS_MAXARGS,在zynq_common.h中定义。
#define CONFIG_SYS_MAXARGS 32

builtin_run_command函数经过解析cmdline后,会将处理好的cmdline传给cmd_process函数,调用cmd_process函数执行对应的命令。
cmd_process函数,位于/common/command.c文件中。
cmd_process函数,会根据传入的cmd_tbl_t的结构体,调用cmd_call函数。
cmd_call函数,根据传入的cmd_tbl_t结构体中的对应cmd的函数指针,调用对应的函数执行命令。
每一个有效的命令,都是用U_BOOT_CMD宏注册到全局内存中的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值