本文主要是關于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快很多,在設計中應該考慮這些情況?!?a target="_blank">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 、大多數寫入操作需要先進行擦除操作。
5 、NAND的擦除單元更小,相應的擦除電路更少。
此外,NAND的實際應用方式要比NOR復雜的多。NOR可以直接使用,并可在上面直接運行代碼;而NAND需要I/O接口,因此使用時需要驅動程序。不過當今流行的操作系統對NAND結構的Flash都有支持。此外,Linux內核也提供了對NAND結構的Flash的支持。
詳解
NOR和NAND是現在市場上兩種主要的非易失閃存技術。Intel于1988年首先開發出NOR flash技術,徹底改變了原先由EPROM和EEPROM一統天下的局面。緊接著,1989年,東芝公司發表了NAND flash結構,強調降低每比特的成本,更高的性能,并且象磁盤一樣可以通過接口輕松升級。但是經過了十多年之后,仍然有相當多的硬件工程師分不清NOR和NAND閃存。
像“flash存儲器”經??梢耘c相“NOR存儲器”互換使用。許多業內人士也搞不清楚NAND閃存技術相對于NOR技術的優越之處,因為大多數情況下閃存只是用來存儲少量的代碼,這時NOR閃存更適合一些。而NAND則是高數據存儲密度的理想解決方案。
NOR的特點是芯片內執行(XIP, eXecute In Place),這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,但是很低的寫入和擦除速度大大影響了它的性能。
NAND結構能提供極高的單元密度,可以達到高存儲密度,并且寫入和擦除的速度也很快。應用NAND的困難在于flash的管理需要特殊的系統接口。
接口差別
NOR flash帶有SRAM接口,有足夠的地址引腳來尋址,可以很容易地存取其內部的每一個字節。
NAND器件使用復雜的I/O口來串行地存取數據,各個產品或廠商的方法可能各不相同。8個引腳用來傳送控制、地址和數據信息。
NAND讀和寫操作采用512字節的塊,這一點有點像硬盤管理此類操作,很自然地,基于NAND的存儲器就可以取代硬盤或其他塊設備。
容量成本編輯
NAND flash的單元尺寸幾乎是NOR器件的一半,由于生產過程更為簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價格。
NOR flash占據了容量為1~16MB閃存市場的大部分,而NAND flash只是用在8~128MB的產品當中,這也說明NOR主要應用在代碼存儲介質中,NAND適合于數據存儲,NAND在CompactFlash、Secure Digital、PC Cards和MMC(多媒體存儲卡Multi Media Card)存儲卡市場上所占份額最大。
可靠耐用
采用flash介質時一個需要重點考慮的問題是可靠性。對于需要擴展MTBF(平均故障間隔時間Mean Time Between Failures)的系統來說,Flash是非常合適的存儲方案。可以從壽命(耐用性)、位交換和壞塊處理三個方面來比較NOR和NAND的可靠性。
壽命(耐用性)
在NAND閃存中每個塊的最大擦寫次數是一百萬次,而NOR的擦寫次數是十萬次。NAND存儲器除了具有10比1的塊擦除周期優勢,典型的NAND塊尺寸為NOR器件的八分之一,每個NAND存儲器塊在給定的時間內的刪除次數要少一些。
NOR Flash讀寫原理及驅動
一。原理
從原理圖中我們能看到NOR FLASH有地址線,有數據線,能向內存一樣讀,不能向內存一樣寫(要發出某些命令)。這也使得NOR的數據非常可靠,所以一般用來存儲bootloader。當然現在手機上都只有nand flash了,節約成本嘛。下節我會帶大家去分析nand flash驅動,并進行總結。
二。驅動程序
/*
* 參考 drivers\mtd\maps\physmap.c
*/
#include 《linux/module.h》
#include 《linux/types.h》
#include 《linux/kernel.h》
#include 《linux/init.h》
#include 《linux/slab.h》
#include 《linux/device.h》
#include 《linux/platform_device.h》
#include 《linux/mtd/mtd.h》
#include 《linux/mtd/map.h》
#include 《linux/mtd/partitions.h》
#include 《asm/io.h》
static struct map_info *s3c_nor_map;
static struct mtd_info *s3c_nor_mtd;
/*分區數組*/
static struct mtd_partition s3c_nor_parts[] = {
[0] = {
.name = “bootloader_nor”,
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = “root_nor”,
.offset = MTDPART_OFS_APPEND, //緊接著上一個
.size = MTDPART_SIZ_FULL, //到最后
}
};
static int s3c_nor_init(void) //入口函數
{
/* 1. 分配map_info結構體 */
s3c_nor_map = kzalloc(sizeof(struct map_info), GFP_KERNEL);;
/* 2. 設置: 物理基地址(phys), 大小(size), 位寬(bankwidth), 虛擬基地址(virt) */
s3c_nor_map-》name = “s3c_nor”;
s3c_nor_map-》phys = 0; //物理地址
s3c_nor_map-》size = 0x1000000; /* 》= NOR的真正大小 */
s3c_nor_map-》bankwidth = 2; //位寬
s3c_nor_map-》virt = ioremap(s3c_nor_map-》phys, s3c_nor_map-》size); //虛擬地址
simple_map_init(s3c_nor_map); //簡單初始化
/* 3. 使用: 調用NOR FLASH協議層提供的函數來識別 */
printk(“use cfi_probe\n”);
s3c_nor_mtd = do_map_probe(“cfi_probe”, s3c_nor_map);
/*如果沒識別就用jedec*/
if (!s3c_nor_mtd)
{
printk(“use jedec_probe\n”);
s3c_nor_mtd = do_map_probe(“jedec_probe”, s3c_nor_map);
}
/*如果仍然沒事別就釋放掉,返回錯誤*/
if (!s3c_nor_mtd)
{
iounmap(s3c_nor_map-》virt);
kfree(s3c_nor_map);
return -EIO;
}
/* 4. add_mtd_partitions (添加分區)*/
add_mtd_partitions(s3c_nor_mtd, s3c_nor_parts, 2);
return 0;
}
static void s3c_nor_exit(void) //出口函數
{
del_mtd_partitions(s3c_nor_mtd);
iounmap(s3c_nor_map-》virt);
kfree(s3c_nor_map);
}
module_init(s3c_nor_init);
module_exit(s3c_nor_exit);
MODULE_LICENSE(“GPL”);
三。驅動分析
1. 分配map_info結構體
2. 設置: 物理基地址(phys), 大小(size), 位寬(bankwidth), 虛擬基地址(virt)
3. 使用: 調用NOR FLASH協議層提供的函數來識別
4. add_mtd_partitions (添加分區)
其實我們的這個驅動,主要把硬件上的差異性寫出來就可以了,大部分的工作內核已經幫我們做了?,F在我主要來分析第三步。cfi和jedec,這里主要分析cfi
/*NOR FLASH識別過程*/
do_map_probe(“cfi_probe”, s3c_nor_map);
drv = get_mtd_chip_driver(name)
ret = drv-》probe(map); // cfi_probe.c
cfi_probe
mtd_do_chip_probe(map, &cfi_chip_probe);
cfi = genprobe_ident_chips(map, cp);
genprobe_new_chip(map, cp, &cfi)
cp-》probe_chip(map, 0, NULL, cfi)
cfi_probe_chip
// 進入CFI模式
cfi_send_gen_cmd(0x98, 0x55, base, map, cfi, cfi-》device_type, NULL);
// 看是否能讀出“QRY”
qry_present(map,base,cfi)
我們進行的操作其實在協議層已經幫我們寫好了,我們需要提供的其實就是硬件上的差異。因為所有的nor都是支持這套協議的。
結語
關于NOR Flash的相關介紹就到這了,如有不足之處歡迎指正。
-
FlaSh
+關注
關注
10文章
1754瀏覽量
155731 -
存儲器
+關注
關注
39文章
7746瀏覽量
172007
發布評論請先 登錄
NAND FLASH與NOR FLASH的技術對比
STM32756G-EVAL2讀寫Nor FLASH的ID是一個固定值
Linux驅動開發筆記:NOR FLASH編寫實例
NAND Flash與NOR Flash的區別
關于NOR Flash的幾大應用領域淺析
關于S29GL256S系列并行nor flash的讀寫擦除操作實驗
NOR Flash和NAND FLASH的區別是什么
NAND Flash和NOR Flash的區別
nor flash和nand flash的區別 單片機是Nor還是Nand Flash?
SPI NOR FLASH是什么,與SPI NAND Flash的區別
NOR Flash和NAND flash有什么區別
NOR Flash讀寫原理及驅動
評論