nandflash驱动框架
最上层肯定是应用程
——————————
app: open read write
________________
文件系统:文件系统是将对文件的读写转换为对块设备的读写
—————————
块设备驱动
块设备 : 知道怎么优化
——————
nandflash协议层:知道发什么来读写,擦除,识别
——————
硬件相关的代码 :知道怎么发命令,发地址,读写数据
————————
——————————
硬件
我们来看看内核的启动信息,从内核的启动信息我们找到那个文件,从那个文件分析
搜索s3c nand driver这句话
我们就从这个文件里面一路分析进去
我们可以从上面的图片看出,它先注册了一个平台驱动,根据总线设备驱动模型,在内核里面有个同名的平台设备
如果有就会调用probe函数
进入probe函数
初始化硬件
初始化芯片
会有个nand_scan_ident扫描
扫描完之后add_partition添加分区,
我们进入add_partition这个函数,它调用下面这个函数
我们来看看nand_scan_iden这个函数怎么扫描的
设置默认函数
获得flash类型
看看别人是怎么获得的
选中芯片
然后复位芯片,然后读芯片的ID
发什么命令呢 发NAND_CMD_READID,这个等于多少呢???
跟我们前面弄的一样的
然后读数据,第一个读到厂家ID,第二个读到设备ID
在这个nand_flash_ids数组里面比较这个id,我们来看看这个数组
我们可以看到我们的DC在这里面
我们nand_scan_ident是在 //driver/mtd/nand/nand_base.c里面实现的
这个文件是通用的,所有的nandflash都要发命令读到这些东西
我们在来看看我们的添加分区
在这里面又调用了
这个函数
我们看一下开发板下面的驱动
有字符设备,也有块设备。所以我们这个nandflash可以当作字符设备也可以当作块设备
我们只需要做硬件操作那块就行了,其余的别个已经帮我们做好了
以我们写了那么多驱动应该知道了
1.分配某个结构体
2.设置
3.硬件相关的设置
4.使用
这个结构体我们现在还不知道是什么东西,但我们可以看看例子程序,看看probe函数,三星写到代码都太啰嗦了,我们看atmel-nand.c的nandflash驱动
它是一个好的例子
这里有个nand_chip结构体
接着他又设置了这个结构体。这就是我们要找的结构体
所以我们的驱动就是
分配 设置nand_chip结构体
使用就用nand_scan_ident这个函数 扫描完之后在添加分区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又调用这个函数 mtdblock_ro.c也调用了
从名字上可以看 ro是只读的意思
我们看mtdblock.c就好了
这里有个add_mtd函数
这个函数有调用了下面这个函数
add_mtd_blktrans_dev又调用了
然后我们的alloc_disk就出来了
设置容量出来了
add_disk出来了
在nand_scan_ident这个函数之后有个
这个函数
这个函数里面
又有个这个,构造struct mtd_info *mtd结构体