本發(fā)明涉及NAND存儲器領域,尤其涉及一種基于NAND存儲器的系統(tǒng)啟動方法及系統(tǒng)。
背景技術:
NAND存儲器(NAND FLASH)一種比較常用的存儲介質(zhì),適用于大量數(shù)據(jù)的存儲,在頻繁上傳或更新大文件的設備中更有市場,比如:MP3播放器、數(shù)碼相機和USB驅(qū)動器都使用NAND存儲器。NAND存儲器技術的發(fā)展方向是芯片更小、讀寫周期更長、電壓需求更低,這些改進將使NAND存儲器技術的應用更廣泛。
基于NAND存儲器的硬件特性:數(shù)據(jù)在讀寫時候相對容易錯誤,所以為了保證數(shù)據(jù)的正確性,必須要有對應的檢測和糾錯機制,此機制被叫做ECC(Error Correcting Code,錯誤檢查和糾正),NAND存儲器會存在壞的數(shù)據(jù)塊,因此,需要ECC來校驗讀取的數(shù)據(jù),以維持數(shù)據(jù)的完整性,NAND存儲器的每一個page上都包括冗余區(qū)域,該區(qū)域能存儲ECC代碼及其它像磨損評級或邏輯到物理塊映射之類的信息。同樣,由于NAND存儲器的多樣性,NAND存儲器的芯片啟動代碼中的ECC部分多采用芯片所支持的最高ECC,比如:全部采用80bit ECC,而實際NAND存儲器可能需要的是40bit ECC或60bit ECC,之所以盡可能采用最高ECC是為了簡化芯片啟動代碼,并保證芯片能兼容各種不同的NAND存儲器。
NAND存儲器中,幾個數(shù)據(jù)點電壓分布有可能會平移,只要這幾個數(shù)據(jù)點電壓分布沒有疊加就可以通過Read Retry模式恢復,從而保證能夠正確讀取NAND存儲器中的數(shù)據(jù)。Read Retry,是指NAND存儲器在讀數(shù)據(jù)出錯同時ECC又無法糾正的情況下,NAND存儲器內(nèi)部提供的一種重新讀取數(shù)據(jù)的方式,在重新讀取數(shù)據(jù)的時候需要設置新的Retry Level,即參考電壓,然后用不同的Retry Level再讀取數(shù)據(jù),不同的Retry Level由不同的Retry參數(shù)序列設置。
由于芯片啟動代碼是固化在芯片里面,后續(xù)沒有辦法修改,而NAND存儲器不間斷有新品上市,并且由于新制成的NAND存儲器的Read Retry的方法也會隨之變化,這時候芯片要啟動新的NAND存儲器就必須有對應的機制,來適應NAND存儲器的變化。
在現(xiàn)有的針對NAND存儲器的芯片啟動代碼中多數(shù)采用更高的ECC以及通用Retry Level多備份的方式來兼容具有不同Read Retry需求的NAND存儲器,以減小出錯概率。
技術實現(xiàn)要素:
本發(fā)明的目的是提供一種基于NAND存儲器的系統(tǒng)啟動方法及系統(tǒng),能夠自適應不同NAND存儲器的Read Retry需求,使芯片啟動代碼更好地兼容不同的NAND存儲器,從而解決在一些使用場景下,由于沒有對應的Read Retry而無法使NAND存儲器正常啟動的情況。
本發(fā)明提供的技術方案如下:
一種基于NAND存儲器的系統(tǒng)啟動方法,包括S10:NAND存儲器中Retry命令序列參數(shù)的讀取方法,包括步驟:步驟S100上電后,從NAND存儲器多個參數(shù)備份的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取數(shù)據(jù),若讀取數(shù)據(jù)成功,則執(zhí)行步驟S110;所述步驟S100還包括:步驟S101若讀取數(shù)據(jù)失敗,則繼續(xù)從下一個page里讀取數(shù)據(jù);其中,所述芯片啟動代碼包括:預設的ECC、格式和通用Retry Level;所述芯片啟動代碼的規(guī)則是指:預設的ECC和格式;所述參數(shù)包括:所述Retry命令序列參數(shù);步驟S110檢查所述讀取的數(shù)據(jù)是否是全ff,若是,則執(zhí)行步驟S101,若否,則執(zhí)行步驟S120;步驟S120判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼,若是,則所述讀取的數(shù)據(jù)為Retry命令序列參數(shù),執(zhí)行步驟S130;步驟S130對NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc計算并校驗,若校驗正確,則將所述Retry命令序列參數(shù)保存到系統(tǒng)內(nèi)存中,并執(zhí)行步驟S210;若校驗不正確,則未獲取正確的所述Retry命令序列參數(shù),直接執(zhí)行步驟S210;S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法,包括步驟:步驟S210從NAND存儲器燒錄有系統(tǒng)啟動代碼的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取所述系統(tǒng)啟動代碼;步驟S230若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)NAND存儲器中讀取的所述Retry命令序列參數(shù)設置新的Retry Level;步驟S240根據(jù)所述新的Retry Level再次讀取NAND存儲器中的所述系統(tǒng)啟動代碼;步驟S250當成功將NAND存儲器中的所述系統(tǒng)啟動代碼讀完后,跳到系統(tǒng)內(nèi)存中完成系統(tǒng)啟動。
進一步優(yōu)選地,所述S10:NAND存儲器中Retry命令序列參數(shù)的讀取方法中,所述步驟S120還包括:判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼,若否,則執(zhí)行步驟S200;所述S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法中,所述步驟S210之前還包括:步驟S200判斷所述讀取的數(shù)據(jù)是否為所述系統(tǒng)啟動代碼數(shù)據(jù),若是,則繼續(xù)執(zhí)行步驟S210,若否,則反饋所述錯誤信息給芯片啟動代碼,并執(zhí)行步驟S410;所述基于NAND存儲器的系統(tǒng)啟動方法,還包括S40:芯片啟動代碼接到錯誤信息反饋時的操作方法,包括步驟:步驟S410芯片啟動代碼跳到另一個啟動設備進行系統(tǒng)啟動。
進一步優(yōu)選地,所述S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法中,所述步驟S210和所述步驟S230之間還包括步驟:步驟S220若所述系統(tǒng)啟動代碼數(shù)據(jù)讀取失敗,判斷是否可以通過所述預設的ECC和通用Retry Level成功讀取所述系統(tǒng)啟動代碼數(shù)據(jù),若還是讀取失敗,則執(zhí)行步驟S230,若讀取成功,則執(zhí)行步驟S250。
進一步優(yōu)選地,所述S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法中,還包括:步驟S260若所述系統(tǒng)啟動代碼無法成功讀取,則反饋所述錯誤信息給芯片啟動代碼,并執(zhí)行步驟S410。
進一步優(yōu)選地,還包括S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法,包括步驟:步驟S300當系統(tǒng)啟動后,根據(jù)芯片啟動代碼的規(guī)則依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),若沒有讀取到所述Retry命令序列參數(shù),則執(zhí)行步驟S310;步驟S310讀取NAND存儲器的ID;步驟S320根據(jù)讀取的所述NAND存儲器的ID,獲取對應的所述Retry命令序列參數(shù)并保存在系統(tǒng)內(nèi)存中;步驟S340對系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc計算并校驗,若校驗正確,則在系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,按照所述Retry命令序列參數(shù)重新讀取數(shù)據(jù),若校驗不正確,則執(zhí)行步驟S310;步驟S350若讀取了所述NAND存儲器的ID,并獲取了對應的所述Retry命令序列參數(shù),在校驗正確后,根據(jù)芯片啟動代碼的規(guī)則,把所述校驗正確后的Retry命令序列參數(shù)依次存入NAND存儲器的各個page中進行參數(shù)備份。
進一步優(yōu)選地,所述S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法中,所述步驟S320具體包括:步驟S321根據(jù)讀取的所述NAND存儲器的ID,獲取對應的Retry規(guī)則;步驟S322將所述Retry規(guī)則根據(jù)預設規(guī)則轉(zhuǎn)化為對應的Retry參數(shù)序列;步驟S323根據(jù)所述Retry參數(shù)序列,依次設置對應的Retry Level;步驟S324將所述Retry Level轉(zhuǎn)化為對應的NAND控制器的Retry命令序列參數(shù)。
進一步優(yōu)選地,所述S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法中,所述步驟S320和所述步驟S340之間還包括:步驟S330計算所述Retry命令序列參數(shù)的第一crc,并把計算的所述第一crc放在所述Retry命令序列參數(shù)的頭部。
進一步優(yōu)選地,所述S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法中,所述步驟S340中對所述Retry命令序列參數(shù)進行crc計算并校驗具體包括:步驟S341計算系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)的第二crc;步驟S342獲取所述系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)中的頭部的所述第一crc;步驟S343將所述第一crc與所述第二crc進行比較,若一致,則校驗正確,若不一致,則校驗不正確。
本發(fā)明還提供一種系統(tǒng),包括:NAND存儲器、中央處理器、系統(tǒng)內(nèi)存;所述NAND存儲器與所述中央處理器電連接;所述系統(tǒng)內(nèi)存與所述中央處理器電連接;所述NAND存儲器包括:page,存儲有參數(shù),以及,系統(tǒng)啟動代碼;其中,所述參數(shù)包括:Retry命令序列參數(shù);所述系統(tǒng)內(nèi)存,進一步用于若從NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc校驗正確,則將所述Retry命令序列參數(shù)保存到系統(tǒng)內(nèi)存中;所述中央處理器包括:數(shù)據(jù)讀取模塊,從所述NAND存儲器多個參數(shù)備份的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取數(shù)據(jù);若讀取數(shù)據(jù)失敗,則繼續(xù)從下一個page里讀取數(shù)據(jù);以及,從NAND存儲器燒錄有系統(tǒng)啟動代碼的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取所述系統(tǒng)啟動代碼;以及,若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)所述Retry命令序列參數(shù)設置的新的Retry Level再次讀取NAND存儲器中的所述系統(tǒng)啟動代碼;其中,所述芯片啟動代碼包括:預設的ECC、格式和通用Retry Level;所述芯片啟動代碼的規(guī)則包括:預設的ECC和格式;數(shù)據(jù)判斷模塊,檢查所述讀取的數(shù)據(jù)是否是全ff;以及,若所述讀取的數(shù)據(jù)不是全ff,則進一步判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼;計算校驗模塊,對NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc計算并校驗;設置模塊,若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)NAND存儲器中讀取的所述Retry命令序列參數(shù)設置新的Retry Level;啟動模塊,當成功將NAND存儲器中的所述系統(tǒng)啟動代碼讀完后,跳到所述系統(tǒng)內(nèi)存中完成系統(tǒng)啟動。
進一步優(yōu)選地,所述數(shù)據(jù)判斷模塊,若所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼不是參數(shù)特征碼時,進一步用于判斷所述讀取的數(shù)據(jù)是否為所述系統(tǒng)啟動代碼數(shù)據(jù);所述中央處理器還包括:錯誤反饋模塊,若所述讀取的數(shù)據(jù)不是所述系統(tǒng)啟動代碼,則反饋所述錯誤信息給芯片啟動代碼;所述啟動模塊,進一步用于若接收到所述錯誤信息,芯片啟動代碼跳到另一個啟動設備進行系統(tǒng)啟動。
進一步優(yōu)選地,所述中央處理器還包括:讀取判斷模塊,若所述系統(tǒng)啟動代碼數(shù)據(jù)讀取失敗,所述讀取判斷模塊判斷是否可以通過所述預設的ECC和通用Retry Level成功讀取所述系統(tǒng)啟動代碼數(shù)據(jù)。
進一步優(yōu)選地,錯誤反饋模塊,進一步用于若所述系統(tǒng)啟動代碼無法成功讀取,則反饋所述錯誤信息給芯片啟動代碼。
進一步優(yōu)選地,所述數(shù)據(jù)讀取模塊,當系統(tǒng)啟動后,進一步用于根據(jù)芯片啟動代碼的規(guī)則依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù);以及,若沒有讀取到所述Retry命令序列參數(shù),則讀取NAND存儲器的ID;以及,若系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc校驗正確時,在系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,按照所述Retry命令序列參數(shù)重新讀取數(shù)據(jù);所述中央處理器還包括:參數(shù)獲取模塊,若系統(tǒng)內(nèi)存中沒有讀取到所述Retry命令序列參數(shù)或?qū)ο到y(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc檢驗不正確時,根據(jù)讀取的所述NAND存儲器的ID,獲取對應的所述Retry命令序列參數(shù);所述計算校驗模塊,進一步用于對系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc計算并校驗;所述系統(tǒng)內(nèi)存,進一步用于將根據(jù)讀取的所述NAND存儲器的ID獲取的對應的所述Retry命令序列參數(shù)保存到所述系統(tǒng)內(nèi)存中;所述page,若讀取了所述NAND存儲器的ID,并獲取了對應的所述Retry命令序列參數(shù),在校驗正確后,進一步用于根據(jù)芯片啟動代碼的規(guī)則,把校驗正確后的所述Retry命令序列參數(shù)依次存入NAND存儲器的各個page中進行參數(shù)備份。
進一步優(yōu)選地,所述參數(shù)獲取模塊具體包括:規(guī)則獲取子模塊,根據(jù)讀取的所述NAND存儲器的ID,獲取對應的Retry規(guī)則;序列轉(zhuǎn)化子模塊,將所述Retry規(guī)則根據(jù)預設規(guī)則轉(zhuǎn)化為對應的Retry參數(shù)序列;設置子模塊,根據(jù)所述Retry參數(shù)序列,依次設置對應的Retry Level;參數(shù)轉(zhuǎn)化子模塊,將所述Retry Level轉(zhuǎn)化為對應的NAND控制器的Retry命令序列參數(shù)。
進一步優(yōu)選地,所述計算校驗模塊,進一步用于計算所述Retry命令序列參數(shù)的第一crc,并把計算的所述第一crc放在所述Retry命令序列參數(shù)的頭部。
進一步優(yōu)選地,所述計算校驗模塊包括:計算子模塊,計算系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)的第二crc;獲取子模塊,獲取所述系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)中的頭部的所述第一crc;檢驗子模塊,將所述第一crc與所述第二crc進行比較,若一致,則校驗正確,若不一致,則校驗不正確。
與現(xiàn)有技術相比,本發(fā)明的有益效果在于:
1、本發(fā)明的NAND存儲器中存儲有其適應其自身的Retry命令序列參數(shù),在讀取NAND存儲器的數(shù)據(jù)(例如:系統(tǒng)啟動代碼)出錯、無法通過芯片啟動代碼中的ECC及通用Retry Level進行數(shù)據(jù)校正、恢復時,可以根據(jù)NAND存儲器中保存的Retry命令序列參數(shù)設置新的Retry Level,從而在Read Retry模式中,重新讀取NAND存儲器中的數(shù)據(jù),提高了固有的芯片啟動代碼對不同的NAND存儲器的兼容性,也降低了NAND存儲器無法正常啟動的概率。
2、在讀取NAND存儲器中的數(shù)據(jù)時,需要解析到最后才能知道讀取的數(shù)據(jù)的類型,一般來說,由于NAND存儲器中存有針對其自身型號的Retry命令序列參數(shù),因此,第一步會先對讀取的數(shù)據(jù)進行判斷,檢索NAND存儲器中是否存在此Retry命令序列參數(shù),如果存在的話,就先讀取這個Retry命令序列參數(shù),校驗正確后將其保存到系統(tǒng)內(nèi)存中,然后再讀取NAND存儲器中的系統(tǒng)啟動代碼,若讀取出錯,就根據(jù)讀取到的Retry命令序列參數(shù)設置新的Retry Level,重新讀取系統(tǒng)啟動代碼,完成數(shù)據(jù)的Read Retry;若讀取的數(shù)據(jù)是系統(tǒng)啟動代碼,則說明NAND存儲器中沒有與其對應的Retry命令序列參數(shù),只能先讀取系統(tǒng)啟動代碼、使系統(tǒng)啟動后,在后續(xù)過程中根據(jù)NAND存儲器的ID得到其對應的Retry命令序列參數(shù)后,再備份到NAND存儲器的page中。這樣在下次從此NAND存儲器進行系統(tǒng)啟動時,就可以用此Retry命令序列參數(shù)進行Read Retry,提高系統(tǒng)對NAND存儲器的兼容性。
3、在芯片啟動代碼中有預設的ECC和通用Retry Level,在讀取NAND存儲器的數(shù)據(jù)出錯時,會根據(jù)情況通過預設的ECC和通用Retry Level進行校正,這里的通用Retry Level是因化在芯片啟動代碼中的,并不是根據(jù)NAND存儲器的ID量身打造的,因此,對于一些新出的或比較冷門的NAND存儲器沒用,若讀取數(shù)據(jù)出錯時,無法通過預設的ECC進行校正的話,可能也無法利用通用Retry Level進行Read Retry,也就無法從NAND存儲器中讀取正確的數(shù)據(jù),導致NAND存儲器無法正常啟動,也可以理解為NAND存儲器不兼容。
4、在通過NAND存儲器進行系統(tǒng)啟動過程中,若NAND存儲器中讀取的數(shù)據(jù)既不是Retry命令序列參數(shù)也不是系統(tǒng)啟動代碼,則說明操作過程中存在錯誤,也就無法從NAND存儲器進行系統(tǒng)啟動,這時候就會反饋錯誤信息給芯片啟動代碼,保證芯片啟動代碼可以從另一個啟動設備進行系統(tǒng)啟動。
5、當系統(tǒng)啟動后,會先根據(jù)芯片啟動代碼的規(guī)則讀取先前保存在系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),若沒有講到此Retry命令序列參數(shù),則說明NAND存儲器中沒有與其對應的Retry命令序列參數(shù),因此,會讀取當前NAND存儲器的ID,獲取其對應的Retry命令序列參數(shù),先保存在系統(tǒng)內(nèi)存中,然后經(jīng)過計算并校驗正確后,再將其備份到NAND存儲器的page中。當下次從此NAND存儲器進行系統(tǒng)啟動時,當讀取其存儲的數(shù)據(jù)出錯又無法通過預設的ECC和通用Retry Level進行校正時,可以多一種數(shù)據(jù)讀取、校正方法,即通過此Retry命令序列參數(shù)進行Read Retry,提高NAND存儲器與芯片啟動代碼的兼容性。
6、根據(jù)NAND存儲器的ID,首先獲取的Retry規(guī)則,每個NAND存儲器的Retry規(guī)則會有所不同,因此需要將它們根據(jù)預設的規(guī)則轉(zhuǎn)換成同一格式的Retry參數(shù)序列;轉(zhuǎn)換成相同規(guī)則的Retry參數(shù)序列后,就可以設置對應的Retry Level,由于從NAND存儲器中讀取數(shù)據(jù)需要芯片中對應的NAND存儲器的控制器進行控制,因此,需要將此Retry Level再次轉(zhuǎn)換為此控制器可以識別的Retry命令序列參數(shù)進行保存;當Retry命令序列參數(shù)經(jīng)過校驗正確后,在讀取數(shù)據(jù)出錯時,NAND存儲器的控制器可以執(zhí)行此Retry命令序列參數(shù),設置新的Retry Level重新讀取數(shù)據(jù),完成Read Retry。
7、當系統(tǒng)啟動后,會再次對系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)進行計算其的第一crc,并把此第一crc放在Retry命令序列參數(shù)的頭部,為后續(xù)讀取到此Retry命令序列參數(shù)時進行計算并校驗時,提供比對基礎。
8、在系統(tǒng)內(nèi)存中讀取到Retry命令序列參數(shù)時,會先計算讀取到的Retry命令序列參數(shù)的第二crc,然后再將此第二crc與Retry命令序列參數(shù)的頭部的第一crc進行比較,若一致,則校驗正確;在芯片啟動代碼讀取NAND存儲器中的Retry命令序列參數(shù)時,進行計算并校驗的過程與此相似。
本發(fā)明的基于NAND存儲器的系統(tǒng)啟動方法及系統(tǒng),根據(jù)NAND存儲器的ID,將其對應的Retry命令序列參數(shù)備份到NAND存儲器的各個page中,在系統(tǒng)啟動過程中,若讀取NAND存儲器中的數(shù)據(jù)出錯,又無法通過預設的ECC和通用Retry Level校正的情況下,多了一種保證讀取數(shù)據(jù)成功的方法,利用與NAND存儲器本身對應的Retry命令序列參數(shù)設置新的Retry Level,重新讀取數(shù)據(jù),進行Read Retry,大大提高了固有的芯片啟動代碼對NAND存儲器的兼容性,從而解決在一些使用場景下,由于沒有合適的Retry命令序列參數(shù)而導致從NAND存儲器進行系統(tǒng)啟動失敗的情況。
附圖說明
下面將以明確易懂的方式,結合附圖說明優(yōu)選實施方式,對一種基于NAND存儲器的系統(tǒng)啟動方法及系統(tǒng)的上述特性、技術特征、優(yōu)點及其實現(xiàn)方式予以進一步說明。
圖1是本發(fā)明基于NAND存儲器的系統(tǒng)啟動方法一個實施例的流程圖;
圖2是本發(fā)明基于NAND存儲器的系統(tǒng)啟動方法另一個實施例的流程圖;
圖3是本發(fā)明基于NAND存儲器的系統(tǒng)啟動方法另一個實施例的流程圖;
圖4是本發(fā)明系統(tǒng)一個實施例的結構示意圖;
圖5是本發(fā)明系統(tǒng)另一個實施例的結構示意圖。
附圖標號說明:
100.NAND存儲器,110.page,200.中央處理器,210.數(shù)據(jù)讀取模塊,220.數(shù)據(jù)判斷模塊,230.計算校驗模塊,231.計算子模塊,232.獲取子模塊,233.校驗子模塊,240.設置模塊,250.啟動模塊,260.錯誤反饋模塊,270.讀取判斷模塊,280.參數(shù)獲取模塊,281.規(guī)則獲取子模塊,282.序列轉(zhuǎn)化子模塊,283.設置子模塊,284.參數(shù)轉(zhuǎn)化子模塊,300.系統(tǒng)內(nèi)存。
具體實施方式
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對照附圖說明本發(fā)明的具體實施方式。顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖,并獲得其他的實施方式。
為使圖面簡潔,各圖中只示意性地表示出了與本發(fā)明相關的部分,它們并不代表其作為產(chǎn)品的實際結構。另外,以使圖面簡潔便于理解,在有些圖中具有相同結構或功能的部件,僅示意性地繪示了其中的一個,或僅標出了其中的一個。在本文中,“一個”不僅表示“僅此一個”,也可以表示“多于一個”的情形。
在本發(fā)明的一個實施例中,如圖1所示,一種基于NAND存儲器的系統(tǒng)啟動方法,包括S10:NAND存儲器中Retry命令序列參數(shù)的讀取方法,包括步驟:步驟S100上電后,從NAND存儲器多個參數(shù)備份的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取數(shù)據(jù),若讀取數(shù)據(jù)成功,則執(zhí)行步驟S110;所述步驟S100還包括:步驟S101若讀取數(shù)據(jù)失敗,則繼續(xù)從下一個page里讀取數(shù)據(jù);其中,所述芯片啟動代碼包括:預設的ECC、格式和通用Retry Level;所述芯片啟動代碼的規(guī)則是指:預設的ECC和格式;所述參數(shù)包括:所述Retry命令序列參數(shù);步驟S110檢查所述讀取的數(shù)據(jù)是否是全ff,若是,則執(zhí)行步驟S101,若否,則執(zhí)行步驟S120;步驟S120判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼,若是,則所述讀取的數(shù)據(jù)為Retry命令序列參數(shù),執(zhí)行步驟S130;步驟S130對NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc計算并校驗,若校驗正確,則將所述Retry命令序列參數(shù)保存到系統(tǒng)內(nèi)存中,并執(zhí)行步驟S210;若校驗不正確,則未獲取正確的所述Retry命令序列參數(shù),直接執(zhí)行步驟S210;S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法,包括步驟:步驟S210從NAND存儲器燒錄有系統(tǒng)啟動代碼的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取所述系統(tǒng)啟動代碼;步驟S230若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)NAND存儲器中讀取的所述Retry命令序列參數(shù)設置新的Retry Level;步驟S240根據(jù)所述新的Retry Level再次讀取NAND存儲器中的所述系統(tǒng)啟動代碼;步驟S250當成功將NAND存儲器中的所述系統(tǒng)啟動代碼讀完后,跳到系統(tǒng)內(nèi)存中完成系統(tǒng)啟動。
具體的,NAND存儲器的數(shù)據(jù)存儲結構分層為:塊(block),塊又分為頁(page),可以理解為1設備(device)=A塊(block);1塊=B頁/行(page/row);1頁=C字節(jié)=數(shù)據(jù)區(qū)域(D字節(jié))+冗余區(qū)域(E字節(jié)),這里的A/B/C/D/E是指代數(shù)字。由于NAND存儲器的多樣性,其block的數(shù)量不一樣,導致后續(xù)的page大小也不固定,為了簡化芯片啟動代碼,控制NAND存儲器的芯片啟動代碼多采用page short mode,page short mode是指每個page并不寫滿,比如一個8K大小的page,只寫入1K的有效數(shù)據(jù),同樣4K、16K等的page都按照1K寫入有效數(shù)據(jù),這樣根據(jù)芯片啟動代碼讀取NAND存儲器中的數(shù)據(jù)時并不需要讀取NAND的ID來確認page的大小,而只要依次每個page讀1K的數(shù)據(jù)就可以保證有效數(shù)據(jù)的讀取。根據(jù)芯片啟動代碼的規(guī)則中的格式,就可以理解為在每個page中讀取1K的數(shù)據(jù)這種方式來讀取NAND存儲器中的數(shù)據(jù)。
從NAND存儲器進行的系統(tǒng)啟動,在上電后,首先是想要讀取NAND存儲器中的Retry命令序列參數(shù),讀取到數(shù)據(jù)后,先會判斷讀取的數(shù)據(jù)是否是全ff,全ff意味著并沒有讀取到有效數(shù)據(jù),即當前的page并沒有寫入數(shù)據(jù),因此需要快速跳到另外block中的page里重新讀取數(shù)據(jù),具體的操作過程例如:可以將page跳躍128個后再讀取數(shù)據(jù)。
雖然一開始想要讀取的是Retry命令序列參數(shù),但是只有當讀取的數(shù)據(jù)解析到最后時才知道它的數(shù)據(jù)類型,若它的頭部數(shù)據(jù)特征碼為參數(shù)特征碼,則說明讀取的數(shù)據(jù)為Retry命令序列參數(shù);這時候,就會對讀取的Retry命令序列參數(shù)進行crc(Cyclic Redundancy Check,循環(huán)冗余校驗)計算,即計算從NAND存儲器中讀取的Retry命令序列參數(shù)的第二crc,并與其頭部中的第一crc進行比較,若一致,則校驗成功,這一步的校驗是為了保證讀取到的Retry命令序列參數(shù)的正確性,只有它正確才能保證后續(xù)利用此Retry命令序列參數(shù)進行Read Retry的時候成功讀取數(shù)據(jù)。在校驗正確后,會將此Retry命令序列參數(shù)保存到系統(tǒng)內(nèi)存中,為后續(xù)系統(tǒng)啟動后讀取數(shù)據(jù)出錯時提供Read Retry的機會。crc是一種根據(jù)網(wǎng)絡數(shù)據(jù)包或電腦文件等數(shù)據(jù)產(chǎn)生簡短固定位數(shù)校驗碼的散列函數(shù),主要用來檢測或校驗數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯誤。
當成功獲取到正確的Retry命令序列參數(shù)后,會繼續(xù)讀取存儲在NAND存儲器中的系統(tǒng)啟動代碼,在讀取系統(tǒng)啟動代碼出錯時,會根據(jù)讀取到的Retry命令序列參數(shù)進入Read Retry模式,根據(jù)讀取到的Retry命令序列參數(shù)設置新的Retry Level,再用這些新的Retry Level來嘗試重新讀取系統(tǒng)啟動代碼,由于這里的Retry命令序列參數(shù)是特別針對當前NAND存儲器本身而存在的,因此讀取數(shù)據(jù)成功的機率大大提高;當成功將NAND存儲器中的所述系統(tǒng)啟動代碼讀完后,就跳到系統(tǒng)內(nèi)存中完成系統(tǒng)啟動。
優(yōu)選地,所述S10:NAND存儲器中Retry命令序列參數(shù)的讀取方法中,所述步驟S120還包括:判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼,若否,則執(zhí)行步驟S200;所述S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法中,所述步驟S210之前還包括:步驟S200判斷所述讀取的數(shù)據(jù)是否為所述系統(tǒng)啟動代碼數(shù)據(jù),若是,則繼續(xù)執(zhí)行步驟S210,若否,則反饋所述錯誤信息給芯片啟動代碼,并執(zhí)行步驟S410;所述基于NAND存儲器的系統(tǒng)啟動方法,還包括S40:芯片啟動代碼接到錯誤信息反饋時的操作方法,包括步驟:步驟S410芯片啟動代碼跳到另一個啟動設備進行系統(tǒng)啟動。
具體的,當對上電后一開始從NAND存儲器中讀取的數(shù)據(jù)進行判斷,發(fā)現(xiàn)它不是Retry命令序列參數(shù),而是系統(tǒng)啟動代碼時,則說明NAND存儲器中不存在與此NAND存儲器相適應的Retry命令序列參數(shù),跳過讀取Retry命令序列參數(shù)的步驟,直接讀取系統(tǒng)啟動代碼;若發(fā)現(xiàn)讀取的數(shù)據(jù)既不是Retry命令序列參數(shù),也不是系統(tǒng)啟動代碼,則說明讀取數(shù)據(jù)出現(xiàn)錯誤,因此,需要將錯誤信息反饋給芯片啟動代碼,讓芯片啟動代碼從另一個啟動設備進行系統(tǒng)啟動。
優(yōu)選地,所述S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法中,所述步驟S210和所述步驟S230之間還包括步驟:步驟S220若所述系統(tǒng)啟動代碼數(shù)據(jù)讀取失敗,判斷是否可以通過所述預設的ECC和通用Retry Level成功讀取所述系統(tǒng)啟動代碼數(shù)據(jù),若還是讀取失敗,則執(zhí)行步驟S230,若讀取成功,則執(zhí)行步驟S250。
具體的,芯片啟動代碼中包括了預設的ECC和通用Retry Level,當從NAND存儲器中讀取數(shù)據(jù)(系統(tǒng)啟動代碼也是數(shù)據(jù)的一種)出錯時,會先通過預設的ECC進行校正,若不行,會再通過通用Retry Level重新讀取數(shù)據(jù),預設的ECC和通用Retry Level都是包含在芯片啟動代碼中的,而芯片啟動代碼是固化的,不管有沒有讀取到NAND存儲器自適應的Retry命令序列參數(shù),都會通過預設的ECC和通用Retry Level進行數(shù)據(jù)校正,若通過此讀取數(shù)據(jù)成功,則無需利用讀取的Retry命令序列參數(shù)重新讀取數(shù)據(jù)。
優(yōu)選地,S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法中,還包括:步驟S260若所述系統(tǒng)啟動代碼無法成功讀取,則反饋所述錯誤信息給芯片啟動代碼,并執(zhí)行步驟S410。
具體的,即使有適應NAND存儲器本身的Retry命令序列參數(shù),也不能保證每次一定能成功讀取NAND存儲器中的數(shù)據(jù)。因此,在從NAND存儲器進行系統(tǒng)啟動時,若碰到無法成功讀取NAND存儲器中的系統(tǒng)啟動代碼時,會將錯誤信息反饋芯片啟動代碼,當芯片啟動接收到錯誤信息反饋時,會及時從下一個啟動設備進行啟動,保證成功啟動系統(tǒng)。
優(yōu)選地,還包括S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法,包括步驟:步驟S300當系統(tǒng)啟動后,根據(jù)芯片啟動代碼的規(guī)則依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),若沒有讀取到所述Retry命令序列參數(shù),則執(zhí)行步驟S310;步驟S310讀取NAND存儲器的ID;步驟S320根據(jù)讀取的所述NAND存儲器的ID,獲取對應的所述Retry命令序列參數(shù)并保存在系統(tǒng)內(nèi)存中;步驟S340對系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc計算并校驗,若校驗正確,則在系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,按照所述Retry命令序列參數(shù)重新讀取數(shù)據(jù),若校驗不正確,則執(zhí)行步驟S310;步驟S350根據(jù)芯片啟動代碼的規(guī)則,把所述Retry命令序列參數(shù)依次存入NAND存儲器的各個page中進行參數(shù)備份。
優(yōu)選地,所述S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法中,所述步驟S320具體包括:步驟S321根據(jù)讀取的所述NAND存儲器的ID,獲取對應的Retry規(guī)則;步驟S322將所述Retry規(guī)則根據(jù)預設規(guī)則轉(zhuǎn)化為對應的Retry參數(shù)序列;步驟S323根據(jù)所述Retry參數(shù)序列,依次設置對應的Retry Level;步驟S324將所述Retry Level轉(zhuǎn)化為對應的NAND控制器的Retry命令序列參數(shù)。
具體的,上述S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法是中系統(tǒng)內(nèi)存中運行的,此與前面在NAND存儲器中讀取數(shù)據(jù)(例如:Retry命令序列參數(shù)和系統(tǒng)啟動代碼)時的運行空間不同,因此,在系統(tǒng)啟動后,會再次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),并進行計算及校驗,校驗正確后,在后續(xù)系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,利用此Retry命令序列參數(shù)設置新的Retry Level來重新讀取數(shù)據(jù),提高數(shù)據(jù)讀取的成功率。當沒有讀取到系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),說明在前面讀取NAND存儲器中的數(shù)據(jù)時沒有讀取到或者沒有讀取到正確的Retry命令序列參數(shù),因此需要將與NADN存儲器的ID對應的Retry命令序列參數(shù)燒錄到NAND存儲器中,具體的步驟為:
讀取當前系統(tǒng)中NAND存儲器的ID,然后根據(jù)此ID獲取對應的Retry規(guī)則,每個NAND存儲器都有其自己的規(guī)則,需要將它們轉(zhuǎn)換為同一種規(guī)則才可以實現(xiàn)后續(xù)的操作;故,將獲取的Retry規(guī)則根據(jù)預設規(guī)則轉(zhuǎn)化為對應的Retry參數(shù)序列,這里的預設規(guī)則是本領域技術人員通用的規(guī)則,在這里不做具體描述;然后就可以根據(jù)此Retry參數(shù)序列依次設置對應的Retry Level,為后續(xù)數(shù)據(jù)讀取出錯時,進行Read Retry模式打下基礎;之所以要將Retry Level轉(zhuǎn)換為NAND控制器(NAND存儲器的控制器)對應的Retry命令序列參數(shù)是因為NAND存儲器是需要由NAND控制器來控制讀寫數(shù)據(jù)的,因此,需要轉(zhuǎn)換成NAND控制器可以識別的代碼(即,Retry命令序列參數(shù)),在獲取了NAND存儲器對應的Retry命令序列參數(shù)后,需要將此Retry命令序列參數(shù)保存在系統(tǒng)內(nèi)存中,為后續(xù)進行校驗提供基礎。系統(tǒng)內(nèi)存中的數(shù)據(jù)都是芯片啟動代碼從NAND存儲器搬運到系統(tǒng)內(nèi)存中的,這些的數(shù)據(jù)的規(guī)則也符合NAND存儲器中的規(guī)則,因此,在系統(tǒng)內(nèi)存中讀取這些數(shù)據(jù)出錯時,可以通過Retry命令序列參數(shù)對其進行Read Retry。
當讀取到系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)時,需要對其進行crc計算并校驗,因系統(tǒng)啟動前和系統(tǒng)啟動后的運行空間不同,在搬運數(shù)據(jù)過程中也可能出錯,導致數(shù)據(jù)丟失等問題,所以這里需要再次對讀取到的Retry命令序列參數(shù)進行校驗,保證其正確性。若校驗正確,則在后續(xù)系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,可以通過此Retry命令序列參數(shù)進入Read Retry模式,重新讀取數(shù)據(jù),提高系統(tǒng)讀取數(shù)據(jù)的成功率。
有兩種情況需要對NAND存儲器燒錄Retry命令序列參數(shù),一種是NAND存儲器當中本身就沒有Retry命令序列參數(shù),即在系統(tǒng)啟動后,按照芯片啟動代碼的規(guī)則依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),但沒有讀取到所述Retry命令序列參數(shù);另一種是在系統(tǒng)內(nèi)存中讀取到了Retry依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),若沒有讀取到所述Retry命令序列參數(shù),但在后續(xù)計算校驗過程中校驗不正確,這種情況也是需要對NAND存儲器重新燒錄Retry命令序列參數(shù)??偟膩碚f,就是經(jīng)過了查找NAND存儲器的ID,并獲取了對應的Retry命令序列參數(shù)并經(jīng)過校驗正確后,就需要向NAND存儲器各個page存儲此校驗正確后的Retry命令序列參數(shù)進行參數(shù)備份。
優(yōu)選地,所述S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法中,所述步驟S320和所述步驟S340之間還包括:步驟S330計算所述Retry命令序列參數(shù)的第一crc,并把計算的所述第一crc放在所述Retry命令序列參數(shù)的頭部。
優(yōu)選地,所述S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法中,所述步驟S340中對所述Retry命令序列參數(shù)進行crc計算并校驗具體包括:步驟S341計算系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)的第二crc;步驟S342獲取所述系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)中的頭部的所述第一crc;步驟S343將所述第一crc與所述第二crc進行比較,若一致,則校驗正確,若不一致,則校驗不正確。
具體的,當獲取了NAND存儲器的ID對應的Retry命令序列參數(shù),需要計算其第一crc并放在其頭部,為后續(xù)進行crc計算并校驗提供比對基礎。
對在系統(tǒng)內(nèi)存中讀取到的Retry命令序列參數(shù)進行crc計算,得到第二crc,并把這第二crc跟Retry命令序列參數(shù)頭部中的第一crc比較,若一致,則校驗正確,確定當前讀取的Retry命令序列參數(shù)是正確的參數(shù),保證了后續(xù)數(shù)據(jù)讀取出錯時可以有正確的Retry Level來重新讀取。
在本發(fā)明的另一個實施例中,如圖2、圖3所示,一種基于NAND存儲器的系統(tǒng)啟動方法,包括S10:NAND存儲器中Retry命令序列參數(shù)的讀取方法,包括步驟:步驟S100上電后,從NAND存儲器多個參數(shù)備份的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取數(shù)據(jù),若讀取數(shù)據(jù)成功,則執(zhí)行步驟S110;所述步驟S100還包括:步驟S101若讀取數(shù)據(jù)失敗,則繼續(xù)從下一個page里讀取數(shù)據(jù);其中,所述芯片啟動代碼包括:預設的ECC、格式和通用Retry Level;所述芯片啟動代碼的規(guī)則是指:預設的ECC和格式;所述參數(shù)包括:所述Retry命令序列參數(shù);步驟S110檢查所述讀取的數(shù)據(jù)是否是全ff,若是,則執(zhí)行步驟S101,若否,則執(zhí)行步驟S120;步驟S120判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼,若是,則所述讀取的數(shù)據(jù)為Retry命令序列參數(shù),執(zhí)行步驟S130,若否,則執(zhí)行步驟S200;步驟S130對NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc計算并校驗,若校驗正確,則將所述Retry命令序列參數(shù)保存到系統(tǒng)內(nèi)存中,并執(zhí)行步驟S210;若校驗不正確,則未獲取正確的所述Retry命令序列參數(shù),直接執(zhí)行步驟S210;S20:NAND存儲器中系統(tǒng)啟動代碼的讀取方法,包括步驟:步驟S200判斷所述讀取的數(shù)據(jù)是否為所述系統(tǒng)啟動代碼數(shù)據(jù),若是,則繼續(xù)執(zhí)行步驟S210,若否,則反饋所述錯誤信息給芯片啟動代碼,并執(zhí)行步驟S410;步驟S210從NAND存儲器燒錄有系統(tǒng)啟動代碼的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取所述系統(tǒng)啟動代碼;步驟S220若所述系統(tǒng)啟動代碼數(shù)據(jù)讀取失敗,判斷是否可以通過所述預設的ECC和通用Retry Level成功讀取所述系統(tǒng)啟動代碼數(shù)據(jù),若還是讀取失敗,則執(zhí)行步驟S230,若讀取成功,則執(zhí)行步驟S250;步驟S230若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)NAND存儲器中讀取的所述Retry命令序列參數(shù)設置新的Retry Level;步驟S240根據(jù)所述新的Retry Level再次讀取NAND存儲器中的所述系統(tǒng)啟動代碼;步驟S250當成功將NAND存儲器中的所述系統(tǒng)啟動代碼讀完后,跳到系統(tǒng)內(nèi)存中完成系統(tǒng)啟動;步驟S260若所述系統(tǒng)啟動代碼無法成功讀取,則反饋所述錯誤信息給芯片啟動代碼,并執(zhí)行步驟S410;S30:系統(tǒng)啟動后的Retry命令序列參數(shù)的燒錄方法,包括步驟:步驟S300當系統(tǒng)啟動后,根據(jù)芯片啟動代碼的規(guī)則依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),若沒有讀取到所述Retry命令序列參數(shù),則執(zhí)行步驟S310;步驟S310讀取NAND存儲器的ID;步驟S320根據(jù)讀取的所述NAND存儲器的ID,獲取對應的所述Retry命令序列參數(shù)并保存在系統(tǒng)內(nèi)存中;所述步驟S320具體包括:步驟S321根據(jù)讀取的所述NAND存儲器的ID,獲取對應的Retry規(guī)則;步驟S322將所述Retry規(guī)則根據(jù)預設規(guī)則轉(zhuǎn)化為對應的Retry參數(shù)序列;步驟S323根據(jù)所述Retry參數(shù)序列,依次設置對應的Retry Level;步驟S324將所述Retry Level轉(zhuǎn)化為對應的NAND控制器的Retry命令序列參數(shù);步驟S330計算所述Retry命令序列參數(shù)的第一crc,并把計算的所述第一crc放在所述Retry命令序列參數(shù)的頭部;步驟S340對系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc計算并校驗,若校驗正確,則在系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,按照所述Retry命令序列參數(shù)重新讀取數(shù)據(jù),若校驗不正確,則執(zhí)行步驟S310;所述步驟S340中對所述Retry命令序列參數(shù)進行crc計算并校驗具體包括:步驟S341計算系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)的第二crc;步驟S342獲取所述系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)中的頭部的所述第一crc;步驟S343將所述第一crc與所述第二crc進行比較,若一致,則校驗正確,若不一致,則校驗不正確;步驟S350若讀取了所述NAND存儲器的ID,并獲取了對應的所述Retry命令序列參數(shù),在校驗正確后,根據(jù)芯片啟動代碼的規(guī)則,把所述校驗正確后的Retry命令序列參數(shù)依次存入NAND存儲器的各個page中進行參數(shù)備份;S40:芯片啟動代碼接到錯誤信息反饋時的操作方法,包括步驟:步驟S410芯片啟動代碼跳到另一個啟動設備進行系統(tǒng)啟動。
具體的,在NAND存儲器中燒錄其自身對應的Retry命令序列參數(shù),使芯片啟動代碼能夠更好地兼容不同的NAND存儲器,并且在無需改變芯片啟動代碼的情況下,能夠很好地兼容各種新出的NAND存儲器,使其Read Retry能夠正常工作,在對應的Retry Level下重新讀取數(shù)據(jù),提高NAND存儲器中數(shù)據(jù)讀取的成功率,解決在某些從NAND存儲器進行系統(tǒng)啟動的場景下,由于無法進行對應的Read Retry(即NAND存儲器中沒有對應的Retry命令序列參數(shù))而導致系統(tǒng)啟動失敗的情況。
在本發(fā)明的另一個實施例中,如圖4所示,一種系統(tǒng),包括:NAND存儲器100、中央處理器200、系統(tǒng)內(nèi)存300;所述NAND存儲器100與所述中央處理器200電連接;所述系統(tǒng)內(nèi)存300與所述中央處理器200電連接;所述NAND存儲器100包括:page 110,存儲有參數(shù),以及,系統(tǒng)啟動代碼;其中,所述參數(shù)包括:Retry命令序列參數(shù);所述系統(tǒng)內(nèi)存300,進一步用于若從NAND存儲器100多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc校驗正確,則將所述Retry命令序列參數(shù)保存到系統(tǒng)內(nèi)存300中;所述中央處理器200包括:數(shù)據(jù)讀取模塊210,從所述NAND存儲器100多個參數(shù)備份的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取數(shù)據(jù);若讀取數(shù)據(jù)失敗,則繼續(xù)從下一個page里讀取數(shù)據(jù);以及,從NAND存儲器100燒錄有系統(tǒng)啟動代碼的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取所述系統(tǒng)啟動代碼;以及,若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)所述Retry命令序列參數(shù)設置的新的Retry Level再次讀取NAND存儲器中的所述系統(tǒng)啟動代碼;其中,所述芯片啟動代碼包括:預設的ECC、格式和通用Retry Level;所述芯片啟動代碼的規(guī)則包括:預設的ECC和格式;數(shù)據(jù)判斷模塊220,檢查所述讀取的數(shù)據(jù)是否是全ff;以及,若所述讀取的數(shù)據(jù)不是全ff,則進一步判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼;計算校驗模塊230,對NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc計算并校驗;設置模塊240,若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)NAND存儲器中讀取的所述Retry命令序列參數(shù)設置新的Retry Level;啟動模塊250,當成功將NAND存儲器中的所述系統(tǒng)啟動代碼讀完后,跳到所述系統(tǒng)內(nèi)存中完成系統(tǒng)啟動。
具體的,中央處理器可以理解為CPU(Central Processing Unit),是一塊集成的芯片,芯片啟動代碼是固化在CPU中的,CPU與NAND存儲器電連接,CPU中包含了NAND存儲器的控制器,可以在此NAND存儲器的控制器的控制下讀取NAND存儲器中的數(shù)據(jù)。
NAND存儲器中存儲有與它型號對應的Retry命令序列參數(shù),首先讀取此Retry命令序列參數(shù),經(jīng)過校驗正確后,再讀取NAND存儲器中存儲的系統(tǒng)啟動代碼,若系統(tǒng)啟動代碼讀取出錯,CPU就根據(jù)此Retry命令序列參數(shù)設置新的Retry Level,進入Read Retry模式,在新的Retry Level下重新讀取數(shù)據(jù)。
優(yōu)選地,所述數(shù)據(jù)判斷模塊220,若所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼不是參數(shù)特征碼時,進一步用于判斷所述讀取的數(shù)據(jù)是否為所述系統(tǒng)啟動代碼數(shù)據(jù);所述中央處理器還包括:錯誤反饋模塊260,若所述讀取的數(shù)據(jù)不是所述系統(tǒng)啟動代碼,則反饋所述錯誤信息給芯片啟動代碼;所述啟動模塊,進一步用于若接收到所述錯誤信息,芯片啟動代碼跳到另一個啟動設備進行系統(tǒng)啟動。
具體的,雖然一開始想要讀取NAND存儲器中的數(shù)據(jù)為Retry命令序列參數(shù),但是讀取的數(shù)據(jù)需要解析到最后才知道它的數(shù)據(jù)類型,當讀取的數(shù)據(jù)是系統(tǒng)啟動代碼數(shù)據(jù)時,說明NAND存儲器中未包含有它特定的Retry命令序列參數(shù),那就跳過讀取Retry命令序列參數(shù)的步驟,直接讀取NAND存儲器中系統(tǒng)啟動代碼;若讀取的數(shù)據(jù)既不是Retry命令序列參數(shù),也不是系統(tǒng)啟動代碼(系統(tǒng)啟動代碼本身也是一種數(shù)據(jù),因此它和系統(tǒng)啟動代碼數(shù)據(jù)的意義等同),則說明讀取數(shù)據(jù)過程中遇到了不可修正的錯誤,需要將錯誤信息反饋給芯片啟動代碼,讓它即時做出相應的操作。在從NAND存儲器進行系統(tǒng)啟動時,若在啟動過程中,芯片啟動代碼接收到了錯誤信息,就會選擇跳到另一個啟動設備進行系統(tǒng)啟動。
優(yōu)選地,所述中央處理器200還包括:讀取判斷模塊270,若所述系統(tǒng)啟動代碼數(shù)據(jù)讀取失敗,所述讀取判斷模塊判斷是否可以通過所述預設的ECC和通用Retry Level成功讀取所述系統(tǒng)啟動代碼數(shù)據(jù)。
具體的,芯片啟動代碼中本身就包含有預設的ECC和通用Retry Level,這是為了在碰到數(shù)據(jù)讀取出錯時,可以進行及時的校正或用此通用Retry Level重新讀取數(shù)據(jù)。通用Retry Level是針對大部分NAND存儲器,而對于新出的NAND存儲器可能無法有效地進行數(shù)據(jù)恢復,因此,為了提高芯片啟動代碼對各種NAND存儲器的兼容性,會在其page里燒錄其特定的Retry命令序列參數(shù)。
優(yōu)選地,錯誤反饋模塊260,進一步用于若所述系統(tǒng)啟動代碼無法成功讀取,則反饋所述錯誤信息給芯片啟動代碼。
具體的,在讀取NAND存儲器中的數(shù)據(jù)出錯后,且無法進行修復的情況下,會反饋錯誤信息給芯片啟動代碼,讓它能夠及時做出后續(xù)的操作。讀取NAND存儲器中的數(shù)據(jù)出錯有多種情況,例如:一開始就無法讀取NAND存儲器中的數(shù)據(jù);可以讀取NAND存儲器中Retry命令序列參數(shù),但在讀取系統(tǒng)啟動代碼時出錯,又無法通過各種途徑校正,保證成功讀取所有的芯片啟動代碼等,在這些情況下,芯片啟動代碼都會接收到反饋的錯誤信息。
優(yōu)選地,所述數(shù)據(jù)讀取模塊210,當系統(tǒng)啟動后,進一步用于根據(jù)芯片啟動代碼的規(guī)則依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù);以及,若沒有讀取到所述Retry命令序列參數(shù),則讀取NAND存儲器的ID;以及,若系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc校驗正確時,在系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,按照所述Retry命令序列參數(shù)重新讀取數(shù)據(jù);所述中央處理器200還包括:參數(shù)獲取模塊280,若系統(tǒng)內(nèi)存中沒有讀取到所述Retry命令序列參數(shù)或?qū)ο到y(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc檢驗不正確時,根據(jù)讀取的所述NAND存儲器的ID,獲取對應的所述Retry命令序列參數(shù);所述計算校驗模塊230,進一步用于對系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc計算并校驗;所述系統(tǒng)內(nèi)存300,進一步用于將根據(jù)讀取的所述NAND存儲器的ID獲取的對應的所述Retry命令序列參數(shù)保存到所述系統(tǒng)內(nèi)存中;所述page,若讀取了所述NAND存儲器的ID,并獲取了對應的所述Retry命令序列參數(shù),在校驗正確后,進一步用于根據(jù)芯片啟動代碼的規(guī)則,把校驗正確后的所述Retry命令序列參數(shù)依次存入NAND存儲器的各個page中進行參數(shù)備份。
具體的,從NAND存儲器中讀取系統(tǒng)啟動代碼成功后,就會跳到系統(tǒng)內(nèi)存中進行系統(tǒng)啟動,從NAND存儲器中讀取系統(tǒng)啟動代碼可以理解為將NAND存儲器中的系統(tǒng)啟動代碼保存到系統(tǒng)內(nèi)存,為后續(xù)的系統(tǒng)啟動打下基礎。
系統(tǒng)啟動后,會讀取先前保存在系統(tǒng)內(nèi)存中的Retry命令序列參數(shù),若成功讀取到Retry命令序列參數(shù),則會對它進行計算及校驗,只有校驗正確,才會在后續(xù)讀取數(shù)據(jù)出錯時用此Retry命令序列參數(shù)重新讀取數(shù)據(jù)。前面從NAND存儲器中讀取Retry命令序列參數(shù)時也會進行計算及校驗,這是由芯片啟動代碼完成的,而系統(tǒng)內(nèi)存中讀取的Retry命令序列參數(shù)是由系統(tǒng)啟動代碼完成的,這兩者的運行空間不同的,因此,兩者并不重復。
若沒有在系統(tǒng)內(nèi)存中讀取到Retry命令序列參數(shù),則說明NAND存儲器中沒有它對應的Retry命令序列參數(shù),因此,需要讀取NAND存儲器的ID,獲取它的ID對應的Retry命令序列參數(shù),然后將其保存在系統(tǒng)內(nèi)存中,為后續(xù)對系統(tǒng)內(nèi)存中讀取到的Retry命令序列參數(shù)進行crc校驗提供基礎。
只要讀取了NAND存儲器的ID,并獲取了對應的Retry命令序列參數(shù),就說明NAND存儲器中無Retry命令序列參數(shù)或者保存的Retry命令序列參數(shù)不正確,需要重新燒錄進正確的Retry命令序列參數(shù);因此,在讀取了所述NAND存儲器的ID,并獲取了對應的所述Retry命令序列參數(shù),在校驗正確后,會把校驗正確后的Retry命令序列參數(shù)保存到NAND存儲器的各個page中進行參數(shù)備份。
優(yōu)選地,所述參數(shù)獲取模塊280具體包括:規(guī)則獲取子模塊281,根據(jù)讀取的所述NAND存儲器的ID,獲取對應的Retry規(guī)則;序列轉(zhuǎn)化子模塊282,將所述Retry規(guī)則根據(jù)預設規(guī)則轉(zhuǎn)化為對應的Retry參數(shù)序列;設置子模塊283,根據(jù)所述Retry參數(shù)序列,依次設置對應的Retry Level;參數(shù)轉(zhuǎn)化子模塊284,將所述Retry Level轉(zhuǎn)化為對應的NAND控制器的Retry命令序列參數(shù)。
具體的,每個NAND存儲器的規(guī)則不同,因此,需要將其對應的Retry規(guī)則按照預設的規(guī)則轉(zhuǎn)化為同一種規(guī)則的Retry參數(shù)序列,然后根據(jù)此Retry參數(shù)序列,依次設置對應的Retry Level,方便后續(xù)數(shù)據(jù)讀取出錯后,用此Retry Level重新讀取數(shù)據(jù)。
優(yōu)選地,所述計算校驗模塊230,進一步用于計算所述Retry命令序列參數(shù)的第一crc,并把計算的所述第一crc放在所述Retry命令序列參數(shù)的頭部。
優(yōu)選地,所述計算校驗模塊230包括:計算子模塊231,計算系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)的第二crc;獲取子模塊232,獲取所述系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)中的頭部的所述第一crc;檢驗子模塊233,將所述第一crc與所述第二crc進行比較,若一致,則校驗正確,若不一致,則校驗不正確。
具體的,在獲取了Retry命令序列參數(shù)后,會計算其第一crc,并把此第一crc放在頭部,為后續(xù)校驗提供了基礎。
而在對Retry命令序列參數(shù)進行校驗過程中,會先計算它的第二crc,再將第二crc和第一crc進行比較,若一致,則說明讀取的Retry命令序列參數(shù)是正確的,沒有在傳輸過程中發(fā)生錯誤,可以利用此Retry命令序列參數(shù)在后續(xù)數(shù)據(jù)讀取出錯時進行Read Retry。
在本發(fā)明的另一個實施例中,如圖5所示,一種系統(tǒng),包括:NAND存儲器100、中央處理器200、系統(tǒng)內(nèi)存300;所述NAND存儲器200與所述中央處理器200電連接;所述系統(tǒng)內(nèi)存300與所述中央處理器200電連接;所述NAND存儲器100包括:page 110,存儲有參數(shù),以及,系統(tǒng)啟動代碼;其中,所述參數(shù)包括:Retry命令序列參數(shù);若讀取了所述NAND存儲器的ID,并獲取了對應的所述Retry命令序列參數(shù),在校驗正確后,進一步用于根據(jù)芯片啟動代碼的規(guī)則,把校驗正確后的所述Retry命令序列參數(shù)依次存入NAND存儲器的各個page中進行參數(shù)備份;所述系統(tǒng)內(nèi)存300,進一步用于若從NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc校驗正確,則將所述Retry命令序列參數(shù)保存到系統(tǒng)內(nèi)存中;進一步用于將根據(jù)讀取的所述NAND存儲器的ID獲取的對應的所述Retry命令序列參數(shù)保存到所述系統(tǒng)內(nèi)存中;所述中央處理器200包括:數(shù)據(jù)讀取模塊210,從所述NAND存儲器多個參數(shù)備份的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取數(shù)據(jù);若讀取數(shù)據(jù)失敗,則繼續(xù)從下一個page里讀取數(shù)據(jù);以及,從NAND存儲器燒錄有系統(tǒng)啟動代碼的page里,根據(jù)芯片啟動代碼的規(guī)則依次讀取所述系統(tǒng)啟動代碼;以及,若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)所述Retry命令序列參數(shù)設置的新的Retry Level再次讀取NAND存儲器中的所述系統(tǒng)啟動代碼;當系統(tǒng)啟動后,進一步用于根據(jù)芯片啟動代碼的規(guī)則依次讀取系統(tǒng)內(nèi)存中的Retry命令序列參數(shù);以及,若沒有讀取到所述Retry命令序列參數(shù),則讀取NAND存儲器的ID;以及,若系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc校驗正確時,在系統(tǒng)內(nèi)存中讀取數(shù)據(jù)出錯時,按照所述Retry命令序列參數(shù)重新讀取數(shù)據(jù);其中,所述芯片啟動代碼包括:預設的ECC、格式和通用Retry Level;所述芯片啟動代碼的規(guī)則包括:預設的ECC和格式;數(shù)據(jù)判斷模塊220,檢查所述讀取的數(shù)據(jù)是否是全ff;以及,若所述讀取的數(shù)據(jù)不是全ff,則進一步判斷所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼是否為參數(shù)特征碼;若所述讀取的數(shù)據(jù)的頭部數(shù)據(jù)特征碼不是參數(shù)特征碼時,進一步用于判斷所述讀取的數(shù)據(jù)是否為所述系統(tǒng)啟動代碼數(shù)據(jù);計算校驗模塊230,對NAND存儲器多個參數(shù)備份的page里讀取的所述Retry命令序列參數(shù)進行crc計算并校驗;進一步用于對系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc計算并校驗;進一步用于計算所述Retry命令序列參數(shù)的第一crc,并把計算的所述第一crc放在所述Retry命令序列參數(shù)的頭部;所述計算校驗模塊包括:計算子模塊231,計算系統(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)的第二crc;獲取子模塊232,獲取所述系統(tǒng)內(nèi)存中的Retry命令序列參數(shù)中的頭部的所述第一crc;檢驗子模塊233,將所述第一crc與所述第二crc進行比較,若一致,則校驗正確,若不一致,則校驗不正確;設置模塊240,若所述系統(tǒng)啟動代碼讀取失敗,則根據(jù)NAND存儲器中讀取的所述Retry命令序列參數(shù)設置新的Retry Level;啟動模塊250,當成功將NAND存儲器中的所述系統(tǒng)啟動代碼讀完后,跳到所述系統(tǒng)內(nèi)存中完成系統(tǒng)啟動;進一步用于若接收到所述錯誤信息,芯片啟動代碼跳到另一個啟動設備進行系統(tǒng)啟動;錯誤反饋模塊260,若所述讀取的數(shù)據(jù)不是所述系統(tǒng)啟動代碼,則反饋所述錯誤信息給芯片啟動代碼;進一步用于若所述系統(tǒng)啟動代碼無法成功讀取,則反饋所述錯誤信息給芯片啟動代碼;讀取判斷模塊270,若所述系統(tǒng)啟動代碼數(shù)據(jù)讀取失敗,所述讀取判斷模塊判斷是否可以通過所述預設的ECC和通用Retry Level成功讀取所述系統(tǒng)啟動代碼數(shù)據(jù);參數(shù)獲取模塊280,若系統(tǒng)內(nèi)存中沒有讀取到所述Retry命令序列參數(shù)或?qū)ο到y(tǒng)內(nèi)存中的所述Retry命令序列參數(shù)進行crc檢驗不正確時,根據(jù)讀取的所述NAND存儲器的ID,獲取對應的所述Retry命令序列參數(shù);所述參數(shù)獲取模塊280具體包括:規(guī)則獲取子模塊281,根據(jù)讀取的所述NAND存儲器的ID,獲取對應的Retry規(guī)則;序列轉(zhuǎn)化子模塊282,將所述Retry規(guī)則根據(jù)預設規(guī)則轉(zhuǎn)化為對應的Retry參數(shù)序列;設置子模塊283,根據(jù)所述Retry參數(shù)序列,依次設置對應的Retry Level;參數(shù)轉(zhuǎn)化子模塊284,將所述Retry Level轉(zhuǎn)化為對應的NAND控制器的Retry命令序列參數(shù)。
具體的,將根據(jù)NAND存儲器的ID,獲取的對應的Retry命令序列參數(shù)存入NAND存儲器,使芯片啟動代碼能夠更好地兼容各種不同的NAND存儲器,降低不同NAND存儲器的由于沒有對應的Retry命令序列參數(shù)而無法啟動的情況,提升使用效果。
在本發(fā)明的另一個實施例中,以H27UBG8T2CTR這個現(xiàn)代20nm的NAND存儲器為例,這個NAND存儲器的Retry規(guī)則的特點是每個NAND存儲器的Retry規(guī)則都存儲在otp(One Time Programmable,一次性可編程)block里面,需要專門的命令讀取,并且每個NAND存儲器的Retry規(guī)則是不同的;首先通過otp block的讀取命令從NAND存儲器中讀出完整的內(nèi)容,并按照異或規(guī)則檢驗后取得正確的Retry規(guī)則。
然后根據(jù)此Retry規(guī)則獲取對應的Retry Level,然后將每個Retry Level轉(zhuǎn)換為NAND控制器的Retry命令序列參數(shù)并保存,首先將NAND控制器的cmd fifo地址換成Retry命令序列參數(shù)保存的內(nèi)存地址,然后從level0開始持續(xù)到level7依次調(diào)用set level函數(shù)進入Read Retry模式,由于fifo已經(jīng)更換為內(nèi)存地址,這樣實際上并沒真正寫入fifo,而是在內(nèi)存里,NAND存儲器并沒有真正進入Read Retry模式,level7完了以后將內(nèi)存fifo數(shù)據(jù)計算crc,并調(diào)用wirte page的接口依次把Retry命令序列參數(shù)寫入固定的page里面,并保證跨block和block里面的page都有Retry命令序列參數(shù)保存;最后恢復內(nèi)存fifo為正常NAND控制器的fifo地址,保證后續(xù)的命令正常進行。
芯片啟動代碼啟動后,首先依次從各個page讀取Retry命令序列參數(shù)并校驗,通過后,按照level0到level7的順序依次還原fifo數(shù)據(jù);后續(xù)真正的數(shù)據(jù)(例如:系統(tǒng)啟動代碼)讀取如果發(fā)現(xiàn)錯誤且ECC和通用Retry Level無法校正,就依據(jù)fifo數(shù)據(jù)依次把對應的level的fifo數(shù)據(jù)寫入NAND控制器的cmd fifo里面進入Read Retry模式,重新讀取數(shù)據(jù)。
應當說明的是,上述實施例均可根據(jù)需要自由組合。以上所述僅是本發(fā)明的優(yōu)選實施方式,應當指出,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本發(fā)明的保護范圍。