1广州广嵌电子科技有限公司移植实验u-boot简介u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,u-boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系统。u-boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。u-bootu-bootu-bootu-boot源码目录介绍目录内容board和一些已有开发板有关的文件.每一个开发板都以一个子目录出现在当前目录中,比如说:SMDK2410,子目录中存放与开发板相关的配置文件.common实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如go命令对应就是cmd_boot.ccpu与特定CPU架构相关目录,每一款uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。disk对磁盘的支持doc文档目录。uboot有非常完善的文档,推荐大家参考阅读。driversuboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。fs支持的文件系统,uboot现在支持cramfs、fat、fdos、jffs2和registerfs。includeuboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下configs目录有与开发板相关的配置头文件,如smdk2410.h。该目录下的asm目录有与CPU体系结构相关的头文件,asm对应的是asmarm.lib_xxxx与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。net与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。toolsuboot的工具,如:mkimage,crc等等。u-boot的启动过程启动流程我们一般把bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。阶段1,汇编代码,对于s3c2440是cpu/arm920t/start.s文件。主要流程如下:设置CPU的模式为SVC模式关闭看门狗禁掉所有中断设置以CPU的频率把自己拷贝到RAM2广州广嵌电子科技有限公司语言代码,在lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数。这个函数调用一系列的初始化函数,然后进入主UBOOT命令行,进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作,如下图所示。当用户输入启动linux的命令的时候,u-boot会将kernel映像(zImage)和从nandflash上读到RAM空间中,为内核设置启动参数,调用内核,从而启动linux。3广州广嵌电子科技有限公司的两大功能:1是下载功能,既通过网口、串口或者USB口下载文件到RAM中。2是对flash芯片的读写功能。u-boot对S3C2440已经有了很好的支持,在移植过程中主要是完善u-boot对nandflash的读写功能。u-boot移植前的准备工作1.下载源码Uboot的源码可以从以下网址下载:=1134752480&big_mirror=0我们这里下载的是u-boot-2009.11.tar.bz2工具链使用cross-4.1.22.建立工作目录:#vimkdir/root/build_uboot#vicd/root/build_uboot把下载的源码拷贝到该目录,解压;#vitarjxvfu-boot-2009.11.tar.bz2#vimvu-boot-2009.11u-boot3.确定分区:0x04000000-------0x00340000-------0x00040000-------0x00030000-------0x00000000_______我们可以根据以上的分区信息来配置我们的系统.rootfskernel参数u-boot4广州广嵌电子科技有限公司移植的具体步骤((((详细记录))))1111、修改顶层Makefile(viMakefile(viMakefile(viMakefile(viMakefile)Makefile)Makefile)Makefile)1)、创建目标板信息在smdk2410_config:unconfig@$(MKCONFIG)$(@:_config=)armarm920tsmdk2410NULLs3c24x0后面添加gec2440_config:unconfig@$(MKCONFIG)$(@:_config=)armarm920tgec2440samsungs3c24x0各项的意思如下:arm:CPU的架构(ARCH)arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录。gec2440:开发板的型号(BOARD),对应于board/gec2440目录。samsung:开发者/或经销商(vender)。s3c24x0:片上系统(SOC)。板子起名叫gec2440,可以依自己的喜好修改2)、修改Makefile规则将:__LIBS:=$(subst$(obj),,$(LIBS))$(subst$(obj),,$(LIBBOARD))改为:__LIBS:=$(subst$(obj),,$(LIBBOARD))$(subst$(obj),,$(LIBS))2222、建立主代码与测试1)、复制board/samsung/smdk2410目录为board/samsung/gec2440:#cp–arfboard/samsung/smdk2410/board/samsung/gec2440/并修改该目录下的Makefile(viboard/samsung/gec2440/Makefile):COBJS:=smdk2410.oflash.o修改为:COBJS:=gec2440.oflash.o并将复制后目录下的smdk2410.c改名为gec2440.c:#mvboard/samsung/gec2440/smdk2410.cboard/samsung/gec2440/gec2440.c2)、复制include/configs/smdk2410.h为include/configs/gec2440.h#cpinclude/configs/smdk2410.hinclude/configs/gec2440.h3)、测试是否能配置和编译成功#makegec2440_config#make编译完成时最后两句如下:arm-linux-objcopy-Osrecu-bootu-boot.srecarm-linux-objcopy--gap-fill=0xff-Obinaryu-bootu-boot.bin表示编译成功。5广州广嵌电子科技有限公司、初始化stage1stage1stage1stage1阶段的硬件设备1)、修改cpu/arm920t/start.S:在start_code函数中:修改blcoloured_LED_initblred_LED_on如下//这两行是AT91RM9200DK开发板的LED初始化和控制函数,注释//blcoloured_LED_init//blred_LED_on添加下面的代码,以取代上面功能:#ifdefined(CONFIG_S3C2440)//区别与其他开发板#defineGPBCON0x56000010#defineGPBDAT0x56000014#defineGPBUP0x56000018ldrr0,=GPBUPldrr1,=0xffstrr1,[r0]ldrr0,=GPBCONldrr1,=0x557ffstrr1,[r0]ldrr0,=GPBDATldrr1,=0x7dfstrr1,[r0]#endif2)、在include/configs/gec2440.h头文件中添加CONFIG_S3C2440宏(红色一行)#defineCONFIG_ARM920T1/*ThisisanARM920TCore*/#defineCONFIG_S3C24101/*inaSAMSUNGS3C2410SoC*/#defineCONFIG_SMDK24101/*onaSAMSUNGSMDK2410Board*/#defineCONFIG_S3C24401/*inaSAMSUNGS3C2440SoC*/4444、修改时钟因为S3C2410与S3C2440的时钟及Nand、SDRAM等配置不同,故接下来需要进行修改相关配置。1)、修改cpu/arm920t/start.S:#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)/*turnoffthewatchdog*/#ifdefined(CONFIG_S3C2400)#definepWTCON0x15300000#defineINTMSK0x14400008/*Interupt-Controllerbaseaddresses*/#defineCLKDIVN0x14800014/*clockdivisorregister*/#else//下面2410和2440的寄存器地址是一致的#definepWTCON0x530000006广州广嵌电子科技有限公司*Interupt-Controllerbaseaddresses*/#defineINTSUBMSK0x4A00001C#defineCLKDIVN0x4C000014/*clockdivisorregister*/#endifldrr0,=pWTCONmovr1,#0x0strr1,[r0]/**maskallIRQsbysettingallbitsintheINTMR-default*/movr1,#0xffffffffldrr0,=INTMSKstrr1,[r0]#ifdefined(CONFIG_S3C2410)ldrr1,=0x7ff//0x3ff,根据2410芯片手册,INTSUBMSK有11位可用,vivi也是0x7ff,u-boot则是0x3ff,不过芯片复位后所有中断都被屏蔽,故这无影响ldrr0,=INTSUBMSKstrr1,[r0]#endif#ifdefined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分ldrr1,=0x7fff//根据2440芯片手册,INTSUBMSK寄存器有15位可用ldrr0,=INTSUBMSKstrr1,[r0]#endif#ifdefined(CONFIG_S3C2440)//添加s3c2440的时钟部分#defineMPLLCON0x4C000004//系统主频配置寄存器基地址#define