天天看点

Nand Flash驱动程序编写(linux 3.4.2内核)

参考文件  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源代码情景分析》这本书来的。

继续阅读