网上找到的,基于GNU精神,免费共享下载。基于OK-2440III的u-boot移植(一)u-boot的工作过程与硬件关系密切,所以在移植时必须对S3C2440等芯片手册和开发板的硬件有一定的了解。其工作流程主要分为两个部分涉及两个主要的文件:cpu/arm920t/start.S和lib_arm/board.c,先从前面的汇编程序中执行,再跳到后面的C程序中。移植思路参考网上友友分为六个步骤:(1)建立好开发板相关的文件,并利用交叉编译器编译生成bin文件用于下载到开发板中运行;(2)修改相关硬件配置,让uboot能在sdram中运行调试;(3)修改norflash相关配置,让uboot在norflash中启动运行;(4)修改nandflash相关配置,让uboot在nandflash中启动运行;(5)增加uboot的功能,如网络、USB等;(6)引导Linux系统启动。一.移植环境目标板:飞凌的ok-2440III开发板(ARM9)芯片型号:三星的S3C2440Uboot版本:u-boot-2009.08宿主机:RedHatLinuxAS5交叉编译器:arm-linux-gcc-4.3.2二.编译1.建立板级文件夹:(1)在board/samsung目录下新建文件夹ok2440,找到相似的板级文件夹smdk2410,并把该文件夹中的所有文件拷贝到ok2440下;(2)到ok2440目录下,把文件smdk2410.c重命名为ok2440.c;修改该目录下Makefile中的目标(COBJS),把smdk2410.o改为ok2440.o;2.建立芯片级文件夹:直接用cpu/arm920t芯片文件夹,不做修改;3.建立配置文件:到include/configs目录下,找到相似的配置文件smdk2410.h,将其拷贝并重命名为ok2440.h;4.建立编译规则:在根目录下的Makefile中找到ARM体系架构中smdk2410的编译规则smdk2410_config:unconfig@$(MKCONFIG)$(@:_config=)armarm920tsmdk2410samsungs3c24x0在此处添加ok2440的编译规则ok2440_config:unconfig@$(MKCONFIG)$(@:_config=)armarm920tok2440samsungs3c24x0(注意Makefile中命令行要以tab键开头)5.在宿主机linux环境下编译:在终端进入uboot的根目录下执行两条命令:#makeok2440_config#make(注:执行make命令时,前提是在linux下arm-linux-gcc-4.3.2的安装目录设为PATH环境变量,即交叉工具arm-linux-命令的版本是4.3.2或者执行:#makeCROSS_COMPILE=(arm-linux-的安装目录))(6.由上面编译生成在根目录下的u-boot.bin就可以下载到开发板中,不过还需修改配置才能运行)基于OK-2440III的u-boot移植(二)三、在SDRAM中调试运行(在基于OK-2440III的u-boot移植(一)编译通过后修改一下内容)(注:此移植过程中没有新添加S3C2440的编译条件,都是用原来S3C2410的编译条件)1.下载到内存中调试时不进行底层初始化、不进行uboot代码拷贝,所以在配置文件include/configs/ok2440.h中加入两句:#defineCONFIG_SKIP_LOWLEVEL_INIT1#defineCONFIG_SKIP_RELOCATE_UBOOT12.修改cpu/arm920t/start.S相关部分:(1).在定义S3C2410的寄存器地址处添加以下寄存器的定义:#defineLOCKTIME0x4C000000#defineMPLLCON0x4C000004#defineUPLLCON0x4C000008#defineCAMDIVN0x4C000018(2).修改屏蔽中断的位数,如下:#ifdefined(CONFIG_S3C2410)ldrr1,=0x7fffldrr0,=INTSUBMSKstrr1,[r0]#endif(3).在中断屏蔽完成后添加下面两个寄存器的配置:ldrr0,=LOCKTIMEmovr1,#0xffffffstrr1,[r0]ldrr0,=CAMDIVNmovr1,#0strr1,[r0](4).修改时钟分配比初始化:/*FCLK:HCLK:PCLK=1:4:8*/ldrr0,=CLKDIVNmovr1,#5strr1,[r0]//以下部分是新添加的//在2440的手册中指出若HDIVN不为0,则需要添加下面三句:mrcp15,0,r1,c1,c0,0orrr1,r1,#0xc0000000mcrp15,0,r1,c1,c0,0//USB时钟48MHzldrr0,=UPLLCONldrr1,=0x00038022strr1,[r0]//arm920t为5级流水线,延迟几个周期,使指令生效nopnopnopnopnopnopnopnop//写MPLL使pll生效,405MHzldrr0,=MPLLCONldrr1,=0x0007f021strr1,[r0]3.修改board/samsung/ok2440/ok2440.c文件中的时钟部分,如下所示:#elifFCLK_SPEED==1/*Fout=405MHz,FCLK:HCLK:PCLK=1:4:8*/#defineM_MDIV0x7f#defineM_PDIV0x2#defineM_SDIV0x14.修改cpu/arm920t/s3c24x0/speed.c相关部分:(1).修改FCLK的计算公式:把下面的部分:m=((r&0xFF000)12)+8;p=((r&0x003F0)4)+2;s=r&0x3;return((CONFIG_SYS_CLK_FREQ*m)/(ps));替换为:m=((r&0xFF000)12)+8;p=((r&0x003F0)4)+2;s=r&0x3;if(pllreg==MPLL)return((CONFIG_SYS_CLK_FREQ*m*2)/(ps));elsereturn((CONFIG_SYS_CLK_FREQ*m)/(ps));(2).修改get_HCLK函数:/*returnHCLKfrequency*/ulongget_HCLK(void){S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();//return((clk_power-CLKDIVN&0x2)?get_FCLK()/2:get_FCLK());return(get_FCLK()/4);//这里修改的只能用于s3c2440,1:4:8!!!}5.在linux环境下再次编译,下载到内存中就可以运行,终端串口输出信息!基于OK-2440III的u-boot移植(三)四.在NorFlash中调试运行(在基于OK-2440III的u-boot移植(二)在内存中运行通过后修改一下内容)注:ok2440III开发板的norflash是Intel的JS28F320(4MB)(1device=32blocks,1block=128MB)1.修改norflash的配置,在include/configs/ok2440.h中关于flash的配置部分都删掉,换成下面的配置:/*-----------------------------------------------------------------------*PhysicalMemoryMap*/#defineCONFIG_NR_DRAM_BANKS1/*wehave1bankofDRAM*/#definePHYS_SDRAM_10x30000000/*SDRAMBank#1*/#definePHYS_SDRAM_1_SIZE0x04000000/*64MB*/#definePHYS_FLASH_10x00000000/*FlashBank#1*/#defineCONFIG_SYS_FLASH_BASEPHYS_FLASH_1#defineCONFIG_SYS_MONITOR_BASETEXT_BASE#defineFLASH_BASE0_PRELIMPHYS_FLASH_1/*------------------------------------------------------------*FLASHandenvironmentorganization*/#defineCONFIG_SYS_FLASH_PROTECTION1#defineCONFIG_SYS_MAX_FLASH_BANKS1/*maxnumberofmemorybanks*/#defineCONFIG_SYS_FLASH_SIZE0x00400000/*4MB*/#defineCONFIG_SYS_MAX_FLASH_SECT32/*maxnumberofsectorsononechip*//*timeoutvaluesareinticks*/#defineCONFIG_SYS_FLASH_ERASE_TOUT(2*CONFIG_SYS_HZ)/*TimeoutforFlashErase*/#defineCONFIG_SYS_FLASH_WRITE_TOUT(2*CONFIG_SYS_HZ)/*TimeoutforFlashWrite*/#defineCONFIG_ENV_IS_IN_FLASH1#defineCONFIG_ENV_SIZE0x20000/*128KB*/#defineCONFIG_ENV_OFFSET0x400002.下载到norflash中运行时需要进行底层初始化,所以要删除之前在配置文件include/configs/ok2440.h中加入的两句://#defineCONFIG_SKIP_LOWLEVEL_INIT1//#defineCONFIG_SKIP_RELOCATE_UBOOT13.修改board/samsung/ok2440/lowlevel_init.S文件中SDARM刷新参数为:#defineREFCNT1258/*period=7.8125us,HCLK=405/4Mhz,(2048+1-7.8125*405/4)*/4.修改flash型号相关文件:(1).用board/cmi/flash.c文件替换board/samsung/ok2440/flash.c文件,使uboot支持Intel的JS28F320型号nor;(2).修改board/samsung/ok2440/flash.c中函数申明:staticulongflash_get_size(vu_short*addr,flash_info_t*info);//staticintwrite_short(flash_info_t*info,ulongdest,ushortdata);staticintwrite_word(flash_info_t*info,ulongdest,ushortdata);staticvoidflash_get_offsets(ulongbase,flash_info_t*info);(3).删除board/samsung/ok2440/flash.c中write_buff和write_short两个函数,用下面两个函数代替:intwrite_buff(flash_info_t*info,uchar*src,ulongaddr,ulongcnt){ulongcp,wp;ushortdata;intl;inti,rc;wp=(addr&~1);/*getlowerwordalignedaddress*//**handleunalignedstartbyt