分析:
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