关于spi flash芯片m25p80驱动以及其简单的mtd驱动分析

来源:互联网 发布:淘宝网点照明设计软件 编辑:程序博客网 时间:2024/05/16 10:00

项目中用到了spi flash芯片MX25L25635E,之前在uboot下简单分析了驱动代码,调试该flash擦除的bug,一直没有时间分

析内核中关于该芯片的驱动,以下是对该芯片驱动的一个简单分析:

1、先粘贴一些flash的理论部分:

       

 MTD层为NOR FLASH和NAND FLASH设备提供统一接口。MTD将文件系统与底层FLASH存储器进行了隔离。

 如图所示,MTD设备通常可分为四层,从上到下依次是:设备节点、MTD设备层、MTD原始设备层、硬件驱动层。

Flash硬件驱动层:(相当于spi driver/i2c driver)Flash硬件驱动层负责对Flash硬件的读、写和擦除操作。MTD设备的Nand Flash芯片的驱动则drivers/mtd/nand/子目录下,Nor Flash芯片驱动位于drivers/mtd/chips/子目录下。

MTD原始设备层:(相当于spi master/i2c client)用于描述MTD原始设备的数据结构是mtd_info,它定义了大量的关于MTD的数据和操作函数。其中mtdcore.c:  MTD原始设备接口相关实现,mtdpart.c :  MTD分区接口相关实现。

MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)字符设备(设备号90)。其中mtdchar.c :  MTD字符设备接口相关实现,mtdblock.c : MTD块设备接口相关实现。

设备节点:通过mknod在/dev子目录下建立MTD块设备节点(主设备号为31)MTD字符设备节点(主设备号为90)。通过访问此设备节点即可访问MTD字符设备和块设备。

2、关于spi flash驱动的调用过程。

      A、spi flash硬件驱动层部分

           

             调用module_spi_driver注册spi的驱动,另外在平台代码arch/arm/mach-iproc/flash.c中调用了late_initcall来加载硬件设备信息。

            

                

             该函数填充了spi_board_info结构体,调用了spi_register_board_info向内核注册spi device信息,包括了芯片片选,总线编号,总线时钟,通信模式等,接下来在系统启动过程中,设备和驱动的匹配,当spi driver中的name与device中的name相同的时候则回调spi driver中的probe函数,在probe函数中对结构体m25p结构体成员mtd_info结构体赋值,并且调用了mtd原始设备层中的函数mtd_device_parse_register函数向mtd层挂接一个设备。


    B、mtd原始设备层部分(driver/mtd/mtdcore.c)

          mtd原始设备层部分即相当于通过init_mtd函数向内核注册这样一种总线,其中包括了mtd设备的擦除读写方法。

         



          这里我只关注了擦除读写部分:

          int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)

          int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,u_char *buf)

          int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,const u_char *buf)

          这些方法是在硬件设备层probe函数中被初始化赋值的。

     C、mtd设备层部分(driver/mtd/mtdchar.c)

          该层为linux系统提供一些文件操作接口供应用程序调用,包括设备的打开,关闭,读写等的操作接口,调用init_mtdchar函数注册fops结构体,至此就是整个框架的简单分析说明。由上到下,依次是设备节点的操作调用到mtd设备层接口,进而调用到mtd原始设备层的读写擦除接口,接着调用spi flash的硬件驱动接口部分,最后驱动硬件。

          系统启动后,spi flash部分可以看到在/sys/bus/spi/device/spi1.0目录下cat modalias会有显示spi:m25p80

          mtd设备层部分可以在sys/class/mtd/目录下看到:

         

















0 0
原创粉丝点击