如何提高mtd写flash频率
发布网友
发布时间:2022-05-16 18:11
我来回答
共1个回答
热心网友
时间:2023-11-16 02:39
参看高手说在应用里要 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目录下多了一个dev/mtd4设备节点。这里面有很多奇怪的地方。不知道这个mtd4是怎么生成的。像那个spidev0.0设备节点是因为在文件spidev.c里有赋值给主设备和从设备的地方,而这个在m25p80.c里并没有发现任何迹象,只是看到在probe里加进了add_mtd_partitions()函数,还有这样的语句:
flash->mtd.erase = m25p80_erase;
flash->mtd.read = m25p80_read;
flash->mtd.write = m25p80_write;
然后继续查找probe最后到了那里:
static struct spi_driver m25p80_driver = {
.driver = {
.name = "m25p80",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
.probe = m25p_probe,
.remove = __devexit_p(m25p_remove),
};
貌似这里又用probe来注册了spi_driver结构体。而最后的init和exit函数都用了spi注册。晕倒!那怎么最后是open设备mtd4呢。这中间到底发生了什么?
这里只能说mtd设备利用了spi总线来达到注册自己设备的目的。而这个mtd设备在本质上是一个字符设备。
在板子登陆的内核信息里截获到以下信息:
call video_register_device() in file videodev.c
call video_register_device() in file videodev.c
call adv7343_initialize()
ad9889_i2c_init() OK!
i2c /dev entries driver
nand_davinci nand_davinci.0: Using soft ECC
info->emifregs = 0xc8008000,EMIF_A1CR = 0x3ffffffc
info->emifregs = 0xc8008000,EMIF_A1CR = 0x88442a8
/*****************************************************************************/
mtd->writesize(pagesize)=2048
mtd->oobsize=64
mtd->erasesize(blocksize)=0x20000
/*****************************************************************************/
NAND device: Manufacturer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bit)
Scanning device for bad blocks
chip_delay = 30
Creating 4 MTD partitions on "nand_davinci.0":
0x00000000-0x000e0000 : "bootloader"
0x000e0000-0x00100000 : "params"
0x00100000-0x004a0000 : "kernel"
0x004a0000-0x08000000 : "filesystem"
nand_davinci nand_davinci.0: hardware revision: 2.2
Enter into m25p_probe
m25p80 spi0.0: m25p40 (512 Kbytes)
dm_spi.0: davinci SPI Controller driver at 0xc8002800 (irq = 43) use_dma=1
pcf8563 0-0051: chip found, driver version 0.4.2
上面的Enter into m25p_probe 是在m25p80.c里probe函数打印出来的。这么早就打印了而不是open时候才调用probe是在内核加载时就调用了。