uboot1.3.2移植记录1

第一阶段  可启动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存放位置也一直出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值