u-boot 2013.04-rc1移植(6)

来源:互联网 发布:python隐马尔可夫模型 编辑:程序博客网 时间:2024/06/14 11:25

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参数保存,则可以保证成功重启!

原创粉丝点击