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



 

                

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值