以前移植的UBoot都是2009年的版本,现在发现新版本的uboot代码
结构有了很大的变化,感觉组织的越来越像Linux内核了。
当前编译Uboot的Linux系统:
Ubuntu 14.04 (32位)
交叉编译环境为:
arm-linux-gnueabi-gcc (4.7.3版本)在ubuntu下安装交叉编译环境的命令:
sudo apt-get install gcc-arm-linux-gnueabi
下载新版Uboot并解压:
推荐官方下载地址(ftp://ftp.denx.de/pub/u-boot/)
解压:~/ARM/uboot$ tar -vjxf u-boot-2016.05.tar.bz2
进入源码目录,
先配置编译环境(修改根目录下的Makefile):
找到下面的内容:
VERSION = 2016
PATCHLEVEL = 05
SUBLEVEL =
EXTRAVERSION =
NAME =
修改为:
VERSION = 2016
PATCHLEVEL = 05
SUBLEVEL =
EXTRAVERSION =
NAME =
ARCH = arm
CROSS_COMPILE = arm-linux-gnueabi-
接着找到和自己板子体系结构相近的配置,我现在用S3C2440
的板子,所以在2410的基础上修改.
如果现在有一个新加工好的板子,而不是买的板子(TQ2440,
mini2440等等),那么现在假如给新的板子命名为MY2440
先从板级配置文件开始:
cp u-boot-2016.05/configs/smdk2410_defconfig
u-boot-2016.05/configs/my2440_defconfig
现在就创建了新的板级配置文件,但是里面的配置还都是smdk2410
板子的配置,现在改为自己想要的配置。
gedit u-boot-2016.05/configs/my2440_defconfig
改动前的内容如下:
CONFIG_ARM=y
CONFIG_TARGET_SMDK2410=y
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="SMDK2410 # "
CONFIG_CMD_USB=y
# CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_DHCP=y
CONFIG_CMD_PING=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_EXT2=y
CONFIG_CMD_FAT=y
现在改为:
CONFIG_ARM=y
CONFIG_TARGET_MY2440=y
CONFIG_HUSH_PARSER=y
CONFIG_SYS_PROMPT="MY2440 # "
CONFIG_CMD_USB=y
# CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_DHCP=y
CONFIG_CMD_PING=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_EXT2=y
CONFIG_CMD_FAT=y
现在添加MY2440板子的底层实现,还是在SMDK2410代码
基础上修改,UBoot源码中大部分和板子相关的代码在board目录下。
现在先不考虑具体板子的细节,先能让其编译通过,再一步
一步修改。现在干脆就把.../board/samsung/smdk2410/复制一份,
直接把目录的名字改为自己板子的名字。
cp -rf u-boot-2016.05/board/samsung/smdk2410/
u-boot-2016.05/board/samsung/my2440/
到这一步板子底层代码也添加了,但是这些代码还没有和刚才
创建的配置关联起来,所以现在需要修改配置将其对应起来。
打开对应体系结构的目录,并修改里面的配置:
gedit u-boot-2016.05/arch/arm/Kconfig
在打开的文件中查找TARGET_SMDK2410部分,现在要添加自己板子
对应的体系结构,由于2440和smdk2410体系结构相似,所以直接
复制smdk2410的配置,添加为现在my2440的配置。
config TARGET_SMDK2410
bool "Support smdk2410"
select CPU_ARM920T
现在在其下面添加自己板子的体系结构:
config TARGET_MY2440
bool "Support my2440"
select CPU_ARM920T
上面这一步的TARGET_MY2440其实是为了和my2440_defconfig
配置文件中修改的配置对应起来(TARGET_MY2440)。
然后添加完体系结构的配置后,还需要指定板级代码的目录,就是
刚才复制的.../board/samsung/my2440/的路径:
在u-boot-2016.05/arch/arm/Kconfig中,查找smdk2410的板子
源码目录: source "board/samsung/smdk2410 ......。
找到后添加自己板子的源码目录:
......
source "board/ppcag/bg0900/Kconfig"
source "board/samsung/smdk2410/Kconfig"
source "board/sandisk/sansa_fuze_plus/Kconfig"
......
现在改为:
......
source "board/ppcag/bg0900/Kconfig"
source "board/samsung/smdk2410/Kconfig"
source "board/samsung/my2440/Kconfig"
source "board/sandisk/sansa_fuze_plus/Kconfig"
......
刚才通过复制添加的板级源码,只是复制的smdk2410的,
但是里面的实现还得改为现在板子(MY2440).
先从配置文件改起:
gedit u-boot-2016.05/board/samsung/my2440/Kconfig
配置文件打开后,可以看到很多配置还都是smdk2410的配置:
if TARGET_SMDK2410
config SYS_BOARD
default "smdk2410"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s3c24x0"
config SYS_CONFIG_NAME
default "smdk2410"
endif
现在把里面的内容改为当前板子(MY2440)的配置:
if TARGET_MY2440
config SYS_BOARD
default "my2440"
config SYS_VENDOR
default "samsung"
config SYS_SOC
default "s3c24x0"
config SYS_CONFIG_NAME
default "my2440"
endif
上面的default "my2440"不能写错,这里是为了在执行
make my2440_config命令时,将里面的值生成到根目录.config配置
文件里面的。
还要修改底层源码的实现文件,在这儿先把文件名改了,
改成自己板子的名字:
mv u-boot-2016.05/board/samsung/my2440/smdk2410.c
u-boot-2016.05/board/samsung/my2440/my2440.c
虽然该代码中,大多数代码是S3C24x0系列通用的,但是这里还是
有一个地方要改:
gedit u-boot-2016.05/board/samsung/my2440/my2440.c
打开后搜索: SMDK2410,
int board_init(void)
{
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
icache_enable();
dcache_enable();
return 0;
}
将其改为:
int board_init(void)
{
/* arch number of MY2440-Board */
gd->bd->bi_arch_number = MACH_TYPE_MINI2440;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
icache_enable();
dcache_enable();
return 0;
}
这里板子底层初始化部分先暂时使用MINI2440板子的参数配置,
目的先是为了编译能通过。
另外还需要修改Makefile,否则在编译时会抱错:
gedit u-boot-2016.05/board/samsung/my2440/Makefile
修改前:
obj-y := smdk2410.o
obj-y += lowlevel_init.o
修改后:
obj-y:= my2440.o
obj-y += lowlevel_init.o
现在接着修改板子底层的代码引用的头文件smdk2410.h,
而现在板子用的s3c2440,所以现在创建自己板子的定义,
还是直接复制并更改:
cp u-boot-2016.05/include/configs/smdk2410.h
u-boot-2016.05/include/configs/my2440.h
主要将头文件里面的smdk2410相关的地方改为目标板的具体参数。如:
#define CONFIG_S3C24X0 /* This is a SAMSUNG S3C24x0-type SoC */
#define CONFIG_S3C2410 /* specifically a SAMSUNG S3C2410 SoC */
#define CONFIG_SMDK2410 /* on a SAMSUNG SMDK2410 Board */
修改成下面这样
#define CONFIG_S3C24X0 /* This is a SAMSUNG S3C24x0-type SoC */
#define CONFIG_S3C2440/* specifically a SAMSUNG S3C2440 SoC */
#define CONFIG_MY2440/* on custom my2440 Board */
现在开始重新编译UBoot:
进入源码目录,cd u-boot-2016.05
在编译前先清空一次目录,sudo make distclean
修改编译配置,make my2440_config
修改完编译项后,最好先检查下根目录下生成的配置.config(该文件为隐藏文件),
gedit .config
主要检查如下几项配置是否正确:
......
CONFIG_SYS_ARCH="arm"
CONFIG_SYS_CPU="arm920t"
CONFIG_SYS_SOC="s3c24x0"
CONFIG_SYS_VENDOR="samsung"
CONFIG_SYS_BOARD="my2440"
CONFIG_SYS_CONFIG_NAME="my2440"
......
这样就可以正式开始编译了:
sudo make
......
......
LD net/built-in.o
LD test/built-in.o
LD test/dm/built-in.o
CC examples/standalone/stubs.o
LD examples/standalone/libstubs.o
CC examples/standalone/hello_world.o
LD examples/standalone/hello_world
OBJCOPY examples/standalone/hello_world.srec
OBJCOPY examples/standalone/hello_world.bin
LDS u-boot.lds
LD u-boot
OBJCOPY u-boot.srec
OBJCOPY u-boot-nodtb.bin
COPY u-boot.bin
SYM u-boot.sym
CFG u-boot.cfg
直到出现上面几行内容,就可以肯定UBoot已经编译通过了,
到现在为止,紧紧是编译通过了,但是其中的很多地方还都是smdk2410
板子的实现,接下来的几篇博客再记录这些地方的修改方法。