nandflash驱动
mtd------memory technology device
slc------single level cell
mlc------multi level cell
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添加分区,
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函数。
那mtd_notifiers这个链表在哪里设置
在这个函数里面注册 register_mtd_user
这个函数又被谁调用呢???
被mtdchar.c和mtdblock.c 这两个函数都注册了一个user
将mtdchar_notifier这个放到那个链表里面去,当它发现一个mtd设备的时候会调用链表里面的add函数
在mtdchar.c是这个函数被调用
在mtdblock.c是下面的函数被调用
我们先看mtdchar_notify_add这个函数,看看它做了什么事情,然而发现它是个空函数
但是看整个文件,其实就是一个字符设备驱动
然后看看块设备的add函数,看它做了什么事情
这里又有一个链表,对应链表里面每个成员,调用add_mtd,但是这个blktrans_majors又在哪里设置
在register_mtd_blktrans这个函数里面
注册mtd块传输
我们看mtdblock.c就好了
在add_mtd_blktrans_dev调用alloc_disk add_disk 最终构造struct mtd_info *mtd结构体