1.1 U-Boot的介绍
U-Boot是德国DENX小组的开发用于多种嵌入式CPU的BootLoader程序, U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持VxWorks, QNX,ARTOS, LynxOS等嵌入式操作系统。U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。U-Boot源代码在sourceforge网站的社区服务器中,它的项目主页是::URL::http://sourceforge.net/projects/u-boot
U-Boot的最新版本源代码可以在Sourceforge的CVS服务器中匿名获得。1) 目录树
u-boot/dtt
u-boot/net
u-boot/rtc
u-boot/disk
u-boot/post
u-boot/board
u-boot/tools
u-boot/drivers
u-boot/lib_arm
u-boot/lib_ppc
u-boot/lib_microblaze
u-boot/lib_generic
u-boot/common
u-boot/lib_i386
u-boot/lib_m68k
u-boot/lib_mips
u-boot/lib_nios
u-boot/examples
u-boot/include
u-boot/lib_nios2
2) 简单讲解各目录
2 board:和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目录中如:board/ge9008子目录中存放与我们开发板相关的配置文件.
common:实现U-Boot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令
2 对应就是cmd_bootm.c。
2 cpu:与特定CPU架构相关目录,每一款U-Boot下支持的CPU在该目录下对应一个子目录,比如有子目录cpu/arm720就是我们开发板上使用的CPU架构目录,当然我们也可以自己建立关于arm7tdmi的子目录。
2 disk:对磁盘的支持,这里对于我们可以暂时不用管这个目录。
2 doc:文档目录。U-Boot有非常完善的文档,在移植或使用U-Boot,有必要对其进行解读。
2 drivers:U-Boot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。
2 fs: 支持的文件系统,U-Boot现在支持cramfs、fat、fdos、jffs2和registerfs等。
2 include:U-Boot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下configs目录有与开发板相关的配置头文件,如ge9008.h。该目录下的有与CPU体系结构相关的头文件及各平台的寄存器定义,arm对应的是asm-arm.
2 lib_xxx: 与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。
2 net:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
2 tools:生成U-Boot的工具,如:mkimage, crc等。
1. PORTING U-BOOT
关于开发环境的建立及U-Boot移植的准备,请见文档《Linux开发环境的建立》,在这里就不再累述,我们重点分析如何U-Boot移植中对相关文件的修改。
2.1 u-boot/Makefile文件的修改
首先有关GE9008的我们暂时定义:
cpu: arm7tdmi(直接用arm720)
board: ge9008
修改根目录下的Makefile使之支持相应的硬件平台,基本上所有的configuration都是类似于这样的模式:
_config : unconfig
@./mkconfig $(@:_config=)
对于GE9008,我们可以这样来添加一段代码:
ge9008_config : unconfig
@./mkconfig $(@:_config=) arm arm720 ge9008
2.2支持ARM7TDMI的修改(u-boot/cpu)
在u-boot/cpu目录下建立arm7dtmi的目录或者直接用arm720目录都可以。在这里我们直接用已经建立好的arm720目录:
u config.mk:该文件是本目录Makefile文件所需的编译配置。直接copy即可。
u Makefile:只需要添加要编译的项,其他都不动。
u cpu.c:本文件是cpu的初始化代码。和具体硬件平台关系不大,只需要关注的是它和哪个arm核相关,它包括读写control register, reset cpu, I/D cache enable/disable, Setup the stacks for IRQ and FIQ等,具体我们可以见u-bootGE代码。
#include
#include
int cpu_init (void)
{
/*
* setup up stacks if necessary
*/
#ifdef CONFIG_USE_IRQ
DECLARE_GLOBAL_DATA_PTR;
IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4;
FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;
#endif
return 0;
}
int cleanup_before_linux (void)
{
/*
* this function is called just before we call linux
* it prepares the processor for linux
*
* we turn off caches etc ...
*/
disable_interrupts ();
/* Since the CT has unknown processor we do not support
* cache operations
*/
return (0);
}
int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
extern void reset_cpu (ulong addr);
disable_interrupts ();
reset_cpu (0);
/*NOTREACHED*/
return (0);
}
/* May not be cached processor on the CT - do nothing */
void icache_enable (void)
{
}
void icache_disable (void)
{
}
/* return "disabled" */
int icache_status (void)
{
return 0;
}