nandflash驱动

mtd------memory technology device

slc------single level cell  

mlc------multi level cell

nandflash驱动框架

nandflash驱动


从驱动框架图可知,编写驱动需要提供:

1 提供nand_chip结构体
2 设置这个结构体
3 硬件相关设置(io设置和寄存器设置)

4 用nand_scan/add_mtd_partions和nand_chip来构造mtd_info

*****************************************************************************************************************

编写的过程:

1.根据打印信息s3c nand driver找到出处,追踪到相应的probe函数中,在这个函数中做了以下的工作:(分析时atmel-nand.c是个很好的例子

2.初始化硬件

3.初始化芯片

4.会有个nand_scan_ident扫描

5.扫描完之后add_partition添加分区,

nandflash驱动

nand_scan()中会用mtd_info *tiny_nand_mtd;作为实参传入,

mtd_info *tiny_nand_mtd传递给了nand_chip *tiny_nand_chip;

tiny_nand_mtd->priv = tiny_nand_chip;

tiny_nand_chip中调用了大量了函数,涉及了很多寄存器,我们从芯片手册中找到这写寄存器进行映射。

我们在找到probe函数的时候并不知道要用到哪些函数,但是我们知道这些函数最终被scan()调用了,到scan()分析有哪些。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

分析scan()函数

在一开始会调用初始化函数,对所有没有设置的函数进行初始化;后面我们在查看函数的时候,有一些函数我们要到这个默认函数中查看是否帮我们做好了,或者做好的是否有用,如果没有用我们就要重新写

(下面涉及的函数在初始化中声明有效?跳过,重写)

获得flash类型(选中芯片>>复位芯片,读取芯片ID>>把读取到的id和id_table中的信息进行对比,得到flash类型)

其他的函数见程序

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

下面对分区函数进行分析(了解,上面为重点)

扫描完之后在添加分区add_mtd_partitions,最后还是会到我们的add_mtd_device

对链表里的每一项,调用add函数。

nandflash驱动

那mtd_notifiers这个链表在哪里设置

在这个函数里面注册 register_mtd_user

这个函数又被谁调用呢???

被mtdchar.c和mtdblock.c     这两个函数都注册了一个user

将mtdchar_notifier这个放到那个链表里面去,当它发现一个mtd设备的时候会调用链表里面的add函数

在mtdchar.c是这个函数被调用

nandflash驱动

在mtdblock.c是下面的函数被调用

nandflash驱动

我们先看mtdchar_notify_add这个函数,看看它做了什么事情,然而发现它是个空函数

但是看整个文件,其实就是一个字符设备驱动

然后看看块设备的add函数,看它做了什么事情

nandflash驱动

这里又有一个链表,对应链表里面每个成员,调用add_mtd,但是这个blktrans_majors又在哪里设置

nandflash驱动

在register_mtd_blktrans这个函数里面

注册mtd块传输

我们看mtdblock.c就好了

add_mtd_blktrans_dev调用alloc_disk add_disk 最终构造struct mtd_info *mtd结构体