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参数保存,则可以保证成功重启!
相关文章推荐
- u-boot 2013.04-rc1移植(4)
- u-boot 2013.04-rc1移植(1)
- u-boot 2013.04-rc1移植(2)
- u-boot 2013.04-rc1移植(5)
- u-boot 2013.04-rc1移植(3)
- u-boot 2013.04-rc1移植(7)
- bootloader---23.u-boot-2010.06-rc1移植之3nand flash移植
- 2013.04-rc2uboot移植(建立编译模板)
- bootloader---24.u-boot-2010.06-rc1移植之4saveenv
- bootloader---25.u-boot-2010.06-rc1移植之5usb下载
- OK6410 uboot2013.04-rc1 DM9000移植及tftp配置使用
- 移植u-boot-2011.09-rc1到FL2440(3)
- 移植u-boot-2011.09-rc1到FL2440(1)
- 移植u-boot-2011.09-rc1到FL2440(2)
- bootloader---21.u-boot-2010.06-rc1移植之调试的思路
- bootloader---22.u-boot-2010.06-rc1移植之2搭建框架
- 最详细的U-BOOT源码分析及移植
- u-boot 1.1.6在SkyEye 1.3.1上的移植及启动ArmLinux 2.6.36
- U-Boot1.2.0移植YC2440
- u-boot-1.3.4移植到s3c2440之nand驱动