第一阶段 可启动uboot但是没有nand命令
编译器选择4.3.2
uboot版本为1.3.2
目标平台为:博创up-techSMDK2410
运行make clean
运行 make smdk2410_config
运行 make ARCH=arm
错误:
lib_arm/libarm.a(_udivsi3.o)(.text+0x8c):/root/uboot/u-boot-1.3.2/lib_arm/_udivsi3.S:67: relocation truncated to fit: R_ARM_PLT32 __div0
lib_arm/libarm.a(_umodsi3.o)(.text+0xa8):/root/uboot/u-boot-1.3.2/lib_arm/_umodsi3.S:79: relocation truncated to fit: R_ARM_PLT32 __div0
这是由于编译器版本问题
修改 lib_arm/_udivsi3.S 第67行 bl __div0 (PLT)为bl __div0
修改lib_arm/_umodsi3.S 第79行bl __div0 (PLT)为bl __div0
重新运行:
运行make clean
运行 make smdk2410_config
运行 make ARCH=arm
在board目录下建立开发板目录,my2410,把同目录下SMDK2410中的文件拷贝到自己的目录
在include/configs/中把SMDK2410.h复制一份,并重命名为mySMDK2410.h
在根目录makefile中添加
my2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t my2410 NULL s3c24x0
在cpu/arm92t/start.s中在设置堆栈之前添加(从vivi中拷贝)
#ifdef CONFIG_S3C2410_NAND_BOOT//如果配置了NAND启动
bl copy_myself
@ jump to ram
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
#endif
在设置堆栈之后添加
#ifdef CONFIG_S3C2410_NAND_BOOT
@
@ copy_myself: copy vivi to ram
@
copy_myself:
mov r10, lr
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value//允许nand,初始化ECC,nFCE片选不激活,命令/地址所村时间为0,THRPH0为3,THRPH1为0
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip//清除片选位,激活片选
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]//写命令为全1,strb存储字节数据
mov r3, #0 @ wait
1: add r3, r3, #0x1
cmp r3, #0xa
blt 1b//延时
2: ldr r2, [r1, #oNFSTAT] @ wait ready//读取状态寄存器不等于1重复执行(reday)
tst r2, #0x1
beq 2b
ldr r2, [r1, #oNFCONF]//读取配置寄存器
orr r2, r2, #0x800 @ disable chip//片选非激活
str r2, [r1, #oNFCONF]
@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer//获取栈顶地址
mov fp, #0 @ no previous frame, so fp=0//未找到fp定义出处
@ copy vivi to RAM
ldr r0, =VIVI_RAM_BASE//vivi为SDRAM最后1M空间
mov r1, #0x0
mov r2, #0x20000//128KB
bl nand_read_ll//在nand_read.c中定义
tst r0, #0x0//如果读取正确返回0
beq ok_nand_read
#ifdef CONFIG_DEBUG_LL
bad_nand_read:
ldr r0, STR_FAIL //STR_FAIL为fail的acsii
ldr r1, SerBase//获取UART基址
bl PrintWord
1: b 1b @ infinite loop //读取vivi失败时无限循环
#endif
ok_nand_read:
#ifdef CONFIG_DEBUG_LL
ldr r0, STR_OK
ldr r1, SerBase//获取UART基址
bl PrintWord
#endif
@ verify
mov r0, #0
ldr r1, =0x33f00000
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes//验证前4Kb和SDRAM 63MB地址开始的4KB是否相等
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch//不相等跳转
subs r2, r2, #4
beq done_nand_read
bne go_next
notmatch:
#ifdef CONFIG_DEBUG_LL
sub r0, r0, #4
ldr r1, SerBase
bl PrintHexWord
ldr r0, STR_FAIL
ldr r1, SerBase
bl PrintWord
#endif
1: b 1b
done_nand_read:
#ifdef CONFIG_DEBUG_LL
ldr r0, STR_OK
ldr r1, SerBase
bl PrintWord
#endif
mov pc, r10//返回
@ clear memory
@ r0: start address
@ r1: length
mem_clear:
mov r2, #0
mov r3, r2
mov r4, r2
mov r5, r2
mov r6, r2
mov r7, r2
mov r8, r2
mov r9, r2
clear_loop:
stmia r0!, {r2-r9}
subs r1, r1, #(8 * 4)
bne clear_loop
mov pc, lr
#endif @ CONFIG_S3C2410_NAND_BOOT
在my2410下建立文件nand.c(从vivi中拷贝nand_read.c文件)
修改my2410下makefile添加COBJS := smdk2410.o flash.o nand.o
在include/configs/my2410.h中添加(从vivi smdk2410.h中拷贝)
头部添加#define CONFIG_S3C2410_NAND_BOOT 1开启nand功能
#ifdef CONFIG_S3C2410_NAND_BOOT
#define UBOOT_RAM_BASE 0x33f80000
start.s中VIVI_RAM_BASE该为 UBOOT_RAM_BASE
/* Flash */
#define FLASH_BASE ROM_BASE0
#define FLASH_SIZE SZ_32M
#define FLASH_UNCACHED_BASE 0x10000000 /* to mapping flash memory */
#define FLASH_BUSWIDTH 4
/* ROM */
#define VIVI_ROM_BASE 0x00000000
#define VIVI_PRIV_ROM_BASE 0x01FC0000
#endif /* CONFIG_S3C2410_NAND_BOOT */
这是从vivi S3c2410.h中拷贝的
/*
* NAND Flash Controller (Page 6-1 ~ 6-8)
*
* Register
NFCONF NAND Flash Configuration [word, R/W, 0x00000000]
NFCMD NAND Flash Command Set [word, R/W, 0x00000000]
NFADDR NAND Flash Address Set [word, R/W, 0x00000000]
NFDATA NAND Flash Data [word, R/W, 0x00000000]
NFSTAT NAND Flash Status [word, R, 0x00000000]
NFECC NAND Flash ECC [3 bytes, R, 0x00000000]
*
*/
#define bNAND_CTL(Nb) __REG(0x4e000000 + (Nb))
#define NFCONF bNAND_CTL(0x00)
#define NFCMD bNAND_CTL(0x04)
#define NFADDR bNAND_CTL(0x08)
#define NFDATA bNAND_CTL(0x0c)
#define NFSTAT bNAND_CTL(0x10)
#define NFECC bNAND_CTL(0x14)
#define fNFCONF_TWRPH1 Fld(3,0)
#define NFCONF_TWRPH1 FMsk(fNFCONF_TWRPH1)
#define NFCONF_TWRPH1_0 FInsrt(0x0, fNFCONF_TWRPH1) /* 0 */
#define fNFCONF_TWRPH0 Fld(3,4)
#define NFCONF_TWRPH0 FMsk(fNFCONF_TWRPH0)
#define NFCONF_TWRPH0_3 FInsrt(0x3, fNFCONF_TWRPH0) /* 3 */
#define fNFCONF_TACLS Fld(3,8)
#define NFCONF_TACLS FMsk(fNFCONF_TACLS)
#define NFCONF_TACLS_0 FInsrt(0x0, fNFCONF_TACLS) /* 0 */
#define fNFCONF_nFCE Fld(1,11)
#define NFCONF_nFCE FMsk(fNFCONF_nFCE)
#define NFCONF_nFCE_LOW FInsrt(0x0, fNFCONF_nFCE) /* active */
#define NFCONF_nFCE_HIGH FInsrt(0x1, fNFCONF_nFCE) /* inactive */
#define fNFCONF_ECC Fld(1,12)
#define NFCONF_ECC FMsk(fNFCONF_ECC)
#define NFCONF_ECC_NINIT FInsrt(0x0, fNFCONF_ECC) /* not initialize */
#define NFCONF_ECC_INIT FInsrt(0x1, fNFCONF_ECC) /* initialize */
#define fNFCONF_ADDRSTEP Fld(1,13) /* Addressing Step */
#define NFCONF_ADDRSTEP FMsk(fNFCONF_ADDRSTEP)
#define fNFCONF_PAGESIZE Fld(1,14)
#define NFCONF_PAGESIZE FMsk(fNFCONF_PAGESIZE)
#define NFCONF_PAGESIZE_256 FInsrt(0x0, fNFCONF_PAGESIZE) /* 256 bytes */
#define NFCONF_PAGESIZE_512 FInsrt(0x1, fNFCONF_PAGESIZE) /* 512 bytes */
#define fNFCONF_FCTRL Fld(1,15) /* Flash controller enable/disable */
#define NFCONF_FCTRL FMsk(fNFCONF_FCTRL)
#define NFCONF_FCTRL_DIS FInsrt(0x0, fNFCONF_FCTRL) /* Disable */
#define NFCONF_FCTRL_EN FInsrt(0x1, fNFCONF_FCTRL) /* Enable */
#define NFSTAT_RnB (1 << 0)
#define NFSTAT_nFWE (1 << 8)
#define NFSTAT_nFRE (1 << 9)
#define NFSTAT_ALE (1 << 10)
#define NFSTAT_CLE (1 << 11)
#define NFSTAT_AUTOBOOT (1 << 15)
在my2410.h
在my2410.h中添加
/* NAND Flash Controller */
#define NAND_CTL_BASE 0x4E000000
#define bINT_CTL(Nb) __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFADDR 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
start.s中
复制nand代码域中修改为
ldr sp, _TEXT_BASE @ setup stack pointer//获取栈顶地址
注释s3c24x0.h中因为前面也加了,会出现重复定义
/* NAND FLASH (see S3C2410 manual chapter 6) */
//typedef struct {
//S3C24X0_REG32 NFCONF;
//S3C24X0_REG32 NFCMD;
//S3C24X0_REG32 NFADDR;
//S3C24X0_REG32 NFDATA;
//S3C24X0_REG32 NFSTAT;
//S3C24X0_REG32 NFECC;
} /*__attribute__((__packed__))*/ S3C2410_NAND;
注释s3c2410.h中代码
//static inline S3C2410_NAND * S3C2410_GetBase_NAND(void)
//{
// return (S3C2410_NAND * const)S3C2410_NAND_BASE;
//}
修改start.s
ldr sp, _TEXT_BASE @ setup stack pointer//获取栈顶地址,63.5M处
修改my2410.h
#define UBOOT_RAM_BASE 0x33F00000 //63MB空间开始处
地址空间分配
uboot代码区:63.5M之后 在config.mk中定义
堆栈区:63M—63.5M
因为误改了初始化堆栈的代码所以一直出错
同时uboot存放位置也一直出错。