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

来源:互联网 发布:软件学报 电子版 编辑:程序博客网 时间:2024/04/29 14:28

分析:

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, #0copyerror:        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 0
原创粉丝点击