Thursday, September 29, 2011

[Flash]NOR FLASH應用-- Jedec V.S CFI

轉: http://tw.myblog.yahoo.com/chimei-015/article?mid=857&next=851&l=f&fid=33 
 
Flash做為一種非易失性存儲器,在原理、技術和結構上,與ROMPROMEPROMEEPROM存儲器有顯著的不同。它是一種可快速擦除可現場編程的快擦寫存儲器。這種特性決定了Flash做為BIOS、在線擦寫、掉電保護數據以及分區保護數據等場合有著廣泛的應用。
Flash存儲器特點
由於其內部結構的特殊性,Flash存儲器最主要的特點在於其內部狀態機(Internal State Machine)及指令序列(Command Sequences)的操作模式,因此Flash需要較復雜的軟件支持。
除了讀取數據(Read Array Data)以外的其它所有操作,如生產商IDManufacture ID)及器件IDDevice ID)識別,分區寫保護(Sector Protection/去寫保護(Sector Unprotection),擦除(chip erase/sector erase),寫數據/校驗,復位等操作都需要通過器件內部的指令寄存器(Command Register)啟動內嵌算法(embeded algorithms)來完成。
BCS / SCS
Intel從早期的8位閃存芯片28F008開始,就為閃存芯片的操作定義了操作規程和一套相應的命令,一般就稱為“ 28F 008” 或者“ 008” 。后來正式命名為閃存操作基本命令集,即BCS,其要點如下:
閃存芯片平時處於隨機讀出狀態,此時的閃存芯片就像普通的ROM芯片,訪問地址決定了具體的存儲單元;
除非芯片處於寫入狀態,往芯片任意一個單元寫都意味著向芯片發命令,因此是對其控制器的訪問,而不是對其存儲單元的訪問;
根據命令代碼的不同,閃存芯片內部的狀態機進入不同的狀態,從而可以進行不同的操作。
BCS中有以下幾條命令:
隨機讀出(Read Array)。向芯片的任意地址寫0xff,使芯片復位進入讀存儲陣列狀態,在此狀態下CPU可以想訪問普通內存那樣從閃存芯片隨機讀出。閃存芯片加電后的初始狀態就是隨機讀出狀態。
讀狀態寄存器(Read Status Register)。 向芯片的任意地址寫0x70,表示要求從芯片讀出其狀態寄存器,此后可以從芯片的任意地址讀出狀態寄存器的內容。
寫入(Program,要求寫入芯片的若干存儲單元。往目標塊起始地址寫0x40,表示要求進入寫模式,或者稱為編程模式。進入寫模式后,就可以對目標塊進行隨機寫入,就像寫靜態RAM一樣。對每個單元只能寫一次(要再次對某單元寫入,需要先對該單元所在的塊進行擦除操作后,才能再進行)。
清除狀態寄存器(Clear Status Register)。向芯片的任意地址寫0x50,表示要求清除狀態寄存器。
單字節或者字寫入。先向需要寫入的單元寫入0x400x10,然后寫入具體數據。
成塊擦除(Block Erase)。向目標塊內任意地址寫0x20(或者0x28),表示要求擦除芯片內一個塊的所有內容。
暫停擦除(Erase Suspends)。向目標塊內任意地址寫0xb0,表示要求暫停擦除操作。需要時,可以通過往目標塊內的任意地址寫0xd0來恢復擦除。
成塊擦除確認,或者繼續擦除。往目標塊內的任意地址寫0xd0,表示確認要求擦除芯片內一個塊的所有內容,或者在暫停擦除后恢復擦除操作。
每當向芯片發出命令時,狀態寄存器的最高位(bit 7)就會變成0,當操作完成后,該bit會被硬件置為1
隨著閃存技術的發展,Intel后來對BCS進行了擴展,稱為SCSScaleable Command Set),即可擴充命令集。其中增加了芯片加鎖(Set/Clear Lock Bit)、緩沖寫入。芯片配置、整片擦除操作等命令功能。
上面BCSSCS描述的操作只適用於Intel的閃存芯片,或者使用Intel BCS/SCS規範的芯片。
Jedec ID
在閃存技術發展的初期,只有Intel一家生產閃存芯片,產品單一。后來慢慢多起來,新投入閃存芯片生產的廠商往往使自己的產品與Intel兼容,所以IntelBCS就成為了事實上的標準。但是,隨著閃存芯片生產廠商的增加,閃存芯片種類和規格也越來越多,一方面導致BCS不夠用了,另一方面就是有的廠商使用了不同於BCS的規程。例如,同樣是讀取芯片ID,由AMD生產的芯片則需要向片上地址0寫入0xAA5。實際上,INTELAMD就是最主要的閃存芯片廠商。在這種情況下,特別是對於通用計算機系統,在對閃存芯片進行操作之前,首先要搞清這是由哪個廠商生產的什麼芯片。為此,就需要有一個中立、受所有閃存芯片廠商支持的手段,使得計算機軟件可以從芯片中讀取這些信息。於是,便有了所謂的“Jedec ID”以及相應當命令:
讀芯片IDRead ID)。往芯片任何地址寫0x90,表示要求從芯片讀出固化在芯片內的身份信息,如由誰生產,什麼型號等等,稱為“Jedec ID”。這些信息並不占用閃存芯片在內存空間的地址。此后,CPU可以從片上地址0開始逐個字節讀出這些信息。
CFI
Jedec ID所提供的信息實在是太少了。因此,公共閃存接口Common Flash Interface,CFI,便應運而生。這是由存儲芯片工業界定義的一種獲取閃存芯片物理會和結構參數的操作規程和標準。
CFI規定,各廠商可以使用自己的操作規程和命令集,但是必須有統一的編號,並且在軟件到查詢下提供這個編號。而且,閃存芯片可以同時支持兩套操作規程和命令集,讓軟件選擇使用。同時,又規定閃存芯片必須提供更多的信息,包括:芯片的電源電壓是多少,擦除/寫入操作是否需要額外的電源,如果需要是多少,芯片的容量有多大,分成幾個擦除塊,各種操作所需時間的典型值和最大值,等等。為此,還定義了一個用來提供詳細信息的標準數據結構,凡是支持CFI的閃存芯片在收到查詢時都應該能夠按照這個數據結構的格式提供信息,即CFI信息塊。此外,還可以與所支持的操作規程和命令集配套提供附加的參數和信息。
CFI 查詢的規程和命令如下:
向芯片地址0x55寫入0x98,然后從片上地址0x10開始讀出數據。如果讀出的內容依次為:“Q”“R”“Y”,則該芯片支持CFI
然后從芯片上連續的地址0x13 0x30讀出CFI信息塊的固定部分。
除了固定部分以外,后面還有一個無符號整數數組,其大小取決於芯片上的存儲區間划分成幾個擦除區間,數組中的每一個無符號整數都描述一個擦除區間。一個擦除區間中可以有若干個大小相同的擦除塊。
如果從地址0x150x16讀出的16位無符號短整數P0,則在片上地址P處還有一個主算法擴充表。這就是與主算法(即芯片中主要的操作規程和命令集)配套的參數和其他信息。
如果從地址0x190x20讀出的16位無符號短整數T0,則在片上地址T處還有一個次算法擴充表。這就是與次算法(即芯片所支持的另外一套操作規程和命令集)配套的參數和其他信息。

No comments:

Post a Comment