SD卡以及nand flash相关知识整理
做了那么久的storage相关的东西,一直也没有好好整理,趁现在阳光正好,微风不燥,趁现在花还未开到荼蘼,将这部分知识整理归纳。 NAND FLASH为什么不能够XIP SD卡的启动时序 NAND FLASH ?ECC错误,导致找不到BBT 需要确认nand的初始化配置过程中的ecc的大小是否正确,以及layout的pos值设置是否正确。 ? ? ? ?读取NAND 芯片的ID ,然后查表得到这片NAND 芯片的如厂商,page size ,erase size 以及chip size 等信息,接着,根据struct nand_chip 中options 的值的不同,或者在NAND 芯片中的特定位置查找bad block table ,或者scan 整个NAND 芯片,并在内存中建立bad block table 。说起来复杂,但其实所有的这些动作,都可以在MTD 提供的一个叫做nand_scan 的函数中完成。
? ? ? ?struct nand_ecclayout 的结构体,它用来定义ecc 在oob 中的布局。对于small page( 每页512 Byte) 和big page( 每页2048 Byte) 的两种NAND 芯片,它们的ecc 在oob 中的布局不尽相同。如果你的driver 中对这两种芯片的ecc 布局与MTD 中定义的default 的布局一致,那么就很方便,直接调用nand_scan 函数即可。 ????? 但如果不是,那你就需要为这两种不同的NAND 芯片分别定义你的ecc 布局。于是问题来了,因为我们在调用nand_scan_ident 函数之前,是不知道系统中的NAND 芯片是small page 类型的,还是big page 类型,然而在调用nand_scan_tail 函数之前,却必须确定NAND 芯片的oob 布局( 包括ecc 布局和坏块信息pattern) ,因为nand_scan_tail 函数在读取oob 以及处理ecc 时需要这个信息。所以在这种情况下,我们就需要首先调用nand_scan_ident 函数,它会调用一个叫做nand_get_flash_type 的函数,MTD 就是在这个函数中读取NAND 芯片的ID ,然后就能查表( 即全局变量nand_flash_ids) 知道这片NAND 芯片的类型( 即writesize 的大小) 了。接下来,你就可以在你的NAND 驱动中,根据writesize 的大小来区分ecc 的布局了。最后,我们就可以顺利地调用nand_scan_tail 函数了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |