13691982107 发表于 2018-7-17 11:40

Nand flash驱动工作原理

在介绍具体如何写Nand Flash驱动之前,我们先要了解,大概的,整个系统,和Nand Flash相关的部分的驱动工作流程,这样,对于后面的驱动实现,才能更加清楚机制,才更容易实现,否则就是,即使写完了代码,也还是没搞懂系统是如何工作的了。让我们以最常见的,Linux内核中已经有的三星的Nand Flash驱动,来解释Nand Flash驱动具体流程和原理。此处是参考2.6.29版本的Linux源码中的\drivers\mtd\nand\s3c2410.c,以2410为例。1. 在nand flash驱动加载后,第一步,调用对应的init函数 ---- s3c2410_nand_init: 去将nand flash驱动注册到Linux驱动框架中。2. 驱动本身真正的开始,是从probe函数: s3c2410_nand_probe->s3c24xx_nand_probe,
在probe过程中:
clk_enable //打开nand flash控制器的clock时钟,
request_mem_region //去申请驱动所需要的一些内存等相关资源。
s3c2410_nand_inithw //去初始化硬件相关的部分,主要是关于时钟频率的计算,以及启用nand flash控制器,使得硬件初始化好了,后面才能正常工作。3. 需要多解释一下的,是这部分代码:for (setno = 0; setno < nr_sets; setno++, nmtd++) {
pr_debug("initialising set %d (%p, info %p)\n", setno, nmtd, info);/*调用init chip去挂载你的nand驱动的底层函数到"nand flash的结构体"中,以及设置对应的"ecc mode",挂载ecc相关的函数 */
s3c2410_nand_init_chip(info, nmtd, sets);/* scan_ident,扫描nand 设备,设置nand flash的默认函数,获得物理设备的具体型号以及对应各个特性参数,这部分算出来的一些值,对于nand flash来说,是最主要的参数,比如nand flash的芯片的大小,块大小,页大小等。 */
nmtd->scan_res = nand_scan_ident(&nmtd->mtd, (sets) ? sets->nr_chips : 1);if (nmtd->scan_res == 0) {
s3c2410_nand_update_chip(info, nmtd);/*扫描的后一阶段,经过前面的scan_ident,我们已经获得对应nand flash的硬件的各个参数,
*然后就可以在scan tail中,根据这些参数,去设置其他一些重要参数,尤其是ecc的layout,即ecc是如何在oob中摆放的,
*最后,再去进行一些初始化操作,主要是根据你的驱动,如果没有实现一些函数的话,那么就用系统默认的。 */
nand_scan_tail(&nmtd->mtd);/*add partion,根据你的nand flash的分区设置,去分区 */
s3c2410_nand_add_partition(info, nmtd, sets);
}
if (sets != NULL)
sets++;
}4. 等所有的参数都计算好了,函数都挂载完毕,系统就可以正常工作了。上层访问你的nand falsh中的数据的时候,通过MTD层,一层层调用,最后调用到你所实现的那些底层访问硬件数据/缓存的函数中。 深圳雷龙发展有限公司从事NANDFLASH行业10+年.目前代理ATO Solution小容量SLC NAND,SPI NAND,MCP等。想了解更多请咨询QQ:2852826868;电话13691982107

Benewake-胡兵 发表于 2018-7-18 09:58

不错,66666666!

13691982107 发表于 2018-7-18 15:28

Benewake-胡兵 发表于 2018-7-18 09:58
不错,66666666!

有这方面的需要吗的,有的话加QQ详谈

全球芯 发表于 2019-4-28 15:03

页: [1]
查看完整版本: Nand flash驱动工作原理