1. 程式人生 > >Arm的啟動方式:NorFlash啟動和NandFlash啟動(轉載 http://www.aiuxian.com/article/p-2796357.html)

Arm的啟動方式:NorFlash啟動和NandFlash啟動(轉載 http://www.aiuxian.com/article/p-2796357.html)

arm啟動方式有從norfalsh啟動、nandflash啟動、SD卡啟動和UBS啟動等,但是他們的啟動原理都是大同小異的。

開始之前,先理清幾個概念:

SDRAM(Synchronous Dynamic Random Access Memory):同步動態隨機存取儲存器,同步是指Memory工作需要步時鐘,內部的命令的傳送與資料的傳輸都以它為基準;動態是指儲存陣列需要不斷的重新整理來保證資料不丟失;隨機是指資料不是線性依次儲存,而是由指定地址進行資料讀寫,簡單的說,它就是cpu使用的外部記憶體,即我們常說的記憶體條。

SRAM是英文Static RAM的縮寫,它是一種具有靜止存取功能的記憶體,不需要重新整理電路即能儲存它內部儲存的資料,速度比SDRAM快,一般用作高速緩衝儲存器(Cache)。

norflash:非易失快閃記憶體,是一種外部儲存介質,晶片內執行(XIP,eXecute In Place),這樣應用程式可以直接在flash快閃記憶體內執行,不必再把程式碼讀到系統RAM中,由於它有地址匯流排,cpu可以直接從norflash中取指,直接從FLASH中執行程式,但是工藝複雜,價格比較貴,容量較小(1~4M),NOR的傳輸效率很高

nandflash:它也是非易失快閃記憶體(掉電不丟失)的一種,但是它雖然有資料匯流排,但是沒有地址匯流排,所以cpu不能直接從男的法拉盛中取指執行,由於它價格便宜,所以常常用來儲存大量資料,和我們常說的硬碟類似。

一、 Nandflash啟動

首先必須把一個正確的bootloader燒寫到nandflash的最低位置,即從0x000000開始燒寫。當我們選擇從nandflash啟動開發板的時候,開發板就會啟動連線nandflash的電路結構,開發板一上電的時候,Nand Flash控制器會自動的把Nand Flash上的前4K資料搬移到CPU的內部RAM中(SRAM),這個內部RAM我們通常稱作stepping stone,同時把這段片內SRAM對映到nGCS0片選的空間(即0x00000000),CPU從內部RAM的0x00000000位置開始啟動,這個過程是不需要程式干涉的。

這個過程就是啟動過程的stage1,它將nandflash的前4看內容拷貝到stepping stone中,然後從stepping stone的第一條指令開始執行,這4k內容裡面的指令將會完成以下幾個動作:

1.硬體裝置初始化

2. 載入U-Boot第二階段程式碼到SDRAM空間

3. 設定好棧

4. 跳轉到第二階段程式碼入口

1.剛開始bank0~bank5是隻能對映SROM的,而bank6和bank7才能夠接SDRM,而且每個bank最大接128M的SDRM,所以決定了S3C2440的最大可外接SDRAM是256M;

2.從圖中我們可以看到bank6的起始地址是0x3000_0000, 所以我們在執行stage1的第二個動作(載入U-Boot第二階段程式碼到SDRAM空間)時,需要將uboot程式碼放到0x3000_000~0x4000_0000區間內(SDRAM內),才能從SDRAM中正常執行stage2;

3.當沒有選擇從nandflash啟動時,Boot internal SRAM(4k)的起始地址是0x4000_0000, 當選擇從nandflash啟動時,Boot internal SRAM(4k)的起始地址是0x00, 因為我們的開發板沒有外接SROM,所以bank1~bank5都是空閒的,而bank0的位置將被Boot internal SRAM(4k)替代,也就是說bank0的前4k就是stepping stone(起步石),板子上電以後,在nandflash的啟動模式下,S3C2440在硬體上會完成下圖中的地址對映,並自動將nandflash中的前4k拷貝到stepping stone中,並從stepping stone的開始地址(0x00)獲取到第一條指令並執行。

前面說了nandflash啟動過程中第一個程式碼搬移,下面將解析第二個程式碼搬移,這4k程式碼首先會設定cpu執行模式,關看門狗,設定時鐘,關中斷,初始化記憶體,初始化nandflash,設定堆疊,然後將整個bootload搬運到SDRAM中,並跳轉到SDRAM中執行。

二、norflash啟動

其實理解了nandflash的啟動方式,norflash的啟動也就好理解多了,首先需要知道的是norflash是可以在片上執行程式碼(XIP)的,也就是說,我們只需要將bootload燒寫到norflash的開始地址,當開發板上電以後,從記憶體對映圖可以知道,nor flash會被對映到0x00000000地址(就是nGCS0,這裡就不需要片內SRAM來輔助了,所以片內SRAM的起始地址還是0x40000000,不會改變),然後cpu從0x00000000開始執行(也就是在Norfalsh中執行)整個uboot,直到引導核心啟動。

從norflash啟動可以省事多了,不僅如此,我們自己編寫的裸機程式需要除錯,一般也是直接燒寫到norflash中進行的,因為只要我們將編譯好的可執行檔案放到norflash的開始,開發板上電以後就會從norflash的第一條指令開始取指執行,我們後面寫裸機程式的除錯就是用這種方式進行的。

從norflash啟動雖然從開發的角度會很方便(其實也方便不了多少),但是從產品的角度卻增加了它的成本,畢竟norflash還是相對較貴的,我們明明只要一塊nandflash就足夠啟動整個開發板了,就沒必要在產品中新增一塊norflash了,只要程式碼改改就能省下不少成本,何樂不為。而且nandflash對產品是必不可少的,因為後面還要存放核心和檔案系統,起碼需要幾十兆的空間,用norflash來儲存也不現實。

也許你會想,能不能只用norflash,不用nandflash和SDRAM行不行呢,畢竟norflash即可以儲存,也可以執行程式的啊,從理論來說是可以的,但是瞭解一下他們的市場價格、執行速度和工作原理,應該就會知道答案了。

註釋:stepping stone是三星MCU的一種啟動方式,s3c2440的MMU有一種“steppingstone”.技術,是協助MCU從無法執行程式的NAND FLASH執行啟動程式的一種方法。

1、系統上電後,首先自動判斷是否是autoboot模式,如果使用 s3c2410是帶有nandflash的,並且被設定成autoboot,從nandflash開始啟動.

2、在判斷是autoboot模式後,mcu內建的nandflash控制器自動將nandflash的最前面的4k區域(這4k區域存放著 bootloader的最前面4k程式碼)拷貝到samsung所謂的"steppingstone"裡面(steppingstone是在S3C2440 中,實際上是一塊4k大小的SRAM,).

3、在拷貝完前4k程式碼後,nandflash控制器自動將"steppingstone"對映到arm地址空間0x00000000開始的前4k區域.

4、在對映過程完成後.nandflash控制器將pc指標直接指向arm地址空間的0x00000000位置,準備開始執行"steppingstone"上的程式碼.

5、而"steppingstone"上從nandflash拷貝過來的4k程式碼,是程式設計師寫的bootloader的前4k程式碼.這個 bootloader在之前寫好,並已經被燒寫到nandflash的0x00000000開始的最前面區域..而這"steppingstone"上的 4k程式碼就是bootloader的前4k程式碼.

6、在pc指向arm地址空間的0x00000000後,系統就開始執行指令程式碼.這4k程式碼的任務是:初始化硬體,設定中斷向量表,設定堆疊,然後一個很重要的任務是,將nandflash的最前面區域的bootloader(包含4k啟動程式碼)拷貝到SDRAM中去,bootloader程式碼的大小是寫好bootloader就確定的.然後只需要確定bootloader想對映到SDRAM的起始位置就ok.

7、在完成對nandflash上的bootloader搬移後,找到4k程式碼的搬移程式碼最後一個指令的下一個指令在SDRAM的bootloader的地址,然後跳轉到該位置,繼續執行bootloader的剩餘程式碼(引導系統).