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

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

         

















M25P80 是一款常见的 SPI NOR Flash 存储器芯片,它被广泛应用于嵌入式系统中。在 Linux 系统中,可以使用 MTD(Memory Technology Devices)子系统来管理和访问 SPI NOR Flash 存储器。下面是一个简单的示例,演示如何在 Linux 中使用 MTD 子系统访问 M25P80 芯片。 1. 确认 M25P80 芯片已经连接到 Linux 系统的 SPI 总线上,并且 SPI 总线驱动程序已经加载成功。 2. 在 Linux 系统中安装 mtd-utils 工具包,该工具包提供了一些用于操作 MTD 设备的实用工具。 3. 在 Linux 中加载 spi-nor 驱动程序,该驱动程序支持对 SPI NOR Flash 存储器的访问。可以使用 modprobe 命令加载该驱动程序: ``` modprobe spi-nor ``` 4. 在 Linux 中加载 mtdchar 驱动程序,该驱动程序支持将 MTD 设备映射为字符设备。可以使用 modprobe 命令加载该驱动程序: ``` modprobe mtdchar ``` 5. 在 Linux 中创建一个 MTD 设备,并将其与 M25P80 芯片进行关联。可以使用 flash_eraseall 命令来擦除整个设备,并使用 flashcp 命令将一个镜像文件写入该设备。例如: ``` flash_eraseall /dev/mtd0 flashcp image.bin /dev/mtd0 ``` 6. 在 Linux 中挂载 MTD 设备,可以将其挂载为 JFFS2 文件系统。可以使用以下命令来挂载设备: ``` mount -t jffs2 /dev/mtdblock0 /mnt/flash ``` 7. 现在,可以在 /mnt/flash 目录中访问 M25P80 芯片中存储的数据了。可以使用 cp 命令将文件复制到 M25P80 芯片中,也可以使用 cat 命令查看文件内容。例如: ``` cp file.txt /mnt/flash cat /mnt/flash/file.txt ``` 上述步骤只是一个简单的示例,实际上在使用 MTD 子系统访问 SPI NOR Flash 存储器时,还需要进行其他配置和设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值