二、Bootloader分析与移植
1、U-boot源码结构
U-boot根目录下共有26个子目录,分为4类:
①平台相关的或开发板相关的;
②通用的函数;
③通用的设备驱动程序;
④U-boot工具、示例程序、文档。
2、U-boot体验
根据顶层Readme文件说明,若使用开发板board/,先执行make _config命令进行配置,然后执行make all生产如下3个文件:①U-boot.bin;②U-boot;③U-boot.srec。
3、U-boot的配置过程
以smdk_2410为例,分析Makefile大致流程及结构。
一般地,编译U-boot通过以下两条命令实现:
# make smdk2410_config
# make all
执行第一条命令后,在include目录下生产两个文件:config.mk和config.h。这两个文件是如何生产的?在顶层Makefile文件中有如下代码:
SRCTREE := $(CURDIR)
..........
MKCONFIG := $(SRCTREE)/mkconfig
..........
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
若在U-boot根目录下编译,则以上的MKCONFIG就是根目录下的mkconfig。$(@_config=)的结果就是将_config去掉,结果为smdk2410,所以make smdk2410_config实际上就是执行如下命令:
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
红色的字都是作为参数传递给mkconfig这个shell脚本,下面分析mkconfig脚本的作用。
①确定开发板名称BOARD_NAME,相关代码如下:
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
因命令./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0中午--、-a、-n等符号,所以执行完以上代码后,APPEND维持原值,BOARD_NAME等于第一个参数,即“smdk2410”。
②创建平台/或开发板相关头文件的链接:
# 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 "config/smdk2410.h"
阅读(179) | 评论(0) | 转发(0) |