我现在编了一个uboot.img 和mlo,然后在sd 卡上可以正常启动,但是在uboot 里面用命令nand write 把mlo 写到flash的0x0,把uboot.img 写道0x80000 ,都写成功了,没报错,然后拔掉sd卡,重启,结果就是不能启动。为什么?是uboot 还要编成sd 版和nand版吗?
另外还有一个小问题:我用的flash是MT29F8G08ABACA块结构是,uboot已经识别出来了:
Device 0: nand0, sector size 256 KiB
Page size 4096 b
OOB size 224 b
Erase size 262144 b
但是uboot 代码里面:
#if defined(CONFIG_NAND_OMAP_ECCSCHEME)
err = omap_select_ecc_scheme(nand, CONFIG_NAND_OMAP_ECCSCHEME,
CONFIG_SYS_NAND_PAGE_SIZE, CONFIG_SYS_NAND_OOBSIZE);
#else
/* pagesize and oobsize are not required to configure sw ecc-scheme */
err = omap_select_ecc_scheme(nand, OMAP_ECC_HAM1_CODE_SW,
0, 0);
#endif
定义的page size是2048,oob 是64,这样子我在正常使用中会不会有问题?
Hao Wang:
有检查了一遍,发现是nand 有坏块:
read Skipping bad block 0x00000000read Skipping bad block 0x00040000read Skipping bad block 0x00080000read Skipping bad block 0x000c0000read Skipping bad block 0x00100000read Skipping bad block 0x00140000read Skipping bad block 0x00180000read Skipping bad block 0x001c0000read Skipping bad block 0x00200000read Skipping bad block 0x00240000read Skipping bad block 0x00280000read Skipping bad block 0x002c0000
太尴尬了,这还是这么多年来第一次遇到这么多坏块,还是连续的,都有点怀疑是不是uboot代码和flash不匹配。但是后面的擦写读都没问题。
用的uboot是 U-Boot 2014.07-00107-ga6ef75a-dirty (Jun 28 2015 – 21:11:15),是sdk(ti-processor-sdk-linux-am335x-evm-01.00.00.00)里面带的。
nand管脚配置是默认的:
150 static struct module_pin_mux nand_pin_mux[] = {
151 {OFFSET(gpmc_ad0), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD0 */152 {OFFSET(gpmc_ad1), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD1 */153 {OFFSET(gpmc_ad2), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD2 */154 {OFFSET(gpmc_ad3), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD3 */155 {OFFSET(gpmc_ad4), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD4 */156 {OFFSET(gpmc_ad5), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD5 */157 {OFFSET(gpmc_ad6), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD6 */158 {OFFSET(gpmc_ad7), (MODE(0) | PULLUDDIS | RXACTIVE)}, /* AD7 */
另外也试了如下peizhi
160 static struct module_pin_mux nand_pin_mux[] = {
161 {OFFSET(gpmc_ad0), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD0 */162 {OFFSET(gpmc_ad1), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD1 */163 {OFFSET(gpmc_ad2), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD2 */164 {OFFSET(gpmc_ad3), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD3 */165 {OFFSET(gpmc_ad4), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD4 */166 {OFFSET(gpmc_ad5), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD5 */167 {OFFSET(gpmc_ad6), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD6 */168 {OFFSET(gpmc_ad7), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* AD7 */
两者的效果一模一样。
现在最大的怀疑就是配置、代码有问题,因为flash也没咋用,大片出现坏块也不科学啊
Hao Wang:
假如如果真的是nand flash 前面几块是坏块,那么是不是就没办法从nand flash启动了?
Steven Liu1:
先确认一下这个NAND flash的device ID是多少?是在目前AM335x ROM code的支持列表中吗?
你的是MLO没启动吧,因为在uboot中能够对NAND flash进行重新的配置的,所以在uboot中识别出来了,并不一定能确保刚上电启动的时候的ROM code能够识别。而且和你在uboot代码里面的设置没关系,因为MLO都没有运行,这里的uboot代码都走不到的。
Hao Wang:
回复 Steven Liu1:
我现在是从sd 卡启动,引导分区就放了mlo 和uboot 两个文件的,对nand 后面的空间擦写读都没问题,就是前面的一片报错。也没有好的办法验证是不是真的出坏块了。uboot 读nand 的时候直接把坏块pass 掉了。
Jesdy Hou:
回复 Hao Wang:
楼主,你们用这款Nand Flash,最终跑起来了吗?我们计划升级系统,Nand Flash也是选的这款。