S3C2440從NAND Flash啟動和NOR FLASH啟動的問題

starkbl發表於2021-09-09

1.為什麼NAND FLASH不能直接執行程式

    NAND FLASH本身是連線到了控制器上而不是系統匯流排上。CPU執行機制為:CPU啟動後是要取指令執行的,如果是SROM、NOR FLASH 等之類的,CPU 通過地址線發個地址就可以取得指令並執行,NAND FLASH不行,因為NAND FLASH 是管腳複用,它有自己的一套時序,這樣CPU無法取得可以執行的程式碼,也就不能初始化系統了。

    NAND FLASH是順序存取裝置,不能夠被隨機訪問,程式就不能夠分支或跳轉,這樣你如何去設計程式。

    U-BOOT 支援ARM、 PowerPC等多種架構的處理器,也支援Linux、NetBSD和VxWorks等多種作業系統,主要用來開發嵌入式系統初始化程式碼 bootloader。bootloader是晶片復位後進入作業系統之前執行的一段程式碼,完成由硬體啟動到作業系統啟動的過渡,為執行作業系統提供基本的執行環境,如初始化CPU、堆疊、初始化儲存器系統等,其功能類似於PC機的BIOS。

2.為什麼s3c2440可以從NAND FLASH啟動

    椐瞭解 NOR FLASH 是容量小,速度快,穩定性好,適合做程式儲存器。

    NAND FLASH 總容量大,適合做資料儲存器是不能從NAND FLASH啟動的,NAND FLASH是的讀寫時序是不能直接有ARM硬體產生的,要讀寫NAND FLASH是要通過程式來實現的,很明顯能看出來的就是NAND FLASH只有8個資料、地址複用的資料地址介面。2410/2440可以直接從NAND FLASH啟動的,因為它把NAND前面的4K對映到了RAM的空間

2.1 Flash種類

    NOR FLASH地址線和資料線分開,來了地址和控制訊號,資料就出來。

    NAND Flash地址線和資料線在一起,需要用程式來控制,才能出資料。

    通俗的說,就是光給地址不行,要先命令,再給地址,才能讀到NAND的資料。而且都是在一個匯流排完成的。

    結論是:ARM無法從NAND直接啟動。除非裝載完程式,才能使用NAND Flash.
裝載程式只能從mask rom 或者Nor flash。

    三星的2410可以從NAND FLASH啟動程式,它會把第一塊的前4KB複製到內部SRAM中然後從SRAM執行,也就是說,你需要編寫一個長度小於4K的載入程式,作用是將主程式拷貝到SDRAM中執行(NAND FLASH地址不是線性的,程式不能直接執行,必須拷貝到線性RAM中)

3.NAND啟動和NOR啟動:

    需要檢測硬體啟動方式,啟動方式是由硬體OM0管腳決定的,軟體無法檢測硬體電平狀態,但可以根據CPU的啟動特性來檢測。
在這裡插入圖片描述

3.1 NAND啟動:

    如果配置為NAND FLASH啟動(啟動模式選擇開關拔到nand端,此時OM0管腳拉低)S3C2440的NAND控制器會自動把NAND FLASH中的前4K程式碼資料搬到內部SRAM中(地址為0x40000000),同時還把這塊SRAM地址對映到了0x00000000地址。CPU從0x00000000位置開始執行程式。 【從NAND FLASH啟動CPU時,CPU會通過內部的硬體將NAND FLASH開始的4KB資料複製到稱為“Steppingstone”的4KB的內部RAM中(起始地址為0),然後跳到地址0開始執行】

3.2 NOR啟動:

    如果配置為NOR FLASH啟動(啟動模式選擇開關拔到nor端,此時OM0管腳拉高),0x00000000就是NOR FLASH實際的起始地址,NOR FLASH中的程式就從這裡開始執行,不涉及到資料拷貝和地址對映。

3.3 總結:

    NAND啟動時,地址0x00000000為內部SRAM對映的地址;

    NOR啟動時,地址0x00000000為NOR FLASH的實際起始地址。向NOR FLASH中寫資料需要特定的命令時序,而向記憶體中寫資料可以直接向記憶體地址賦值。

    對於S3C2440處理器 M[1:0]選擇01 或 10時:norflash基地址為0x00000000 ,SRAM頂端地址0x40000FFF。上電後處理器直接從0x00000000處取出指令,arm處理器的SP(堆疊指標暫存器)指向0x40000FFF。

    OM[1:0]選擇00,S3C2440會啟用內部的SRAM緩衝器會將nandflash中的前4KB大小的程式自動拷貝到BootSRAM中。BootSRAM基地址0x00000000,頂端0x00000FFF。上電後,arm處理器從0x00000000取出第一條指令,arm處理器的SP(堆疊指標暫存器)指向0x00000FFF。
在這裡插入圖片描述
在這裡插入圖片描述

4.從Nand Flash啟動U-BOOT的基本原理

4.1 前4K問題

    如果S3C2410被配置成從Nand Flash啟動(配置由硬體工程師在電路板設定), S3C2410的Nand Flash控制器有一個特殊的功能,在S3C2410上電後,Nand Flash控制器會自動的把Nand Flash上的前4K資料搬移到4K內部RAM中,並把0x00000000設定內部RAM的起始地址,CPU從內部RAM的0x00000000位置開始啟動。這個過程不需要程式干涉。程式設計師需要完成的工作,是把最核心的啟動程式放在Nand Flash的前4K中。

4.2 程式大於4K時怎麼辦?

    那麼當程式大於 4k 的時候,當我們以 nand flash啟動後,前面的4Kb 被拷貝到 片內RAM中去執行(自動完成)。我們在這前4K的程式中初始化SDRAM(SDRAM 使用前需要初始化) ,然後將剩下的程式拷貝到 SDRAM中(不是隻有4kb 被拷貝到片內RAM中執行了嘛)然後跳轉到 SDRAM中去執行剩下的程式。

    那麼也就是說 通常當程式大於 4kb的 時候,我們就需要把程式拷貝到SDRAM中去執行。(程式小於4KB 那麼也就可以不用拷貝了,以nand flash方式 啟動後,程式全被拷貝到 片內4kb的 RAM中去執行。)

    那麼,既然程式大於4kb的時候需要從nand flash中拷貝到 SDRAM中去執行。自然可以想到 燒到nand flash中的程式前面一部分程式碼應該 是初始化SDRAM(程式最終需要拷貝到SDRAM中去執行)和 將NAND flash中的剩餘的程式拷貝到SDRAM中去(全考過去也行,方便點),然後跳轉到SDRAM中執行。

4.2 啟動程式的安排

    由於Nand Flash控制器從Nand Flash中搬移到內部RAM的程式碼是有限的,所以在啟動程式碼的前4K裡,我們必須完成S3C2410的核心配置以及把啟動程式碼(U-BOOT)剩餘部分搬到RAM中執行。
    u-boot原始碼不支援從nand flash啟動,可是s3c2410支援從nand flash啟動,開發板(sbc-2410x)加電後s3c2410將nand flash的前4k(儲存有u-boot的部分功能--拷貝功能--把nand flash中的內容拷貝到SDRAM)拷貝到sram(s3c2410晶片內的sram)。這就需要修改u-boot原始碼,增加u-boot的功能: 使u-boot在得到執行權後能夠將其自身拷貝到開發板上SDRAM中,以便處理器能夠執行u-boot。

    Nand Flash的命令、地址、資料都通過I/O口傳送,管腳複用,這樣做的好處是,可以明顯減少NAND FLASH的管腳數目,將來如果設計者想將NAND FLASH更換為更高密度、更大容量的,也不必改動電路板。

5.為什麼NOR啟動要將sp設定為0x40000000+4096

在這裡插入圖片描述
    用NOR啟動時,片內的儲存控制器的BANK0-BANK7這8個BANK都對應了其他用途,所以設計者在BANK7結束的地址0x40000000的地方作為NOR FLASH的啟動地址,而NAND FLASH啟動的地址則是0x00000000。

    因為對於啟動檔案.S來說,4K的空間是足夠存放,程式碼段、BSS......和堆疊段了,因為堆疊的SP是從高地址往低地址移動的,所以要將堆疊的起始地址放在堆疊段的高地址

    你也可以不用設定成4096,但要保證堆疊的長度不能和下面其他段重疊,若重疊,就會出BUG,保險值是4096(4K,見上圖),因為SRAM就是4K設計的。

  大家的鼓勵是我繼續創作的動力,如果覺得寫的不錯,歡迎關注,點贊,收藏,轉發,謝謝!
如遇到排版錯亂的問題,可以通過以下連結訪問我的CSDN。

CSDN:CSDN搜尋“嵌入式與Linux那些事”

歡迎歡迎關注我的公眾號:嵌入式與Linux那些事,領取秋招筆試面試大禮包(華為小米等大廠面經,嵌入式知識點總結,筆試題目,簡歷模版等)和2000G學習資料。

相關文章