近期工作小结(nand-b/c的驱动)



在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处理不符合标准的;

你可能感兴趣的:(工作,struct,Flash,makefile,reference,linux内核)