Linux nand驱动注册相关接口说明(Linux mtd子系统专栏分析之五)

       在上一篇文章中,我们分析了nand驱动模型中接口抽象以及相关数据结构体的分析,本章我们主要说明nand驱动模型提供的nand controller驱动注册以及nand驱动模块提供的通用接口说明。本章主要包括如下几个内容:

一、nand_controller驱动的注册流程及功能说明

二、nand驱动模型中通用接口说明

 

 

一、nand_controller驱动的注册流程及功能说明

 

    在前面几章里,我们已经介绍了mtd驱动模型、nand驱动模型以及mtd与nand的关联、mtd与vfs之间的关联。在这一小节中,我们主要介绍nand_chip(nand controller对应的逻辑抽象结构体)的注册接口。

     而针对nand_chip而言,其注册接口所实现的功能主要包括哪些呢?我们还是借助上一篇文章的图来进行说明吧(用逻辑关联图,能让我们在大脑中快速建立nand_chip注册所实现的功能)。

  1. 建立mtd_info(该mtd_info为该nandflash芯片对应的master mtd_info)中访问nandflash相关的函数指针,主要用于指向nand驱动模型中通用接口(即nand_write、nand_write、nand_read_oob等接口);
  2. 实现nand_chip中ecc控制相关成员,即实现nand_chip->ecc变量,即实现(struct nand_ecc_ctrl类型的结构体变量,包括ecc计算接口、ecc纠错接口、读取一页接口、写一页数据接口、ecc字节数、单次进行ecc计算的数据字节数等等信息,该接口可由具体的nand_controller驱动自己赋值,无须nand驱动模型的注册函数实现,若具体的nand_controller驱动未设置,则由nand驱动模型的注册函数使用通用的接口(soft ecc接口));
  3. 实现nand_chip中通过nand_controller与nandflash进行命令通信的接口cmd_ctrl(该接口因不同nand_controller而不同,因此针对不同的nand_controller,需要实现对应的cmd_ctrl);
  4. 实现nand_chip中与nand flash进行通信的命令接口cmdfunc,该接口主要调用cmd_ctrl,实现将相关操作命令下发给nandflash(如读取nandflash id、读写数据、读写oob数据等命令);
  5. 实现nand_chip中的read_byte、read_word、read_buf、write_buf、block_bad等接口,这些接口实现读写flash的功能,同时read_byte、read_word、read_buf、write_buf接口也主要是由上述2中读写一页数据的接口调用;
  6. 实现坏块表的建立操作;
  7. 获取nandflash的页大小、块大小、flash大小等参数大小,并赋值给nand_chip中具体的参数中。

 

        nand_chip的注册大致即实现以上这些功能,完成上述功能后,也就实现了mtd_info->_read/_write--->nand_chip->ecc->read_page/write_page/…--->nand_chip->cmdfunc/read_buf/write_buf接口间的调用逻辑的关联,从而即可实现通过mtd_info中的函数指针即可完成调用nand_chip->read_buf/write_buf,实现与nandflash的通信。

 

扫描二维码关注公众号,回复: 10230927 查看本文章

 

       而针对nand_chip的注册,nand驱动模型提供了两个接口nand_scan_ident、nand_scan_tail,通过这两个接口即完成了上述所说的功能,下面我们分析下这两个接口。

 

nand_scan_ident接口分析

      该接口主要调用nand_set_defaults、nand_get_flash_type接口实现nand_chip中成员变量的设置,主要实现的功能如下:

  1. 调用nand_set_defaults接口,设置nand_chip中读写flash的接口(若未设置,则使用通用的接口,如nand_command、nand_wait、nand_read_byte、nand_read_byte16、nand_read_word、nand_read_buf、nand_write_buf、nand_block_bad等等接口);
  2. 调用nand_get_flash_type接口,获取nandflash相关的参数(若page size、block size、oob size、flash size等信息),该接口主要通过如下操作实现参数的获取:
    1. 通过读取flash的设备id信息,并从全局变量nand_flash_ids中查找是否存在该设备id对应的定义参数,若存在,则获取page size、block size、oob size、flash size等等信息;若不存在,则进入步骤b;
    2. 通过调用nand_flash_detect_onfi接口,判断flash是否支持onfi规范,若支持则读取onfi相关的参数,从而获取page size、block size、oob size、flash size等等信息;若未获取到,则进入步骤c;
    3. 则根据设备id、扩展id,设置对应的page size、block size、oob size、flash size等等信息;

 

 

 

 

nand_scan_tail接口分析

 

该接口实现的功能如下:

  1. 若nand_chip->ecc.layout 未设置,则根据ecc类型,设置默认的oob信息;
  2. 依据nand_chip->ecc的类型,并确认是否需要设置ecc中calculate、correct、read_page、read_subpage、write_page、read_page_raw、write_page_raw、read_oob、write_oob接口(若nand_controller驱动未设置这些函数指针,则设置这几个接口,针对不同的ecc算法,默认接口也有所不同);
  3. 设置mtd_info中的函数指针,主要涉及_erase、_read、_write、_panic_write、_read_oob、_write_oob、_sync、_suspend、_resume、_block_isbad、_block_markbad等接口,并设置mtd_info的type、flags、ecclayout、ecc_strength等接口;
  4. 若nand_chip设置了bbt标志,则调用chip->scan_bbt,建立坏块表。

 

 

      以上便为nand_scan_ident、nand_scan_tail接口的实现流程,说白了也就是设置mtd_info的_erase、_read、_write等接口,以及nand_chip的ecc中的接口、nand_chip的函数指针等等内容,最终完成本章开头的逻辑关联图。支持mtd_info、nand_chip的所有成员变量也已完成了设置。

    那至此时,是否已经算是完成了mtd_info、nand_chip的所有关联了呢?

    还差最后一步,那就是需要进行master mtd_info、slaver mtd_info的关联,这一步需要调用mtd_device_parse_register接口。这才完成了mtd_info、nand_chip的关联,也就建立了如下的关联图

 

 

二、nand驱动模型中通用接口说明

        nand驱动模型提供的通用接口,主要用于抽象针对所有nand controller以及所有nand flash的读写接口等信息,这些接口主要如下几类接口:

  1. Nand flash擦除接口
  2. Nand flash读写接口
  3. nandflashoob读写接口
  4. nandflash坏块检测及标记接口

 

我们以nand_write为例进行简要说明,nand_write实现的流程如下:

  1. 调用nand_get_device接口获取nand_chip的执行权(若当前nand_chip不在ready状态(即nand_chip再执行其他的读、写或者擦除等操作),则将该进程加入到等待队列中,并把该进程调度出去);
  2. 获取nand_chip的执行权后,则调用nand_do_write_ops执行写操作;
    1. nand_do_write_ops接口中判断flash处于写保护,则返回失败;
    2. nand_do_write_ops通过调用chip->write_page进行写操作(即nand_write_page接口);而nand_write_page则会调用nand_chip->ecc->write_page接口;而在nand_chip->ecc->write_page接口则会调用nand-chip->write_buff进行写操作。

 

        以上变为nand_write接口的写操作流程,下面我们总结一下,nand驱动模型中通用接口的调用逻辑如下所示(nand_write的调用也遵循下面的调用流程),nand驱动模块的通用抽象接口通过nand_chip->ecc、nand_chip接口的调用关系,关联在一起。

 

 

 

以上便为本章的主要内容,下面再简要总结一下:

  1. 说明nand_chip的注册流程,包括nand_scan_ident、nand_scan_tail接口的实现流程;
  2. 说明nand驱动模型的通用抽象接口,并说明该通用抽象接口与nand_chip->ecc接口、nand_chip接口的调用关联。
发布了151 篇原创文章 · 获赞 34 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/lickylin/article/details/105151338