This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM1808 ------>nand flash 中,若uboot烧写区域存在坏块,那么ubl将无法引导uboot!!



如下面,发现某片nand flash 在0x000e0000 地址存在一个坏块区,刚好uboot烧写起始地址为0x000c0000,大小为0x32000,那么0x000e0000刚好在其中。

U-Boot > nand bad

Device 0 bad blocks:
000e0000
07120000
07900000
07f80000
07fa0000
07fc0000
07fe0000

串口烧写ubl,uboot正常,但是从nand启动的时候,ubl 就没办法引导uboot了,一直卡在

Starting NAND Copy...
Valid magicnum, 0x55424CBB, found in block 0x00000006.
DONE
Jumping to entry point at 0xC1080000.

如果跳开0x000e0000 这个区域烧写uboot,那么都是正常的。

分析过ubl源码,发现里面是支持ecc校验的,那为什么在引导uboot的时候不能跳过这个坏块?是ubl在ecc校验这块存在缺陷还是其他什么问题?请帮忙解答下,谢谢!

  • 现在启动UBOOT不需要用UBL了,直接用AISGEN工具把UBOOT.bin转换成AIS格式的就可以

    UBL负责的初始化NAND和DDR等都可以通过AISGEN配置完成,应该也能解决坏块这个问题

  • 你好!谢谢你的回答!

    根据我的理解 AISGEN工具 烧写的uboot位置 与SFH烧写的位置不一样,我想如果也遇到坏块区,同样也会有类似问题存在。

    我想请TI的达人们帮忙解释下,ubl里面的ecc校验是否可行?为什么会出现上述问题?

    PS:gg weee,顺便请教下您目前1808用的哪种烧写方式?适合批量不?谢谢! 

  • 我们因为每个设备都带sd卡槽,所以选择第一次烧写uboot用sd卡启动方式,boot管脚在这个模式下需要修改,然后通过写uboot的脚本,让sd卡启动uboot后自动完成烧写NAND中的uboot,内核和文件系统。正常设备更新程序什么的,因为有uboot和内核在NAND,直接通过uboot或者linux烧写就是了

    如果你们没有SD卡,我觉得第一次烧写用串口启动UBOOT应该也行吧?串口启动UBOOT->UBOOT读取U盘中的文件->脚本完成烧写

    我没试过,不知道速度怎么样

  • 您是说在uboot起来后直接烧写uboot的ais文件是吧?这个烧写的地址是多少?有存在ECC校验问题吗?谢谢!

  • 对,烧写uboot就是烧写的通过AISGEN转化的AIS格式的uboot.bin

    往NAND中烧写的地址好像是128K以后吧?以前应该是用来存UBOOT的环境变量ENV

    这个烧写地址如果你通过串口sfh工具烧写UBOOT的话,起始地址用默认的不就可以吗?

    我用UBOOT升级自己的时候,我记得MTD的设置,uboot的起始位置是128K。一般linux中关于MTD的那个数组就是这么定义的,因为没有UBL,所以就是128K开始的

    ECC校验是RBL自带的,也就是系统启动后查找AIS格式文件的时候就自带校验,我记得TI提供的use boot loader那个PDF说,如果当前NAND block的ECC检测不通过,则会找下一个,前2M的都找不到就认为失败了

    你如果想用UBOOT下烧写自身的AIS格式UBOOT.bin,需要注意RBL的默认ECC LAYOUT和UBOOT以及LINUX用的LAYOUT是不同的,这个当时折腾了我很长时间,具体的在网上搜下就有解决办法

  • 使用nand scrub命令试试,如果不是物理坏块就好办了

    nand scrub 彻底擦除整块Nand Flash中的数据,包括OOB。可以擦除软件坏块标志。


  • 遇到类似问题,使用ubl直接引导ucos,如果该区域有坏块就不能起来,而且存在使用ubl系统更新