您的位置:首页 > 其它

u-boot 2013.04-rc1移植(6)

2017-11-12 19:32 134 查看

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 11月 11 14:26 u-boot-spl-16k.bin
-rwxr-xr-x 1 eric eric   2828 11月 11 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 11月 11 14:33 u-boot-spl-16k.bin
-rwxr-xr-x 1 eric eric   2828 11月 11 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 11月 11 14:33 u-boot.bin
-rw-r--r--   1 eric eric  278780 11月 11 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参数保存,则可以保证成功重启!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: