SD卡启动uboot分析和移植(s3cd 6410)

分析:

s3c6410 可以从 NANDFLASH中启动,可以从SD卡中启动

拨码开关IO:

OM[4:0]                      4   3    2    1                      0

IROM启动                 1    1    1     1

GPN[15:13]        IROM启动时的外部存储设备   SD、OneNAND  NAND(数据大小不同的页)    

s3c6410   出厂时会在0x80000000   的IROM   中固化BL0代码     大小为32KB   然后PC指向0X80000000开始执行,因此由IROM中启动

BL0代码中功能有:关闭看门狗,TCM,系统时钟......

外部存储设备的初始化

BL1:(自己编写的代码)重新初始化系统、开辟更广阔的内存空间,同时将BL2拷贝到SDRAM

BL2:(自己移植的代码)拷贝内核、文件系统,从而从SDRAM中启动系统

ok6410   拨码开关      

1      2        3                      4         5          6           7             8

GPN[15:13]                                  OM[4:1]

000                                      1111                                         1                 sd卡中启动uboot

移植:

BL1:把uboot.bin   前8k取出

BL2:剩下的uboot.bin

cd arch/arm/cpu/arm1176/s3c64xx/  vim s3c6410_sdboot.c  中写SD卡启动代码

/*
 *    OK6410 SD  Boot
 *    zhaoyuting
 */
#include <common.h>
#include <asm/io.h>


#ifdef CONFIG_MMC_CHANNEL
#define MMC_CHANNEL          CONFIG_MMC_CHANNEL
#endif


#define globalBlockSizeHide *((volatile unsigned int *)(0x0c004000 - 0x04))
#define globalSDHCInfo      *((volatile unsigned int *)(0x0c004000 - 0x08))


#define LAST_BLKPOS          (globalBlockSizeHide - 2)
#define BLK_SIZE             512
#define BL1_SIZE             (1024*8)
#define BL2_SIZE             (1024*300)


#if 0
#define ENV_SIZE             CONFIG_ENV_SIZE
#else
#define ENV_SIZE             (1024*16)
#endif


#define BL1_BLKCNT           (BL1_SIZE / BLK_SIZE)
#define BL2_BLKCNT           (BL2_SIZE / BLK_SIZE)
#define ENV_BLKCNT           (ENV_SIZE / BLK_SIZE)
#define STARTBLKADDR         (LAST_BLKPOS - BL1_BLKCNT - BL2_BLKCNT - ENV_BLKCNT)
#define DESTADDR             (CONFIG_SYS_PHY_UBOOT_BASE)


#define CopyMMCtoMem(a,b,c,d,e)   (((int(*)(int,uint,ushort,uint *,int))(*((uint *)(0x0c004000 + 0x08))))(a,b,c,d,e))


int BootCopyMMCtoMem()
{
    writel(readl(HM_CONTROL4) | (0x3 << 16), HM_CONTROL4);
    return CopyMMCtoMem(0,STARTBLKADDR,BL2_BLKCNT,(uint *)DESTADDR,0);
}


修改配置:

cd  include/configs vim smdk6410.h   267行添加

/* SD BOOT */
#define CONFIG_BOOT_SD

cd arch/arm/cpu/arm1176/s3c64xx/   vim Makefile  36行添加

COBJS-$(CONFIG_BOOT_SD) += s3c6410_sdboot.o

cd arch/arm/cpu/arm1176/     vim start.S    225行bl      lowlevel_init后添加

#if defined (CONFIG_BOOT_SD)  && !defined(CONFIG_NAND_SPL)
        ldr sp, =CONFIG_SYS_INIT_SP_ADDR
        bl      BootCopyMMCtoMem
        cmp r0, #0
copyerror:
        beq copyerror
        ldr pc, =_main
#else
        bl      _main
#endif


修改脚本(为了确保实现的代码是在BL1,也就是uboot的前8K中)

cd board/samsung/smdk6410/   vim u-boot-nand.lds 

arch/arm/cpu/arm1176/start.o  (.text)后面添加一句
          board/samsung/smdk6410/libsmdk6410.o(.text)

然后make     distclean

        make     smdk6410_config

        make     all

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值