打印
[程序源码]

Nand flash驱动工作原理

[复制链接]
867|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Witte|  楼主 | 2018-6-11 11:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在介绍具体如何写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层,一层层调用,最后调用到你所实现的那些底层访问硬件数据/缓存的函数中。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

33

帖子

0

粉丝