本發明涉及一種嵌入式系統的啟動方法,具體涉及一種基于NAND Flash自適應的Uboot啟動方法,能夠自適應不同的NAND Flash芯片類型,本發明適用于通信和計算機領域。
背景技術:
在嵌入式開發中,Uboot(也即是Bootloader)引導Linux系統是必不可少的一個重要環節,類似Windows的BIOS設置,這個過程對于系統的上電初始化、引導工作至關重要;同時這個過程也可以完成一些定制類工作,比如自動校驗Flash的完整性,以確定啟動分區是否損壞;提供密碼保護功能,保護Uboot不被誤操作修改;提供設備點燈操作,提示用戶目前處于啟動環境的狀態等。
但是現有的啟動方式在使用過程中,存在一些問題,例如Uboot本身也是程序,也需要存儲在非易失介質上面(比如SD卡,NAND Flash,QSPI Flash等),同時Uboot代碼的執行(最重要的是讀Flash內容,加載Linux系統,讀設備的寄存器空間,設置設備的初始狀態等),需要Uboot程序自己確定讀寫什么類型的硬件Flash芯片,包括Flash的塊大小(block size),頁大小(page size),空閑區域(Spare Area)等參數,因此相應的Uboot代碼可能需要有很多讀寫不同的Flash芯片內容,特別是在項目使用需求多樣化的情況下,例如需要使用Micron4GB Flash、Micron 1GB Flash、Spansion 1GB、Toshiba 1GB Flash等不同廠商不同容量的Flash芯片時,由于這些Flash芯片的讀寫參數都不一樣,因此程序開發人員需要手動修改Uboot代碼,把對應的Flash芯片參數靜態的配置在Uboot的源代碼里面,然后編譯Uboot源碼,再燒寫到非易失介質中,以便Uboot啟動時候能夠知道自己需要讀寫什么類型的Flash芯片。
上述過程,Uboot代碼本身的業務邏輯流程沒有任何修改,比如啟動,引導系統等關鍵步驟,但是僅僅因為無法識別Flash芯片的讀寫參數,就需要進行手動修改代碼、編譯、燒寫、以及后續的測試過程,這個過程相當繁瑣,還需要升級系統,同時需要維護多套Uboot代碼,而每份源碼差別又很小。
技術實現要素:
本發明克服現有技術存在的缺陷,提出了一種自動化識別Flash芯片的方法,提高Uboot的通用性,減少不必要的重復開發和維護工作,提高了代碼的效率。
本發明的技術方案是:
一種自適應各種不同Flash芯片類型的嵌入式系統啟動方法,所述嵌入式系統的加載程序Bootloader中執行自適應各種不同Flash芯片類型的步驟,所述步驟包括:向所述嵌入式系統中所使用的Flash芯片發送標準的讀取芯片ID信息的命令;根據所述Flash芯片返回的廠商ID和設備ID查詢預先配置好的Flash芯片參數配置表,獲得所述Flash芯片所對應的配置信息;所述加載程序Bootloader根據所述配置信息來繼續訪問和/或操作所述Flash芯片中的程序和/或數據。
所述Flash芯片所對應的配置信息包括所述Flash芯片所對應的頁大小參數信息,所述加載程序Bootloader根據所述Flash芯片的頁大小來確定Flash地址所對應的頁。
所述Flash芯片所對應的配置信息還包括所述Flash芯片所對應的塊大小和空閑大小。
所述加載程序Bootloader根據所述Flash芯片的塊大小來對所述Flash芯片寫入數據。
所述加載程序Bootloader根據所述Flash芯片的空閑大小來檢測所述Flash芯片是否有壞塊。
所述加載程序Bootloader存儲于所述Flash芯片中,包括一級BOOT和二級BOOT兩個可執行程序,所述一級BOOT執行自適應各種不同Flash芯片類型的步驟,并根據所獲得的Flash芯片所對應的配置信息來確定二級BOOT可執行程序的訪問方式。
所述一級Boot完成CPU I/O硬件初始化和串口配置;所述二級Boot完成引導系統驅動。
所述Flash芯片參數配置表中預先配置有不同廠商不同容量的NAND Flash芯片的配置信息。
本發明具備的優點是:
采用本發明方法,如果系統的硬件因為成本或者其他原因(比如容量擴展,供貨,庫存等因素),選擇不同的Flash芯片(不同廠家或者同一廠家不同型號),不需要像之前一樣在龐大的工程中修改Flash配置的參數代碼,不需要重新編譯工程,不需要維護不同的Uboot版本,也不存在不同版本升級錯誤問題。本方法提供了自適應不同廠家的NAND Flash芯片或者同一廠家不同容量的NANDFlash芯片,以提高Uboot的通用性和可維護性。
附圖說明
圖1是本發明NAND Flash分區方法示意圖;
圖2是本發明Uboot自適應Flash參數流程圖;
具體實施方式
為了便于本領域普通技術人員理解和實施本發明,下面結合附圖及具體實施方式對本發明作進一步的詳細描述。
本發明提出了一種基于NAND Flash自適應的Uboot啟動方法,主要在開機Bootloader程序中增加一段自適應Flash芯片程序。
步驟1.1:首先將Bootloader源代碼程序分解為一級Boot(preloader)和二級Boot(Uboot),自適應Flash芯片程序設置于一級Boot中,一級Boot只負責最基本的CPU I/O硬件初始化和串口配置,涉及一些匯編代碼和CPU寄存器空間的訪問,以及負責FLASH芯片的自適應;二級Boot則負責引導Linux系統,提供Uboot環境和操作命令,實現基本的驅動功能,比如讀寫EEPROM,讀寫Flash,讀寫FPGA寄存器等。本步驟將Bootloader分為了2個可執行文件,減少了一級Boot和二級Boot的耦合。
步驟1.2:對NAND Flash的使用進行規劃分區,請參閱圖1,將NAND Flash按照功能劃分為很多個區域,其中,分區1存放一級Boot可執行文件preloader和二級Boot可執行文件Uboot(preloader和Uboot統稱為Bootloader),一級Boot存放在Flash首地址0x0地址,二級Boot存放在首地址偏移0x40000(256KB)地址,分區2存放Uboot代碼需要使用的環境變量。本步驟主要是規劃好Bootloader的存放地址,這樣一級Boot事先知道從Flash的哪個地址讀二級Boot,并完成加載執行。
步驟1.3:一級Boot動態識別Flash參數,并啟動二級Boot。圖2顯示了BootLoader上電到加載Linux系統過程的示意圖。
步驟1.3.1:上電后,CPU從Flash首地址執行一級Boot程序(CPU加載一級Boot的過程由CPU內部的BootRom決定,這部分程序都是在芯片出廠的時候,由芯片廠商固化在芯片里面),一級Boot程序在完成了硬件引腳分配初始化和串口初始化后,進入圖2步驟101,給Flash芯片發送標準的讀取芯片ID信息的命令。對于不同廠家的Flash芯片或者同一廠家不同型號芯片,此命令字都是標準的,即0x90命令字。
步驟1.3.2:Flash芯片收到命令后,進入圖2步驟102,返回芯片的生產廠家ID和芯片ID的信息。表1是NAND Flash配置表,一級Boot進入步驟103進行查表。
步驟1.3.3:根據步驟1.3.2返回的芯片生產廠家ID和芯片ID(即設備ID),查表,查看返回的芯片信息是否在表1中,即圖2步驟104。
表1
表1中:頁大小(pagesize),NAND Flash的讀操作的基本/最小的單位,常見為4kB;塊大小(eraseblock),NAND Flash的擦除操作的基本/最小單位,常見為256KB;空閑區域(spare area),每一個頁,對應還有一塊區域,叫做空閑區域(spare area)/冗余區域(redundant area),而Linux系統中,一般叫做OOB(Out Of Band),這個區域,是最初基于NAND Flash的硬件特性:數據在讀寫時候相對容易錯誤,所以為了保證數據的正確性,必須要有對應的檢測和糾錯機制,此機制被叫做EDC(Error Detection Code)/ECC(Error CodeCorrection,或者Error Checking and Correcting),所以設計了多余的區域,用于放置數據的校驗值。
這里需要注意的是,配置表是存放在一級BOOT中,在CPU內部的BootRom加載了一級BOOT后(這一過程由芯片固化程序決定),一級BOOT程序開始運行后,就可以查表1獲取Flash的配置參數。
步驟1.3.4:如果查表失敗,沒有在表1中查到芯片生產廠家ID和芯片ID,進入圖2步驟105,Boot啟動失敗,系統掛起。
步驟1.3.5:如果查表成功,在表1中查到了芯片生產廠家ID和芯片ID,進入圖2步驟106,獲取芯片的頁大小,塊大小,空閑空間大小等信息。
步驟1.4:進入圖2步驟107,根據Flash的頁大小和空閑空間大小,從Flash地址0x40000讀取對應頁大小的二級Boot程序,并執行二級Boot程序,實現系統第二級加載。此步驟是自適應的關鍵,如果不能獲取Flash的頁大小,空閑大小信息,一級Boot就無法從Flash中讀取二級Boot的內容,系統將無法完成引導過程。如果單純的在代碼里面靜態配置頁大小,則只能支持某一款Flash芯片,不能靈活的支持不同廠家不同芯片系列。例如,二級Boot的程序大小是100KB,頁大小是2KB,則需要從Flash讀取50頁數據,然后執行二級Boot引導系統,如果不知道程序不知道頁大小,則沒法完成讀取這一步。需要說明的是,此處由于只讀Flash內容,所以只會用到頁大小,同時為了檢測Flash是否有壞塊,需要用到空閑空間大小;如果需要升級程序寫Flash,則需要知道塊大小信息。
綜上所述,本發明提供了一種Uboot啟動過程中動態識別Flash芯片參數的方法,很好地解決了現有技術中不能動態識別Flash芯片參數信息,而需要針對每款產品做Flash讀寫參數靜態配置的問題。
雖然本發明已經詳細地示出并描述了相關的特定的實施例參考,但本領域的技術人員應該能夠理解,在不背離本發明的精神和范圍內可以在形式上和細節上作出各種改變。這些改變都將落入本發明的權利要求所要求的保護范圍。