最近在使用三星S3C2416這個處理器,須要在EBOOT 上實現SD卡文件系統,並從SD卡中燒寫wince系統,與S3C2416的從SD卡啓動不一樣。我用的BSP是 SMDK2416_WinCE50_PM_REL_0.01_080611的,Bootloader文件夾中包含了三個文件 夾:Eboot.Whimory、NBL1.LSB、NBL2,先前不太明白這三個Boot到底有什麼用,因而從網上找到了下面一篇文件,是以 S3C6410爲例做的介紹。 函數
目前的ARM處理器都支持多種啓動模式,S3C6410和之前的 Samsung的ARM處理器同樣,經過外部管腳OM[4:0]的拉高拉低來決定是從哪一個存儲設備上啓動。我認爲S3C6410的User Manual並無說的很清楚,因此我在最開始使用的時候,也對其啓動模式有一些誤解,下面就我我的的理解,介紹一下S3C6410的啓動。 spa
先讀一下S3C6410 User Manual的第3章 System Controller,在123頁列了一張表,如圖: 接口
這章表列出了S3C6410所支持的幾種啓動模式。首先介紹一下和啓動模式相關的硬件管腳: flash
OM[4:0]:選擇啓動設備及時鐘源。OM[0]爲0選擇XXTlpll,爲1選擇XEXTCLK。 it
GPN[15:13]:用於識別所支持的Nandflash的類型,包括Page的類型和地址週期。 硬件
XSELNAND:選擇Nand啓動或者是OneNand啓動。0爲OneNand,1爲Nand。 下載
從表中能夠看出,S3C6410好像並不支持Nandflash啓動,由於Boot Device中沒有Nandflash設備。當OM[4:0]爲0000x/0001x/0010x/0011x的時候,Boot Device是Reserved,我想這裏是Samsung在6410中有意要隱瞞什麼。若是你用過S3C6400,你應該知道在S3C6400 User Manual中也有這麼一張表,描述了s3c6400的啓動模式,具體S3C6400的啓動模式也是在第3章 System Controller,在第107頁的表,如圖: 程序
我想和S3C6410的表對照一下就會發現,兩個處理器的啓動模式是兼容的,我認爲S3C6410應該兼容S3C6400的啓動模式,只不過Samsung在S3C6410 User Manual中隱藏了S3C6400中所支持Nandflash啓動模式,目的多是Samsung不但願在S3C6410中使用Nandflash啓動,而要推崇IROM的啓動模式。我的理解啊! im
下面來總結一下S3C6410所支持的啓動模式: 總結
1. NORFlash啓動
經過Nor Flash啓動,此時OM[4:1]爲0100或0101,對應8bit和16bit。
2. NandFlash啓動
雖然在S3C6410 User Manual中沒有提到,可是也是支持的,從S3C6400 User Manual能夠找到。OM[4:1]四個硬件管腳決定了Nandflash啓動,以及支持的Nandflash的類型,包括大Page和小Page,地址週期爲3,4,5。固然,XSELNAND管腳也要爲1。
3. OneNAND啓動
首先XSELNAND管腳爲0,其次OM[4:1]爲0110,爲OneNand啓動模式。
4. MODEM啓動
當OM[4:1]爲0111的時候,爲MODEM啓動。S3C6410經過MODEM接口下載boot代碼到內部RAM中,而後進行引導。
5. IROM啓動
當OM[4:1]爲1111的時候,從Internal ROM中啓動,此時GPN[15:13]用於識別設備的類型。這種模式之前沒見過,這裏具體介紹一下。
IROM模式能夠支持MoviNand,SD/MMC,iNand,OneNand和Nand等。關於IROM的引導,具體過程如圖:
1. 處理器上電後,當OM[4:1]=1111時,運行iROM中的程序,這個程序被稱爲Bootloader0(BL0),它會作一些初始化的工做。
2. 而後根據GPN[15:13]的管腳設置,選擇從相應的設備(SD/MMC/OneNand/Nand)中的指定區域讀取4KB的程序到SteppingStone中運行,這段代碼被稱爲Bootloader1(BL1)。
3. BL1能夠初始化系統時鐘,UART,SDRAM等設備,而後拷貝Bootloader2(BL2)到SDRAM中。
4. 跳轉到SDRAM中的BL2,繼續運行,BL2能夠支持更強大的功能,能夠將OS加載到SDRAM中,而後運行OS。
整個過程當中,IROM是最早被運行的,它會首先作一些初始化,具體IROM的流程以下:
1. 禁用Watch-dog
2. 初始化TCM
3. 初始化設備拷貝函數,用於拷貝BL1到SteppingStone中
4. 初始化棧區域
5. 初始化PLL
6. 初始化指令Cache
7. 初始化堆區域
8. 拷貝BL1到SteppingStone中
9. 驗證BL1
10. 跳轉到SteppingStone中運行
仍是看一下流程圖吧,理解起來會更直觀一些,IROM啓動流程如圖: