注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

linux中nandflash层次分析  

2012-09-23 21:49:46|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
上一节里面我们队nandflash实现的框架进行了搭建,说实话,那个框架我搭建的是比较满意的,这是我学习嵌入式以来最有成就的一个框架了。不过我们知道,内核要实现一个功能肯定是分层实现的,为了进一步理解nandflash框架,我们本节就来分析一下nand的层次!
还记得上一节里面我们分析到了这里:

mtd->_read(mtd, from, len, retlen, buf);//最后调用slave->mtd里面的read函数进行读
本节我们就由此分析下去:

mtd->_read(mtd, from, len, retlen, buf);//drivers/mtd/mtdcore.c里面
      part_read  //drivers/mtd/ mtdpart.c
            part->master->_read(part->master, from + part->offset, len, retlen, buf);
                     nand_read  //drivers/mtd/ nand_base.c
                            struct nand_chip *chip = mtd->priv;//这里注意是指向mtd->priv
                            nand_do_read_ops(mtd, from, &ops)
                                  chip->select_chip(mtd, chipnr);
                                        nand_select_chip; //drivers/mtd/ nand_base.c
                                              chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
                                                       s3c2440_nand_hwcontrol  //drivers/mtd/nand/s3c2410.c
                                                                 writeb(cmd, info->regs + S3C2440_NFCMD);
                                  chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);  //drivers/mtd/ nand_base.c
                                           nand_command //drivers/mtd/nand/nand_base.c
                                                   chip->cmd_ctrl(mtd, command, ctrl);
                                                             s3c2440_nand_hwcontrol  //drivers/mtd/nand/s3c2410.c
                                                                    writeb(cmd, info->regs + S3C2440_NFCMD);
                                  chip->ecc.read_page(mtd, chip, bufpoi, page); //drivers/mtd/ nand_base.c
                                           nand_read_page_hwecc_oob_first 
                                                      chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
                                                                   nand_command
                                                                             chip->cmd_ctrl(mtd, command, ctrl);
                                                                                      s3c2440_nand_hwcontrol//drivers/mtd/nand/s3c2410.c
                                                                                                 writeb(cmd, info->regs + S3C2440_NFCMD);
                                                      chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
                                                               s3c2410_nand_write_buf; //drivers/mtd/nand/s3c2410.c
                                                                      writesb(this->IO_ADDR_W, buf, len);

如此就很清楚了,我们可以把nand的读写分为3个层次:
第一层:块设备驱动层,这里我们之前说过主要是做一些优化,将请求放入队列
第二层:协议层,这一层规定要发出什么命令进行读写
第三层:硬件相关层,这一层知道怎样发这些命令

那么想一想我们应该怎么写驱动程序?

经过上面的分析就很明白了,我们要做的就是提供读写函数!那么读写函数是那么庞大,是否都要我们自己来写呢?答案是否定的,协议层是系统做好的,我们写驱动程序只需要提供最底层的操作函数,也就是协议相关层,也就是上面的比如说:chip->cmdfunc,而chip->cmdfunc又调用chip->cmd_ctrl,所以这两个是我们要实现的,那么具体怎么做呢?我们可以根据上一节里面的初始化函数来写我们的驱动程序!简单总结一下我们要做的工作:

1、分配一个nand_chip结构体,在里面实现最底层的读写函数
2、分配一个mtd_info结构体,使mtd->priv指向上面分配的nand_chip结构体
3、调用nand_scan_ident函数,这里面会使mtd->priv指向一些默认函数,如果默认函数不支持的话,需要我们自己实现,也就是第一步里面我们要实现的东西。有些函数如:chip->cmdfunc要调用chip->cmd_ctrl,这也是我们要自己实现的,因为没有s3c2410_nand_init_chip这个函数来赋给它默认值!
4、貌似要调用s3c2410_nand_add_partition,但是我们如果自己提供分区表的话,就不必再去查找分区表了,所以我们可以稍微往下走一点,调用add_mtd_partitions。这样就可以条件分区,然后注册磁盘了!

  评论这张
 
阅读(1381)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017