题外话:
Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, UBoot不仅仅支持
嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS
嵌入式操作系统。 UBoot除了支持PowerPC系列的处理器外, 还能支持MIPS、 x86、 ARM、NIOS、
XScale等诸多常用系列的处理器。
uboot的源代码的下载地址是:sourceforge.net/projects/uboot
u-boot的源代码是通过GCC和Makefile组织编译的,顶层目录下的Makefile首先可以设
置开发板的定义,然后递归调用子目录下的Makefile,最后把编译过的目标文件链接成
u-boot映象。
前提:先安装交叉编译器(这里是2.95.3的版本)并且已经加到PATH中
ok,let's begin!
1.下载了uboot的源码,解压到任意目录下,可以看到,有一些子目录,比如board,cpu,common等等。目录结构如下所示
目录 内容
Board 和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目
录中,比如说:SMDK2410,子目录中存放与开发板相关的配置文件.
Common 实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如go命令对
应就是cmd_boot.c
Cpu 与特定CPU架构相关目录, 每一款uboot下支持的CPU在该目录下对应一个子 目录,比如有子目录arm920t等。
Disk 对磁盘的支持
Doc 文档目录。uboot有非常完善的文档,推荐大家参考阅读。
drivers uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、
串口和USB等。
Fs 支持的文件系统,uboot现在支持cramfs、fat、fdos、jffs2和registerfs。
uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件
和对文件系统支持的文件。 该目录下configs目录有与开发板相关的配置头文
include
件,如smdk2410.h。该目录下的asm目录有与CPU体系结构相关的头文件,asm
对应的是asmarm.
lib_xxxx 与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。
Net 与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统
的实现。
Tools Uboot的工具,如:mkimage, crc等等。
最外面的Makefile是一个总的Makefile
打开看一下会发现有行如下面的注释
#========================================================================
# PowerPC
#========================================================================
#########################################################################
## MPC5xx Systems
#########################################################################
这就是make会根据不同的参数调用子目录下的makefile去配置某个特定的板子
2.现在我们要自己在uboot的目录里加一点自己的东西好定制自己的板子)'_'(
先给我们的板子取一个名字,就叫my2410吧
再修改主的makefile,加上自己的配置,可以参照arm已知的配置
my2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t my2410 NULL s3c24x0
各项的意思如下:
arm:CPU的构架(ARCH)
arm920t:CPU的类型(CPU),对应于cpu/arm920t子目录
my2410:开发板的型号(BOARD),对应一会儿要创建的board/my2410 目录
NULL:开发者或经销商(vender)
s3c24x0:片上系统(SOC)
现在在board目录下创建自己的板子目录
tom@tom-ubuntu:~/u-boot$mkdir board/my2410
tom@tom-ubuntu:~/u-boot$ cp board/smdk2410/* board/my2410/ ##直接拿过来用^_~
tom@tom-ubuntu:~/u-boot$ cd board/my2410
tom@tom-ubuntu:~/u-boot/board/my2410$ mv smdk2410.c my2410.c ##名字也改一下,不然通不过编译
在include/configs/中建立配置头文件:
tom@tom-ubuntu:~/u-boot$ cp include/configs/smdk2410.h include/configs/my2410.h
好了,现在就可以编译了
编译之前,先
tom@tom-ubuntu:~/u-boot$ make distclean #做一下清除工作,主要是删除一些链接文件
然后,
tom@tom-ubuntu:~/u-boot$ make my2410_config ##这个my2410_config就是我们自己加到makefile中去的^__^
这时应该出现
Configuring for my2410 board...
表明没问题
tom@tom-ubuntu:~/u-boot$ make
不出意外的话,应该编译通过了
我出现过的
错误一
make[1]: *** 没有规则可以创建“all”需要的目标“hello_world.srec”。 停止。
------------------------------------------------------------------
make[1]: Leaving directory `/home/tom/u-boot-1.1.4/examples'
make: *** [examples] 错误 2
在网上查了查,有人说是make 3.81的一个BUG!
http://blackfin.uclinux.org/gf/project/u-boot/tracker/?action =TrackerItemEdit&tracker_item_id=1324
可以简单的改一个目录examples下的Makefile来解决
修改第58行的
#SREC = hello_world.srec
#BIN = hello_world.bin hello_world
SREC = hello_world.o
BIN = hello_world.o hello_world
错误二:
make[1]: *** 没有规则可以创建“libmy2410.a”需要的目标“smdk2410.o”。 停止。
make[1]: Leaving directory `/home/tom/u-boot-1.1.4/board/my2410'
make: *** [board/my2410/libmy2410.a] 错误 2
解决方法:
修改board/my2410/Makefile
将28行的
OBJS := smdk2410.o flash.o
改为
OBJS := my2410.o flash.o
错误三:
isystem /usr/local/arm/bin/../lib/gcc-lib/arm-linux/3.2/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv4 -mtune=arm7tdmi -msoft-float -mabi=apcs-gnu -Uarm -Wall -Wstrict-prototypes -c -o hello_world.o hello_world.c
cc1: invalid option `abi=apcs-gnu'
出错的文件是/cpu/arm920t/下的config.mk:将
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),)