u-boot 2013.04-rc1移植(6)

NAND Flash启动

s3c6410支持SD卡、nand flash启动。两者的启动原理都是一样。IC上电,先判断是SD卡启动还是nand flash启动,然后IROM将会从对应存储设备(SD、nand)中复制8K代码加载到SRAM中运行,之后搬运完整的uboot代码到RAM中,从而实现boot启动!
SD卡启动,可以用PC软件对SD卡进行烧写u-boot.bin,而NAND则不然,这就需要借助SD卡为桥梁,将u-boot写入其中。

u-boot将这种启动方式称之为nand-spl启动,启动原理如下:

1、打开宏#define CONFIG_BOOT_NAND,将make生成的u-boot-nand.bin复制SD卡中
2、打开宏#define CONFIG_BOOT_SD,将生成的u-boot.bin烧写至SD卡
3、先用SD卡启动uboot,
4、启动后自动执行烧写nand命令,将u-boot-nand.bin加载到DRAM中,然后写入nand flash中
5、此时nand falsh中已经存在u-boot-nand.bin
6、boot开关切换至nand启动方式,就可以直接通过nand进行启动

1、修改/home/eric/Documents/u-boot-2013.04-rc1/nand_spl/board/samsung/smdk6410
36行:修改源码bug,再将4096修改成8192(6410 8KSRAM)

PAD_TO  := $(shell expr $(CONFIG_SYS_TEXT_BASE) + 8192)      #PAD_TO := $(shell expr $$[$(CONFIG_SYS_TEXT_BASE) + 4096])

用ls -l命令查看u-boot-spl-16k.bin的大小
修改之前:u-boot-spl-16k.bin大小2828

eric@eric-PC:~/Documents/u-boot-2013.04-rc1/nand_spl$ ls -l
总用量 152
-rwxr-xr-x 1 eric eric   2828 1111 14:26 u-boot-spl-16k.bin
-rwxr-xr-x 1 eric eric   2828 1111 14:26 u-boot-spl.bin

修改之后:u-boot-spl-16k.bin大小8192,正好8K(注意,并不是16K)

eric@eric-PC:~/Documents/u-boot-2013.04-rc1/nand_spl$ ls -l
总用量 152
-rwxr-xr-x 1 eric eric   8192 1111 14:33 u-boot-spl-16k.bin
-rwxr-xr-x 1 eric eric   2828 1111 14:33 u-boot-spl.bin

u-boot.bin 和 u-boot-nand.bin 刚好相差8192=8K ,
即:u-boot-nand.bin = u-boot.bin+u-boot-spl-16k.bin

-rw-r--r--   1 eric eric  270588 1111 14:33 u-boot.bin
-rw-r--r--   1 eric eric  278780 1111 14:33 u-boot-nand.bin

由此就可以猜测,从nand启动的时候,先将8K的u-boot-spl-16k.bin加载到SRAM中运行,之后再将u-boot.bin复制到RAM中。而u-boot-nand.bin正是要烧写到nand flash中的文件!事实也正是如此。

2、修改/home/eric/Documents/u-boot-2013.04-rc1/arch/arm/lib/crt0.s
102行:

#if defined(CONFIG_NAND_SPL)
    /* deprecated, use instead CONFIG_SPL_BUILD */
    ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)

    //eric++ 2017-11-11
        bbs_clean:
            cmp     r0, r1
            strlo   r2, [r0]
            addlo   r0, r0, #4
            blo     bbs_clean
            ldr     pc, =nand_boot
    //eric++ end

#elif defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
    ldr sp, =(CONFIG_SPL_STACK)
#else
    ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif

3、修改:/home/eric/Documents/u-boot-2013.04-rc1/common/cmd_nand.c
661行:

#endif
//eric++    2017-11-11
} else if (!read && s != NULL && (!strcmp(s, ".uboot")) && nand->writesize == 2048) {
    rwsize=2048;
    nand_write(nand, off, &rwsize,  (u_char *)addr);            
    off+=2048;
    addr+=2048;
    nand_write(nand, off, &rwsize,  (u_char *)addr);        
    off+=2048;
    addr+=2048;
    nand_write(nand, off, &rwsize,  (u_char *)addr);
    off+=2048;
    addr+=2048;
    nand_write(nand, off, &rwsize,  (u_char *)addr);
    off+=2048;
    addr+=2048;
    rwsize= CONFIG_SYS_NAND_U_BOOT_SIZE - 8*1024;
    ret = nand_write(nand, off, &rwsize, (u_char *)addr);
    //eric++ end
#ifdef CONFIG_CMD_NAND_YAFFS

由于,IROM启动时,自动搬运u-boot-spl-16k.bin共8K的代码到SRAM,规定每页只能最大加载2K的数据(大概是为了兼容不同容量的nand吧)。

所以 :
如果nand刚好是一页2K(256M的nand),刚好可以4页存放,那直接进行烧写nand是没有问题的。
但若nand是一页4K的话(K9GAG08U0D);就需要将u-boot-spl-16k.bin拆分开,分成4页存放,每页2K刚好8K,位于u-boot-spl-16k.bin后面的u-boot.bin则无需进行拆分。

若一页4K,如K9GAG08U0D,则需要对应修改为:

#endif
//eric++    2017-11-11
} else if (!read && s != NULL && (!strcmp(s, ".uboot")) && nand->writesize == 4096) {
    rwsize=4096;
    nand_write(nand, off, &rwsize,  (u_char *)addr);            
    off+=4096;
    addr+=2048;
    nand_write(nand, off, &rwsize,  (u_char *)addr);        
    off+=4096;
    addr+=2048;
    nand_write(nand, off, &rwsize,  (u_char *)addr);
    off+=4096;
    addr+=2048;
    nand_write(nand, off, &rwsize,  (u_char *)addr);
    off+=4096;
    addr+=2048;
    rwsize= CONFIG_SYS_NAND_U_BOOT_SIZE - 8*1024;
    ret = nand_write(nand, off, &rwsize, (u_char *)addr);
    //eric++ end
#ifdef CONFIG_CMD_NAND_YAFFS

4、修改:/home/eric/Documents/u-boot-2013.04-rc1/include/configs/smdk6410.h
226行:

#ifdef CONFIG_ENABLE_MMU
#define CONFIG_SYS_MAPPED_RAM_BASE  0xc0000000
#define CONFIG_BOOTCOMMAND  "nand read 0xc0018000 0x60000 0x1c0000;" \
                "bootm 0xc0018000"
#else
#define CONFIG_SYS_MAPPED_RAM_BASE  CONFIG_SYS_SDRAM_BASE
#ifdef  CONFIG_BOOT_SD      //透过SD卡将u-boot-nand.bin加载到内存中,再写到nand中      //eric++ 2017-11-11
    #define CONFIG_BOOTCOMMAND  "fatload mmc 0 50008000 u-boot-nand.bin;" \
                        "nand erase.chip;" \
                        "nand write.uboot 50008000 0 0"
#else
        #define CONFIG_BOOTCOMMAND  "nand read 0x50018000 0x60000 0x1c0000;" \
                    "bootm 0x50018000"
#endif
#endif

同时将以下#define CONFIG_BOOT_NAND宏定义移动到上面代码(约226行)之上,以便宏判断指令有效

/* Boot configuration (define only one of next 3) */
#define CONFIG_BOOT_NAND
//#define CONFIG_BOOT_SD
/* None of these are currently implemented. Left from the original Samsung
 * version for reference
#define CONFIG_BOOT_NOR
#define CONFIG_BOOT_MOVINAND
#define CONFIG_BOOT_ONENAND
*/

261行:修改uboot大小为8K,6410内部8KSRAM

#define CONFIG_SYS_NAND_U_BOOT_OFFS (8 * 1024)//(4 * 1024)  /* Offset to RAM U-Boot image */        //eric++2017-11-11
#define CONFIG_SYS_NAND_U_BOOT_SIZE (512 * 1024)//(252 * 1024)  /* Size of RAM U-Boot image   */    //eric++2017-11-11

以上代码的作用就是,如果从SD卡启动,则自动加载SD卡中的u-boot-nand.bin到RAM中,然后烧写到nand flash中。
若果从nand启动,则不需要进行自动烧写操作,直接启动即可!
正可谓:借花(SD卡)献佛(烧写nand)

5、由此,按照如下顺序启动设备

1、先只打开宏CONFIG_BOOT_NAND,生成u-boot-nand.bin。
2、再只打开宏CONFIG_BOOT_SD,生成u-boot.bin。
3、然后将u-boot.bin烧写至SD卡,将u-boot-nand.bin复制到SD中(不是烧写)
4、设备SD卡启动,nand烧写完成后。就可以nand启动

6、nand顺利启动后,测试测试ENV保存功能。修改bootdelay为5s进行保存

SMDK6410 # printenv
baudrate=115200
bootargs=console=ttySAC,115200
bootcmd=nand read 0x50018000 0x60000 0x1c0000;bootm 0x50018000
bootdelay=3
ethact=dm9000
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.1.1
ipaddr=192.168.1.2
serverip=192.168.1.136
stderr=serial
stdin=serial

Environment size: 292/16380 bytes
SMDK6410 # setenv bootdelay 5
SMDK6410 # saveenv
Saving Environment to NAND…
saveenv:env_new->crc=0x9b389d7a
Erasing Nand…
Erasing at 0x40000 – 100% complete.
Writing to Nand… done
SMDK6410 # printenv
baudrate=115200
bootargs=console=ttySAC,115200
bootcmd=nand read 0x50018000 0x60000 0x1c0000;bootm 0x50018000
bootdelay=5
ethact=dm9000
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.1.1
ipaddr=192.168.1.2
serverip=192.168.1.136
stderr=serial
stdin=serial
stdout=serial

Environment size: 292/16380 bytes
SMDK6410 #

修改完成,但是重新启动却失败
分析:由于ENV保存在nand 0x40000处,256K;但u-boot-nand.bin 约275K。
所以一旦saveenv指令执行,则会修改256K处的数据,,这样u-boot-nand.bin则会被破坏!!导致无法重新启动

修改/home/eric/Documents/u-boot-2013.04-rc1/include/configs/smdk6410.h
263行:将0x40000改成0x0080000,512K,保证和u-boot-nand.bin不会重叠

#define CONFIG_ENV_OFFSET       0x0080000   //0x0040000

重新利用SD卡启动,并烧写u-boot-nand.bin 到nand falsh,
再次从nand启动,并修改ENV参数保存,则可以保证成功重启!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值