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

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地址線和數據線分開,來了地址和控制信號,數據就出來。.net

    NAND Flash地址線和數據線在一塊兒,須要用程序來控制,才能出數據。設計

    通俗的說,就是光給地址不行,要先命令,再給地址,才能讀到NAND的數據。並且都是在一個總線完成的。指針

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

    三星的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學習資料。

相關文章
相關標籤/搜索