imx6q的nandflash启动原理和填坑
近期公司有新的需求把emmc启动,调整到nandflash,因为emmc的bga焊盘比较小,间距比较小,不利于生产,而nandflash是TSOP的。手焊都是ok的。
1.修改linux的device tree文件使其可以加载驱动和文件系统。
主要是修改pinmux。和使gpmi中的status为okay。同时uboot传入参数:mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),-(rootfs)
启动linux会发现/dev目录下有mtd0,mtd1,mtd2,mtd3四个分区。当然你需要挂载文件系统(ubifs)你需要
flash_erase /dev/mtd3 0 0
ubiformat /dev/mtd3
ubiattach /dev/ubi_ctrl -m 3
ubimkvol /dev/ubi0
mkdir -p /mnt/mtd3
mount -t ubifs ubi0:rootfs /mnt/mtd3
这样你就挂载上文件系统了,可以df一下。如果你需要优化nandflash时序你可以修改驱动里面的时序代码,
这是freescale默认的值,是any device都支持的,如何对速度有要求的同志还是需要修改的,比如我的项目就是对速度有要求的。
这个是我根据MT29F8G08ABACAWP的数据手册修改的。目前测试蛮稳定的,速度也有提升百分之30以上。
2.修改uboot对nandflsah的支持。
我是在sabresd板子上的基础上修改的uboot,打开board/freescale/mxsabresd/mx6sabresd.c添加函数
在include/configs/mx6sabresd_common.h
添加#define CONFIG_NAND_BOOT。
这样make一下就ok了。在uboot下就可以使用nand info ,nand write等命令。
前面的两部都很简单就搞定了,当设置gpio使芯片从nandflash时总是不行。
3。从nandflash启动。
我是使用mfg用otg来烧写nandflash,如上图是nandflash烧写的脚本。
烧写完就是从nandflash启动不了。我花了三天时间研究了ivt,bootdata,dcd,这些结构,和emmc下是否不一样(我的uboot以前是从emmc启动),发现是一样的也是预留的1k空间,又花了一天时间研究了uboot的
烧写工具kobs-ng的源码,发现烧写FCB时是没有写oob区的ECC数据的,和数据手册描述的是不一样的,就修改了kobs-ng源码使其写FCB时也ECC,可是还是启动不了。
把烧写到nandflash里面的FCB,DBBT一个个比对也没发现有什么不对。uboot.imx头的ivt,DCD一个个对也是没问题的。当时想的是看来要重新画板子留出JTAG了,看看启动时ocram的0x907400是否有
uboot.imx的ivt,bootdata,dcd,因为imx6q启动是bootrom会把nandflash的4k数据拷到0x907400。我们也使用示波器看过波形,在nandflash引脚确实是有时序的。
最后在看DCD数据时发现了
其中
0x20C_4078h这个寄存器是enable时钟的。而sabresd板子里面是没有nandflash的所以关掉了时钟。这也是很多在人在nxp community问nandflash启动不了的原因,很多人是在sabresd软件基础上加了nandflash。
望大家共勉,能解决大家从nand启动的问题。