flash的各個參數和工作原理
具體參考nand flash的datasheet,主要包括,自己nand
flash的廠商,型號等。
Nand flash的頁大小,oob大小,塊大小,位寬8bit還是16bit。
工作原理,上面已經做了壹定描述,不清楚的,可以參考datasheet,多看看,就會明白很多。
2. 按照linux下驅動編寫規範編寫nand
flash驅動,
可以參考其他已經有的驅動,比如內核源碼中已經有的
drivers/mtd/nand/s3c2410.c
就是個很好的例子。
自己以其為模板,實現自己板子的nand flash驅動。
其實主要工作就是,實現
static struct platform_driver s3c2410_nand_driver =
{
.probe =
s3c2410_nand_probe,
.remove =
s3c2410_nand_remove,
.suspend =
s3c24xx_nand_suspend,
.resume =
s3c24xx_nand_resume,
.driver = {
.name =
"s3c2410-nand",
.owner =
THIS_MODULE,
},
};
中的
XXX_nand_probe函數
XXX_nand_remove函數
XXX_nand_enable_hwecc,如果支持硬件ecc的話。
對nand flash的讀寫,這兩個函數,實現了對nand的具體操作。
Linux下Nand Flash驅動編寫簡單步驟
軟件和硬件知識,都已經了解的話,由於上層的linux的 mtd框架中,已經完全封裝好了,對nand
flash的write page,write oob等相關函數的實現,那麽剩下的只是相對來說已經是很少量的,關於nand
驅動具體內部操作方面的工作:
1.初始化
先是在nand 芯片初始化的時候,對其
XXX_nand_init_chip()
給對應的芯片chip賦給對應的
XXX_nand_read_buf和XXX_nand_write_buf等函數:
chip->cmd_ctrl =
XXX_nand_hwcontrol;
chip->dev_ready =
XXX_nand_devready;
chip->read_buf =
XXX_nand_read_buf;
chip->write_buf =
XXX_nand_write_buf;
以實現後續的對nand芯片的操作。
然後根據ecc類型,賦給對應的ecc的校驗與糾錯函數:
chip->ecc.hwctl =
XXX_nand_enable_hwecc;
chip->ecc.calculate = XXX
_nand_calculate_ecc;
3.
實現上面提到的對應的各個函數,關於如何實現,參考壹下其他nand驅動,就會理解很多了。
4. 驅動測試,參考具體的 ldd3(Linux
Device Driver version 3)的測試相關部分內容。