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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章