参考文件 drivers\mtd\nand\s3c2410.c(当内核启动时,会打印相关nand的信息,搜索相关打印信息,找到这个文件)
内核提供的nand flash 驱动例子,从这个例子中我们可以总结出nand flash 的框架,进而总结出如何写一个nand_flash驱动程序。
(1)内核源代码中支持s3c开发板的nand flash 驱动程序分析。
s3c2410_nand_init
platform_driver_register(&s3c24xx_nand_driver)
s3c24xx_nand_probe
s3c2410_nand_inithw //初始化硬件
s3c2410_nand_setrate //设置nand 主机控制器时序
s3c2410_nand_init_chip
struct nand_chip *chip = &nmtd->chip;
设置nand_chip
nand_scan_ident //扫描nand设备,nand_scan函数的第一个参数
s3c2410_nand_update_chip(info, nmtd);
nand_scan_tail(&nmtd->mtd); //nand_scan 函数的第二个参数
s3c2410_nand_add_partition(info, nmtd, sets);
mtd_device_parse_register
parse_mtd_partitions
//判断选择
add_mtd_partitions //解析分区表成功
add_mtd_device
add_mtd_device
list_for_each_entry(not, &mtd_notifiers, list) // &mtd_notifiers在哪里设置?
not->add(mtd);
.......
add_disk() //注册块设备
(2)nand flash 框架:
app: open read write
--------------------------------------------
vfs: sys_open sys_read sys_write
----------------------------------- ---
块设备驱动 :知道如何去优化,电梯调度算法
-------------------------------------
硬件:磁盘 光盘 MTD :关键结构体 mtd_info 结构体
---------------------
Nand Flash 协议层 : 知道发什么,但是不知道怎么发送,nand flash的共性已经抽象出来
----------------------
Nand Flash :知道如何去发送数据和命令
(3)nand flash 驱动编写:
1) 分配一个nand_chip 结构体。
2) 设置。
3)把这个nand_chip 结构体用起来,如何用起来,调用下面两个函数。
3.1) nand_scan()函数 : 主要是为了产生一个 mtd_info结构体,用nand_chip 来填充
3.2) add_mtd_partitions ()函数:里面最终会调用到 add_disk()函数,从而注册块设备。
(4)nand flash 读 的大致过程
最终会调用到 ll_rw_block 函数,在 ll_rw_block 函数里面主要是优化读写顺序(电梯调度算法),调用请求队列处理函数,在请求队列处理函数里面我们会调用mtd层向上提供的读写接口函数,在读写接口函数里面,我们会调用mtd_info结构体的读写函数,而mtd_info结构体是有nand_chip提供的,最终就会调用到我们在nand_chip里面设置的相关函数。
把这个读的过程理解了,nand flash 驱动的框架就理解了。
注:ll_rw_block函数是根据《linux源代码情景分析》这本书来的。