通过mtd读写flash_NOR Flash读写原理及驱动

本文详细介绍了NOR Flash技术,包括其历史、特点、与NAND的性能对比,以及NOR Flash的读写原理和驱动程序实现。NOR Flash以其芯片内执行的能力适用于存储代码,而NAND在高数据存储密度和快速写入方面更具优势。驱动程序的初始化涉及分配map_info结构体、设置物理和虚拟地址、调用cfi_probe或jedec_probe进行识别,并添加分区。
摘要由CSDN通过智能技术生成

本文主要是关于NOR Flash的相关介绍,并着重对NOR Flash读写原理及驱动进行了详尽的阐述。

NOR Flash

NOR Flash是现在市场上两种主要的非易失闪存技术之一。Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理需要特殊的系统接口。通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多,在设计中应该考虑这些情况。——《ARM嵌入式Linux系统开发从入门到精通》 李亚峰 欧文盛 等编著 清华大学出版社 P52 注释 API Key

性能比较

flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。

由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。

执行擦除时块尺寸的不同进一步拉大了NOR和NAND之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。

l 、NOR的读速度比NAND稍快一些。

2、 NAND的写入速度比NOR快很多。

3 、NAND的4ms擦除速度远比NOR的5s快。

4 、大多数写入操作需要先进行擦除操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的SPI Flash读写驱动程序示例,使用的是Linux内核自带的SPI驱动接口。 #include <linux/module.h> #include <linux/spi/spi.h> #include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h> #define FLASH_PAGE_SIZE 256 #define FLASH_SECTOR_SIZE 4096 #define FLASH_BLOCK_SIZE 65536 struct spi_flash { struct mtd_info mtd; struct spi_device *spi; }; static int spi_flash_probe(struct spi_device *spi) { struct spi_flash *flash; struct mtd_partition *parts; int nparts, err; flash = kzalloc(sizeof(struct spi_flash), GFP_KERNEL); if (!flash) { dev_err(&spi->dev, "Failed to allocate memory for spi_flash\n"); return -ENOMEM; } flash->spi = spi; /* Set up MTD structure */ flash->mtd.name = spi->modalias; flash->mtd.owner = THIS_MODULE; flash->mtd.type = MTD_NORFLASH; flash->mtd.flags = MTD_CAP_NORFLASH; flash->mtd.erasesize = FLASH_BLOCK_SIZE; flash->mtd.writesize = FLASH_PAGE_SIZE; flash->mtd.writebufsize = FLASH_PAGE_SIZE; /* Register MTD device */ err = mtd_device_register(&flash->mtd, NULL, 0); if (err) { dev_err(&spi->dev, "Failed to register MTD device, error %d\n", err); kfree(flash); return err; } /* Set up partition table */ nparts = get_mtd_device_partitions(&flash->mtd, &parts, 0); if (nparts <= 0) { dev_err(&spi->dev, "Failed to create partition table\n"); mtd_device_unregister(&flash->mtd); kfree(flash); return -EINVAL; } /* Print information about the device */ dev_info(&spi->dev, "SPI Flash device detected, %d partitions.\n", nparts); dev_info(&spi->dev, "Flash device size %llu bytes, erase size %d bytes, write size %d bytes.\n", (unsigned long long)flash->mtd.size, flash->mtd.erasesize, flash->mtd.writesize); return 0; } static int spi_flash_remove(struct spi_device *spi) { struct spi_flash *flash = spi_get_drvdata(spi); mtd_device_unregister(&flash->mtd); kfree(flash); return 0; } static const struct of_device_id spi_flash_of_match[] = { { .compatible = "spansion, s25fl064k", }, { /* end of table */ } }; MODULE_DEVICE_TABLE(of, spi_flash_of_match); static struct spi_driver spi_flash_driver = { .driver = { .name = "spi_flash", .owner = THIS_MODULE, .of_match_table = spi_flash_of_match, }, .probe = spi_flash_probe, .remove = spi_flash_remove, }; static int __init spi_flash_init(void) { return spi_register_driver(&spi_flash_driver); } static void __exit spi_flash_exit(void) { spi_unregister_driver(&spi_flash_driver); } module_init(spi_flash_init); module_exit(spi_flash_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("SPI Flash driver"); MODULE_ALIAS("spi:spi_flash"); 以上代码定义了一个名为spi_flash驱动程序,它基于Linux内核自带的SPI驱动接口,并提供了一个MTD设备,可以进行SPI Flash读写操作。在probe函数中,驱动程序会初始化MTD设备,并创建分区表。在remove函数中,驱动程序会注销MTD设备。在spi_flash_init函数中,驱动程序会注册SPI驱动程序。在spi_flash_exit函数中,驱动程序会注销SPI驱动程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值