当前位置:文档之家› uboot移植步骤介绍

uboot移植步骤介绍

uboot移植过程1.修改Makefile首先给要建立的S3C2410开发板取名为TE2410, 移植uboot时以smdk2410为模板,修改Makefile#tar xvjf u-boot-1.1.3.tar.bz2#cd u-boot-1.1.3#vi Makefilescb9328_config : unconfig@./mkconfig $(@:_config=) arm arm920t scb9328 NULL imxsmdk2400_config : unconfig@./mkconfig $(@:_config=) arm arm920t smdk2400 NULL s3c24x0smdk2410_config : unconfig@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0SX1_config : unconfig@./mkconfig $(@:_config=) arm arm925t sx1te2410_config : unconfig@./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0蓝色字体是添加的内容。

其中,te2410_config : unconfig意思是为TE2410建立一个编译项,@./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0中的arm表示CPU的架构是基于ARM体系结构的;arm920t表示CPU类型是arm920t;te2410是开发板的型号;NULL表示开发商或经销商的名称为空;s3c24x0表示是基于s3c24x0的片上系统。

2.在uboot的board目录下建立te2410开发板子目录#cp –fr board/smdk2410 /board/te2410#cd board/te2410#mv smdk2410.c te2410.c还要修改board/te2410/Makefile文件,OBJS := smdk2410.o flash.o -------- OBJS := te2410.o flash.o3.在include/configs目录下建立te2410.h头文件#cd include/configs#cp –fr smdk2410.h te2410.h4.指定交叉编译器的路径选择支持softfloatpoint的交叉编译器,在etc/bashrc文件中添加一行exportPATH=/home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linu x-gnu/bin:$PATH其中,/home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu /bin是交叉编译器路径修改Makefile中的交叉编译器ifeq ($(ARCH),arm)CROSS_COMPILE = arm-softfloat-linux-gnu-Endif5.测试编译#cd u-boot-1.1.3#make te2410_config#make如果编译正确,将会在u-boot-1.1.3目录下生成u-boot、u-boot.bin、u-boot.srec 三个文件,其中u-boot是ELF格式二进制的image文件,u-boot.bin是原始的二进制image文件,u-boot.srec是Motorola S-Record格式的image文件。

接下来的工作就是根据开发板的硬件配置来修改。

6.修改start.S文件首先在ldr pc, _start_armboot一行之前添加如下代码,将程序从Flash复制到DRAM中运行#ifdef CONFIG_S3C2410_NAND_BOOTbl copy_myself@jump to ramldr r1, =on_the_ramadd pc, r1, #0nopnop1:b 1b @infinite loopon_the_ram:#endif然后在_start_armboot: .word start_armboot一行之后添加下面内容#ifdef CONFIG_S3C2410_NAND_BOOTcopy_myself:mov r10, lr@reset NANDmov r1, #NAND_CTL_BASEldr r2, =0xF830 @initial valuestr r2, [r1, #oNFCONF]ldr r2, [r1, #oNFCONF]bic r2, r2, #0x800 @enable chipstr r2, [r1, #oNFCONF]mov r2, #0xFF @reset commandstrb r2, [r1, #oNFCMD]mov r3, #0 @wait1:add r3, r3, #0x1cmp r3, #0xablt 1b2:ldr r2, [r1,#oNFSTAT] @wait readytst r2, #0x01beq 2bldr r2, [r1, #oNFCONF]orr r2, r2, #0x800 @disable chipstr r2, [r1, #oNFCONF]@get ready to call C functions(for nand_read())ldr sp, DW_STACK_START @setup stack pointermov fp, #0 @no previous frame,so fp=0@copy uboot to ramldr r0, =UBOOT_RAM_BASEmov r1, #0mov r2, #0x30000bl nand_read_lltst r0, #0x0beq ok_nand_read#ifdef CONFIG_DEBUG_LLbad_nand_read:ldr r0, STR_FAILldr r1, SerBasebl PrintWord1:b 1b @infinite loop#endifok_nand_read:#ifdef CONFIG_DEBUG_LLldr r0, STR_OKldr r1, SerBasebl PrintWord#endif@verifym ov r0, #0l dr r1, =UBOOT_RAM_BASEm ov r2, #0x400go_next:l dr r3, [r0], #4l dr r4, [r1], #4t eq r3, r4b ne notmatchs ubs r2, r2, #4b eq done_nand_readb ne go_nextnotmatch:#ifdef CONFIG_DEBUG_LL ldr r0, STR_FAILldr r1, SerBasebl PrintWord#endif1: b 1bdone_nand_read:#ifdef CONFIG_DEBUG_LL ldr r0, STR_OKldr r1, SerBasebl PrintWord#endifm ov pc, r10@ clear memory@ r0:start address@ r1:lengthmem_clear:mov r2, #0mov r3, r2mov r4, r2mov r5, r2mov r6, r2mov r7, r2mov r8, r2mov r9, r2clear_loop:stmia r0!,{r2-r9}subs r1, r1, #(8*4)bne clear_loopmov pc, lr#endif /*CONFIG_S3C2410_NAND_BOOT*/在start.S文件最后添加下面几行的内容,用于定义栈地址变量#ifdef CONFIG_S3C2410_NAND_BOOT.align 2DW_STACK_START:.word STACK_BASE+STACK_SIZE-4#endif7.添加nand_read.c和nandflash.h源文件在start.S中调用了nand_read_ll函数,该函数用于NAND Flash读操作,在board/te2410目录下新建nand_read.c源文件,文件内容如下:#include<config.h>#define __REGb(x) (*(volatile unsigned char *)(x))#define __REGi(x) (*(volatile unsigned int *)(x))#define NF_BASE 0x4e000000#define NFCONF __REGi(NF_BASE+0x0)#define NFCMD __REGb(NF_BASE+0x4)#define NFADDR __REGb(NF_BASE+0x8)#define NFDATA __REGb(NF_BASE+0xc)#define NFSTAT __REGb(NF_BASE+0x10)#define BUSY 1inline void wait_idle(void){int i;while(!(NFSTAT & BUSY))for(i=0;i<10;i++);}#define NAND_SECTOR_SIZE 512#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE-1)/*low level nand read function*/int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) {int i,j;if ((start_addr & NAND_BLOCK_MASK)||(size & NAND_BLOCK_MASK)){return -1; /*invalid alignment*/}/*chip enable*/NFCONF &= ~0x800;for(i=0; i<10; i++);for(i=start_addr; i<(start_addr+size);){/*Read0*/NFCMD = 0;/*Write Address*/NFADDR = i& 0xFF;NFADDR = (i>>9) & 0xFF;NFADDR = (i>>17) & 0xFF;NFADDR = (i>>25) & 0xFF;wait_idle();for(j=0; j<NAND_SECTOR_SIZE; j++, i++){*buf = (NFDATA & 0xFF);buf++;}}/*chip disable*/NFCONF |= 0x800;return 0;}修改board/te2410目录下的Makefile文件OBJS := te2410.o flash.o 改为 OBJS := te2410.o flash.o nand_read.o 在board/te2410目录下添加nandflash.h文件,该文件主要定义了NAND Flash的一些芯片配置函数,代码如下:#include<s3c2410.h>#if (CONFIG_COMMANDS & CFG_CMD_NAND)typedef enum{NFCE_LOW,NFCE_HIGH}NFCE_STATE;static inline void NF_Conf(u16 conf ){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFCONF = conf;}static inline void NF_Cmd(u8 cmd){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFCMD = cmd;}static inline void NF_CmdW(u8 cmd){NF_Cmd(cmd);udelay(1);}static inline void NF_Addr(u8 addr){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFADDR = addr;}static inline void NF_SetCE(NFCE_STATE s){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();switch(s){case NFCE_LOW:nand->NFCONF &= ~(1<<11);break;case NFCE_HIGH:nand->NFCONF |= (1<<11);break;}}static inline void NF_WaitRB(void){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();while( !(nand->NFSTAT & (1<<0)) );}static inline void NF_Write(u8 data){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFDATA = data;}static inline u8 NF_Read(void){S3C2410_NAND *const nand = S3C2410_GetBase_NAND();return (nand->NFDATA);}static inline void NF_Init_ECC(void){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFCONF |= (1<<12);}static inline u32 NF_Read_ECC(void){S3C2410_NAND *const nand = S3C2410_GetBase_NAND();return (nand->NFECC);}#endif8.修改te2410文件修改这个文件的目的有两个,一是初始化CPU相关的寄存器来支持USB主从设备,二是初始化NAND Flash设备。

相关主题