在NANDXX-A的driver搞定之后,开始add sth for NANDXXX-B/C,同时也修正之前的问题。
Phase1:
1) 添加struct nand_ecclayout stnand_oob_64;
2) 添加omap_nand_command_lp();
3) 修改probe()函数;
4) 添加struct nand_platform_data osk5912_nand_data;
如果要更改nand flash类型,需要更改如下两处macro:
osk-nand-flash.c中“#define ST_NAND_SP”
board-osk.c中“#define ST_NAND_SP”
Result: 此时可以识别Flash ID。
Note: 516批次的nand的manfactureID输出有问题,0x20在最后一个byte输出,不能识别;
Question:
1) 使用mtd util执行r/w/e时候经常出错,不稳定;
2) jffs2的坏块管理可能有问题——对一个坏块也要读oob的0x1985,不能mount之后测试;
Phase2:
1) 调试driver:
a) 修改nfc_init();
b) 去除dev_ready函数赋值;
c) 自己写test case操作flash;
然后发现nand操作ok,把a,b改回也正常,难道是mtd util的问题?但现在起码使用flash_eraseall是可以的,怀疑有其他工具(例如nanddump)操作会让nand内部时序乱了。
2) 编译yaffs2到linux内核中:
a) 从http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/下载最新的yaffs2 src code;
b) 根据readme.patch把yaffs2 patch到linux kernel中;
c) 在make menuconfig时候把yaffs2选中,更具体的信息参考http://www.edacn.net/html/83/38783_itemid_7409.html;
d) 编译时候遇到问题,不知道为什么能post上来?估计再有更新,这些问题就该fix掉了:
1. Missing file yaffs_mtdif1.h
You can write a header file yaffs_mtdif1.h with reference to yaffs_mtdif2.h
2. Replace qsort( ... ) in yaffs_guts.c with yaffs_qsort(...)
3. Modify Makefile from
--------------------------------------------------
yaffs-y += yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o
yaffs-y += yaffs_mtdif.o yaffs_mtdif2.o
--------------------------------------------------
to
--------------------------------------------------
yaffs-y += yaffs_packedtags1.o yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o
yaffs-y += yaffs_mtdif.o yaffs_mtdif1.o yaffs_mtdif2.o
--------------------------------------------------
3) 把nand相关的内核选项设置为M,省得如果想加debug信息就得重编译内核;
4)使用nand flash:
a) 编译kernel结束后,cp nand_ecc.ko nand_ids.ko ST_512byte_ECC.ko nand.ko osk-nand-flash.ko /data/rootfs2.6/root/;
b) 在osk console下依次insmod them;
c) 如果要一个干净的flash,执行./flash_eraseall /dev/mtd4;
d) mount -t yaffs2 /dev/mtdblock4 /mnt;
Phase 3:
1) 完成nandxxx-c的driver,在yaffs2下测试r/w文件通过。
a) 在board-osk.c中添加一个NAND_ST_MLC_OPTIONS赋值;
b) osk-nand-flash.c中“#define ST_NAND_MLC”和board-osk.c中“#define ST_NAND_MLC”;
c) NFC_Init()中频率由0改为1;
2) nand_ids.c中LP_OPTIONS改为0——反正我们要的option都定义过了;
其他:
============================
修正之前对OOB_PLACE作出的修改;
不必修正,read/read_oob就该返回整个oob的内容,nftl知道哪些位置(ecc pos)对它无用。
NFTL中由它自己管理BBM,那么lld中对bad block的操作就该被屏蔽;
如果不想让mtd管理bbm,而是nftl自己管理,那么:
a) 在osk-flash.c中给chip->block_bad和chip->block_markbad赋值,内容do nothing;
b) oob_layout中badblock position应当是free的;
c) 不要用ubi提供的bbt;
坏处:这样在nand底层操作中无法识别/标记badblk,因为返回都不是坏块。
NFTL中对MLC的BBM处理不符合标准的;