Linux nand controller驱动开发指导(Linux mtd子系统专栏分析之六)

        在前面的两章,我们基本上完成了nand驱动模型的介绍以及nand_chip的注册说明,本章我们主要说明如何进行nand controller驱动的开发,以及我们在进行nandflash的适配时,需要注意的事项。本章的主要内容如下:

一、 nand controller驱动开发流程说明

二、nandflash适配注意事项说明

 

一、 nand controller驱动开发流程说明

      在此前的文章中,我们已经介绍了nand controller抽象而来的结构体为struch nand_chip(建议大家在开本篇文章时,请先看下之前两篇文章,以便对nand controller驱动模型有一个逻辑的概念)。

  1. 创建一个platform driver驱动,以便实现nand_controller芯片相关私有数据与驱动的分离(关于platform模型的使用方式以及好处,请参考我之前写的文章)。
  2. 在platform的probe接口中,开始进行struct nand_chip类型变量内存空间的申请及初始化,需要设置的内容如下:
    1. 设置nand_chip的IO_ADDR_R、IO_ADDR_W地址,该地址主要用于nanflash数据的读写操作(如在nand_chip->read_buf、nand_chip->write_buf等接口中);
    2. 设置nand_chip->ecc变量,主要设置ecc及其相关的读写接口,若该nand_controller支持硬件ecc,则需要根据platform_device中传递的resource信息,设置硬件ecc类型,并设置ecc使能hwctl、ecc校验接口calculate、ecc纠错接口correct、read_page_raw、write_page_raw、read_page、read_subpage、write_subpage、write_page、write_oob_raw、read_oob_raw、read_oob、write_oob等函数指针,并设置每页数据执行ecc校验的次数、单次进行数据ecc计算的字节数、产生的ecc字节数等(如ti omap2的nand chip驱动,针对硬件bch4、bch8,其设置的接口为omap_elm_correct_data、omap3_calculate_ecc_bch、omap_read_page_bch、omap_write_page_bch、omap3_enable_hwecc_bch、nand_chip.ecc.size、nand_chip.ecc.mode、nand_chip.ecc.strength、nand.ecc.bytes);
    3. 设置与nandflash进行命令通信的函数指针,针对ti omap2的nand chip驱动而言,其设置如下nand.cmd_ctrl  = omap_hwcontrol;
    4. 设置与nanflash进行数据通信的接口以及坏块标记以及芯片选择相关的接口,这主要涉及到如下一些函数指针的设置read_byte、read_word、write_buf、read_buf、block_bad、block_markbad、select_chip、block_bad、erase_cmd、scan_bbt、errstat等接口(这些接口不是需要全部设置的,在ti omap2的驱动中,仅设置了dev_ready、read_buf、write_buf等接口,而对其他接口并没有设置,那这些接口在哪里设置呢?在上一章我们介绍的nand_scan_identnand_scan_tail接口中,针对nand_chip中未进行初始化的函数指针,会设置nand驱动模块定义的通用接口)。
    5. 设置oob中存储ecc的字节数以及每一个ecc字节在oob中的偏移位置;
    6. 调用nand_scan_ident、nand_scan_tail接口,完成nand_chip中page size、block size、erase size、nand flash size等参数的设置,并针对nand_chip中尚未设置的函数指针的设置,并完成该nand_flash对应的mtd_info类型变量中flash参数的设置以及其对应的mtd接口的设置(针对这些内容已在上一篇文章中介绍,此处不再赘述)
    7. 调用mtd_device_parse_register接口,完成该nandflash各分区的对应的mtd_info的注册(若没有对nandflash分区,则将该master mtd_info注册至系统中,也就是完成mtd_info对应的额块设备、字符设备的注册等等,这些内容已在上几篇文章中说明)。

        完成以上内容即可完成nand_controller的驱动开发。

 

 

 

二、nandflash适配注意事项说明

nandflash参数设置说明

       在我们进行开发板的适配时,若需要适配的nandflash不支持onfi规范,则我们需要在变量struct nand_flash_dev nand_flash_ids[] 中检测下我们所使用的的nandflash相关的参数是否已在定义中,若没有添加即可,添加规则如下图所示。

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

 

           若nandflash支持onfi接口,则无须在nand_flash_ids中设置相关参数,由nand驱动模型中的nand_flash_detect_onfi函数即可通过与nandflash通信,获取writesize、erasesize、oobsize、chipsize等信息即可。

         nandflash对应分区属性设置

       我们知道nandflash容易出现bit翻转的情况,因此我们在进行分区划分时,针对boot分区、kernel分区,可以将分区属性设置为只读属性;另外针对文件系统分区,我们可以划分多个文件系统分区,对于系统程序、系统文件、系统库文件可单独划分为一个分区,而针对需要大量读写操作的部分,可单独划分一个分区。

       例如如下的分区划分,我们只需要将mask_flags设置为MTD_WRITEABLE,即可将该分区设置为只读分区。另外针对文件系统,我们也可以选择只读文件系统类型,将文件系统设置为只读。

 

nandflash的oob设置

        我们知道nandflash容易出现bit翻转,但会通过纠错算法,对出现bit翻转位进行纠错,这就涉及到计算的ecc值存放的问题,目前这些值存放在nandflash的oob中,因此在驱动开发中,需要确定ecc存储在oob中的位置以及大小,并确保boot和kernel中设置的参数相同,针对kernel,其对应的数据结构如下所示。

 

 

 

以上即为本篇文章的主要内容,主要说明了nand controller以及nandflash适配相关的注意事项,希望对大家的工作开发有所帮助。

发布了151 篇原创文章 · 获赞 34 · 访问量 46万+

猜你喜欢

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