U-Boot的源码是通过GCC和Makefile组织编译的。顶层目录下的Makefile首先可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成U-Boot映像。
当我们拿到u-boot的代码后我们就可以尝试给我们自己的板子编译一个u-boot的镜像,而根目录下的Makefile就是用来生成u-boot镜像的。 但在编译之前我们需要为我们的特定板子产生一个描述这块板子的配置文件,然后才能指导Makefile如何去编译能跑在这块板子上的u-boot镜像。
有一点要说明的是,从uboot2010.09开始,其工程架构发生了变化,以前关于板子相关的配置文件信息是放在根目录下的Makefile里的,而从这一版本开始独立成一个文件boards.cfg。
1. 移植环境
u-boot版本:u-boot-2011-06
Linux平台:Fedora 13
交叉编译工具:eldk ppc-2008-04-01_amcc
2. 以taihu开发板为例(u-boot支持)
2.1 删减u-boot文件(可不做)
(1)删除arch目录下除powerpc目录以外的所有目录
(2)删除arm/powerpc目录下除ppc4xx以外的所有目录
(3)删除board目录下除amcc目录以外的所有目录
(4)删除board/amcc目录下除taihu目录以外的所有目录
(5)删除include/configs目录下除taihu.h文件以外的所有头文件
2.2 编译
编译的过程分两部:(参见:)
# make taihu_config (生成配置)
# make all (生成最终文件)
当然,更好的做法是把编译出的文件生成到另外一个目录,并make clean如:
# export BUILD_DIR=../tmp //指定编译的输出目录
# make distclean //进入U-Boot源代码根目录后,可以先使用该命令确保已经清除以前编译的结果
# make taihu_config
# make all
3. 自制开发板
3.1 建立myppc405ep开发板配置
(1) # vim boards.cfg
添加一行
myppc405ep powerpcppc4xx-amcc
(2) 创建板级支持文件
[root@localhost uboot-ppc]# cd board/amcc/
[root@localhost amcc]# cp -r taihu/ myppc405ep
[root@localhost amcc]# cd myppc405ep/
[root@localhost myppc405ep]# mv taihu.c myppc405ep.c
[root@localhost amcc]# cd ../../..
[root@localhost uboot-ppc]# cd include/configs/
[root@localhost configs]# cp taihu.h myppc405ep.h
确定出在U-Boot中与taihu板有关的代码,依此对照修改myppc405ep的相关文件
[root@localhost uboot-ppc]# grep -r taihu ./
./board/amcc/taihu/taihu.c: * Beijing UD Technology Co., Ltd., taihusupport@amcc.com
./board/amcc/taihu/taihu.c:static void taihu_pci_fixup_irq(struct pci_controller *hose, pci_dev_t dev)
./board/amcc/taihu/taihu.c:hose->fixup_irq = taihu_pci_fixup_irq;
./include/configs/taihu.h: * Beijing UD Technology Co., Ltd., taihusupport@amcc.com
./include/configs/taihu.h:#define CONFIG_TAIHU 1/* on a taihu board */
./include/configs/taihu.h:#define CONFIG_HOSTNAMEtaihu
./boards.cfg:taihu powerpc ppc4xx - amcc
(删除了myppc405相关文件的显示)
按照上面的内容修改相应的myppc405ep.c和.h文件中相应语句
修改一:
static void myppc_pci_fixup_irq
hose->fixup_irq = myppc_pci_fixup_irq
修改二:
#define CONFIG_HOSTNAME myppc405ep
#define CONFIG_MYPPC 1
3.2 编译
[root@localhost uboot-ppc]# make myppc405ep_config
ln: creating symbolic link `asm/arch': No such file or directory
错误提示表明mkconfig在创建链接文件时出错。mkconfig要创建的链接文件如下(arm为例):
ln -s asm-arm asm
ln -s arch-s3c24x0 asm-arm/arch
ln -s proc-armv asm-arm/proc
所以要先看看include/asm的情况
[root@localhost uboot-ppc]# ls -l include/asm
lrwxrwxrwx 1 root root 27 Sep 19 12:38 asm -> ../arch/poeerpc/include/asm
在arch目录下只有powerpc目录,显示是有地方把powerpc写成了poeerpc,来找找是那
[root@localhost uboot-ppc]# grep -r poeerpc ./
./boards.cfg:myppc405ep poeerpcppc4xx -amcc
将错误改过之后重新编译
[root@localhost uboot-ppc]# make myppc405ep_config
awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg > .boards.depend
Configuring for myppc405ep board...
[root@localhost uboot-ppc]# make all
…………………………
ppc_4xx-objcopy -O srec u-boot u-boot.srec
ppc_4xx-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
编译成功。
在编译成功后,就可以开始硬件相关代码移植的工作了。