加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 19:55:36 所属栏目:百科 来源:网络整理
导读:项目中用到了spi flash芯片MX25L25635E,之前在uboot下简单分析了驱动代码,调试该flash擦除的bug,一直没有时间分 析内核中关于该芯片的驱动,以下是对该芯片驱动的一个简单分析: 1、先粘贴一些flash的理论部分: ??????? ?MTD层为NOR FLASH和NAND FLASH设

项目中用到了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,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/目录下看到:

?????????
















??
??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读