通过mtd读写flash_Linux下读写FLASH驱动——MTD设备分析

最近在学习驱动读写flash的代码部分。经历了可笑的过程:开始我知道flash用通过spi口来读写。所以就到了driver/spi 下面看相关代码。发现有个spidev.c里面有read/write/ioctl等函数。而且还有一个davinci_spi_master.以为调用spi驱动的时候会首先调用到这里,于是就想怎么在上层应用里将spidev.c里open调用到就可以了。最后修改了一些地方就在应用的地方打开了这个字符设备驱动。在dev下面生成了dev/spidev0.0目录。于是打开它还调用到了spidev.c里的相关函数。甚是窃喜,但突然发现这个跟我要读写的flash又有什么关系呢?flash芯片型号是:m25p40。知道了又怎么样?我该如何读写它呢。后来突然在网上看了这么一段话MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。我将CFI接口的MTD设备分为四层(从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。(http://blog.csdn.net/binghuiliang/archive/2008/01/23/2060794.aspx)郁闷之余看到了这样的信息,发现原来flash不是要注册一个什么spi设备,而是要通过mtd设备来读取后来在dev/mtd/devices文件夹里看到了m25p80.c这个代码。打开发现里面是对这一类flash驱动的支持代码。天哪怎么回事,后来就又看了里面的函数有read/write/probe函数但是没有发现open函数,甚是烦恼。不知道open函数哪里去了。是不是probe代替了呢??同时也没有发现ops这样的文件操作结构体。问题出现了。

参看高手说在应用里要 system("flash_eraseall /dev/mtd4");spi_fd =open("/dev/mtd4",O_RDWR, 0);

这么调用,而mtd4在哪里注册的我就不知道了。现在还在寻找中。read和write都是调用到了m25p80.c里函数。下面具体说一下如何添加m25p80.c驱动吧。

步骤如下:

1、make menuconfig里选择MTD/下相应的选项。内核已经配好了。

2、修改arch/arm/mach-davinci下面的davinci_spi_platform.c 在里面加入

static struct flash_platform_data davinci_m25P40_info =

{

.name = "m25p80",

.parts = NULL,

.nr_parts = 0,

.type = "m25p40",

};

static struct spi_board_info dm6467_spi_board_info[] = {

{

// SPI FLash

.modalias = "m25p80",

.platform_data = &davinci_m25P40_info,

.mode = SPI_MODE_0,

.irq = 0,

.max_speed_hz = 4 * 1000 * 1000, /*4MHZ*/

.bus_num = 0,

.chip_select = 0, // device number on bus (0-based)

},

};

然后编译重新编译内核之后就可以发现在dev目录下多了一个

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值