nand flash讀寫 (三) (轉)
6)NAND 的寫操作
static int NF_WritePage(U32 block,U32 page,U8 *buffer)//寫Flash
{
int i;
U32 blockPage=(block<<5)+page;
U8 *bufPt=buffer;
NF_RSTECC();// Initialize ECC
NF_nFCE_L();
NF_CMD(0x0[q4]);//?????\\Read Mode 1
NF_CMD(0x80);// Write 1st command,資料輸入
NF_ADDR(0);// Column 0
NF_ADDR(blockPage&0xff);
NF_ADDR((blockPage>>8)&0xff);// Block & page num.
NF_ADDR((blockPage>>16)&0xff);
for(i=0;i<512;i++)
{
NF_WRDATA(*bufPt++);// Write one page to NFM from buffer
}
seBuf[1]=rNFECC1;
seBuf[2]=rNFECC2;
seBuf[5]=0xff;// Marking good block
for(i=0;i<16;i++)
{
NF_WRDATA(seBuf[i]);//
Write spare array(ECC and Mark)
}
NF_CMD(0x10);// Write 2nd command
for(i=0;i<10;i++);//tWB
= 100ns.
NF_WAITRB();//wait tPROG 200~500us;
NF_CMD(0x70);// Read status command
for(i=0;i<3;i++);//twhr=60ns
if
(NF_RDDATA()&0x1)
{
NF_nFCE_H();
Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
return 0;
}
else
{
NF_nFCE_H();
#if (WRITEVERIFY==1)
//return NF_VerifyPage(block,page,pPage);
#else
return 1;
#endif
}
}
以下討論一下NAND 裝置上所支援的檔案系統,大概現在有以下幾種:
A.JFFS2(沒有壞塊處理,支援大容量儲存的時候需要消耗大量的記憶體,大量的隨機訪問降低了NAND裝置的讀取效率)和YAFFS(速度快,但不支援檔案的壓縮和解壓)
B.支援DiskOnChip裝置的TRUEFFS(True Flash File System). TRUEFFS是M-Systems公司為其產品DiskOnChip開發的檔案系統,其規範並不開放。
C.由SSFDC(Solid State Floppy Disk Card)論壇定義的支援SM卡的DOS-FAT。SM卡的DOS-FAT檔案系統是由SSFDC論壇定義的,但它必須用在標準的塊裝置上。
對於大量用在各類儲存卡上的NAND 裝置而言,他們幾乎都採用FAT檔案系統,而在嵌入式作業系統下,還沒有驅動程式可以直接讓NAND裝置採用檔案系統,就技術角度來說,FAT檔案系統不是很適合NAND裝置,因為FAT檔案系統的檔案分割槽表需要不斷地擦寫,而NAND裝置的只能有限次的擦寫。
在上面已經很明顯的提到,NAND裝置存在壞塊,為和上層檔案系統介面,NAND裝置的驅動程式必須給檔案系統提供一個可靠的儲存空間,這就需要ECC(Error Corection Code)校驗,壞塊標註、地址對映等一系列的技術手段來達到可靠儲存目的。
SSFDC軟體規範中,詳細定義瞭如何利用NAND裝置每個頁中的冗餘資訊來實現上述功能。這個軟體規範中,很重要的一個概念就是塊的邏輯地址,它將在物理上可能不連續、不可靠的空間分配編號,為他們在邏輯空間上給系統檔案提供一個連續可靠的儲存空間。
表3給出了SSFDC規範中邏輯地址的標註方法。在系統初始化的時候,驅動程式先將所有的塊掃描一遍,讀出他們所對應的邏輯地址,並把邏輯地址和虛擬地址的對映表建好。系統執行時,驅動程式通過查詢對映表,找到需要訪問的邏輯地址所對應的實體地址然後進行資料讀寫。
表3 冗餘位元組定義
位元組序號 |
內容 |
位元組序號 |
內容 |
512 |
使用者定義資料 |
520 |
後256BECC校驗和 |
513 |
521 |
||
514 |
522 |
||
515 |
523 |
塊邏輯地址 |
|
516 |
資料狀態 |
524 |
|
517 |
塊狀態 |
525 |
前256BECC校驗和 |
518 |
塊邏輯地址1 |
526 |
|
519 |
527 |
表4給出了塊邏輯地址的存放格式,LA表示邏輯地址,P代表偶校驗位。邏輯地址只有10bit,代表只有1024bit的定址空間。而SSFDC規範將NAND裝置分成了多個zone,每個zone 內有1024塊,但這物理上的1024塊對映到邏輯空間只有1000塊,其他的24塊就作為備份使用,當有壞塊存在時,就可以以備份塊將其替換。
表4邏輯地址格式
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
0 |
0 |
0 |
1 |
0 |
LA9 |
LA8 |
LA7 |
第518523位元組 |
LA6 |
LA5 |
LA4 |
LA3 |
LA2 |
LA1 |
LA0 |
P |
第519524位元組 |
有了以上的軟體規範,就可以對NAND裝置寫出較標準的ECC校驗,並可以編寫檢測壞塊、標記壞塊、建立實體地址和邏輯地址的對映表的程式了。
static int NF_IsBadBlock(U32
block)
{
int i;
unsigned int blockPage;
U8 data;
blockPage=(block<<5);// For 2'nd cycle I/O[7:5]
NF_nFCE_L();
NF_CMD(0x50);// Spare array read command
NF_ADDR(blockPage&0xff);// The mark of bad block is in 0 page
NF_ADDR((blockPage>>8)&0xff);// For block number A[24:17]
NF_ADDR((blockPage>>16)&0xff);// For block number A[25]
for(i=0;i<10;i++);// wait tWB(100ns) //?????
NF_WAITRB();// Wait tR(max 12us)
data=NF_RDDATA();
NF_nFCE_H();
if(data!=0xff)
{
Uart_Printf("[block %d has been marked as a bad block(%x)]\n",block,data);
return 1;
}
else
{
return 0;
}
}
static int NF_MarkBadBlock(U32 block)//標記壞塊
{
int i;
U32 blockPage=(block<<5);
seBuf[0]=0xff;
seBuf[1]=0xff;
seBuf[2]=0xff;
NF_nFCE_L();
NF_CMD(0x50);//????
NF_CMD(0x80);// Write 1st command
NF_ADDR(0x0);// The mark of bad block is
NF_ADDR(blockPage&0xff);// marked 5th spare array
相關推薦
nand flash讀寫 (三) (轉)
6)NAND 的寫操作 static int NF_WritePage(U32 block,U32 page,U8 *buffer)//寫Flash { int i; U32 bloc
嵌入式bootloader開發之八----NAND Flash讀寫擦除操作實現(Tiny 6410)
概要: 本節主要記錄開發Tiny6410自帶的NAND FLASH的過程,實現了NAND FLASH的擦除,讀寫資料功能,但都只是簡單的實現而已,並沒有做精細而完整的實現,畢竟只是想學原理。 前言: 工欲善其事,必先利其器。在做開發之前,必須保證良
51微控制器控制K9K8G08U0C NAND Flash讀寫程式
網上看到這個原始碼,雖然感覺51用到nandflash的情況不多,但是可以借鑑理解nandflash的讀寫流程 #include< STC12C5A60S2.H> #include< intrins.h> #include < SMG.h>
NAND FLASH 讀寫操作 簡介
NAND FLASH 記憶體詳解與讀寫定址方式 一、記憶體詳解 NAND快閃記憶體陣列分為一系列128kB的區塊(block),這些區塊是 NAND器件中最小的可擦除實體。擦除一個區塊就是把所有的位(bit)設定為"1"(而所有位元組(byte)設定為FFh)
ESP8266學習筆記(2)——Flash讀寫
一、儲存晶片W25Q系列 w25q 系列生產的加工的商家很多,但是裡面的分佈和命名規則都是一樣的。比如華邦的w25q64,spi通訊介面,64就是指 64Mbit 也就是 8M 的容量。而我們平時的8266-12f的 32Mbit 就是 4M 容量。 以 w25q32
安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(三)-- 主從設定
零、寫在前面 為了嘗試新技術和業務需要,因此打算搞一套這樣的環境玩兒一下 作業系統及資料庫的安裝請見前兩篇一、理論依據 不再贅述我的硬體規劃等細節 這次僅用到兩臺虛擬機器,一主一
DM36x使用串列埠和NAND啟動完成NAND Flash燒寫(一)
背景:專案進行到最後階段,所有的啟動都需要放到NAND Flash晶片上。但是由於硬體設計,沒有新增網路和JTAG模組,所以常見的NFS和JTAG燒寫方式失效。於是,我們需要尋找可行的燒錄方式。 平臺: 作業系統:Ubuntu 10.04 開發板:DM36
FPGA學習心得及(flash讀寫,+lwip+資料傳送等問題)
前段時間應老闆的專案需求,對硬體絲毫不懂得我開始接觸edk硬體程式設計,感覺這段時間跟硬體打交道,自己都老了不少。首先,硬體程式設計編譯很慢,編譯一次有時候得10-20分鐘,尤其是用verilog寫得程式比較大的時候。其次,除錯非常麻煩,不能像利用c或者c#那樣斷點除錯了,
自動化day3---Python基礎(list、字典、元組、文件讀寫、字符串格式化)
int() 文件讀寫 移動 ace div 補齊 解決 讀一行 ext 1.list list的操作 #數組---list arraystus = [‘xiaohei‘,‘xiaobai‘,‘xiaolan‘]#計算機取值是從0開始的#0 1 2 3#下標 角標 索引
讀寫pcie配置空間(安裝lib庫)
readme.txt + pcie.c + in.txt +Makefile 可參考原始碼是: lspci readme.txt Please open the terminal in your linux system, then: 1.Please install
Qt下讀寫XML格式檔案(使用QDomDocument類)
簡述 XML是一種標記語言,被設計用來結構化儲存以及傳輸資訊,是一種常用的文件資料結構。 就我個人而言,Qt下讀寫XML格式檔案可以有三種方法: 一是使用純C++的rapidxml開源庫。優點是速度快,媲美strlen()的速度;缺點是處理中文比較麻煩,編碼只有ANSI格式。 二是使用Q
【人生苦短,我用python!】幾行python處理檔案裡面的重複內容(包括了讀寫檔案,過濾重複!)
The beauty of python 1 https://blog.csdn.net/dengyaolongacmblog/article/details/38016905 置頂 2014年07月21日 15:28:18 yaolongdeng 閱讀數:2189 標籤:
RT-Thread使用I2C讀寫eeprom例程(24c02)
實驗準備: 開發板:正點原子探索者 RT-Thread原始碼 env工具 env配置: 使能相關的uart,用於開啟控制檯 開啟I2C裝置: 實驗原始碼: #include <rtthread.h> #include <rtd
安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(四)-- MyCat讀寫分離
零、說在前面 先吐個槽,這點東西折騰了我四五天,最後還是一條告警拯救了我,下面進入正文 看了幾個MySQL的讀寫分離的中介軟體,貌似這個是比較流行的一個,雖然我不是BAT的粉絲,但是有好用的
C++ 檔案讀寫詳解(七)(ofstream,ifstream,fstream)
void fileRead() { using namespace std; ifstream fin; /** qwer:asdf:zxc:1234: gfd:jkl:mnb: */ //開啟檔案 fi
Java建立以及讀寫xml文件(dom方式)
package myXML; import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*;
檔案讀寫工具簡單實現(一)之java的UI介面視覺化畫圖/製作
現在和大家介紹下,我們簡單的介面工具開發,使用者選擇檔案,讀出部分想要檔案內容,滑鼠在大輸入框點選某一行就會顯示在其他輸入框中,然後在其他輸入框修改後內容,點寫入按鈕即可修改並顯示到大輸入框中,且原檔案對應剛剛選的改行內容;大概的介面如下,網路現在原因不能上傳圖片:選擇檔案按
C/C++ 關於如何讀寫ini配置檔案 (小結)
讀取 讀取字元 DWORD GetPrivateProfileString( LPCTSTR lpAppName, // INI檔案中的一個欄位名[節名]可以有很多個節名 LPCTSTR lpKeyName, // lpAppName 下的一個鍵名,也就是裡面具體
Java讀寫CSV格式檔案(opencsv)
一,讀取CSV格式檔案: import java.io.File; import java.io.FileReader; import java.util.List; import au.com.bytecode.opencsv.CSVReader; public c
安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(二)-- 資料庫安裝篇
零、寫在前面 為了嘗試新技術和業務需要,因此打算搞一套這樣的環境玩兒一下 伺服器的安裝請見上一篇一、硬體規劃 我用的是自己的本機(8核、16G),劃分出三臺虛擬機器(一主兩從--MyS