tiny210裸機第1課(啟動原理)


軟硬件環境

宿主機系統:ubuntu

板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand

交叉編譯器:arm-linux-gcc-4.5.1

手冊:S5PV210S5PV210_UM_REV1.1(老版本居然連內存地址空間都不同)

1.寫在前面的話

       雖然現在主要做應用層軟件,還是想學一下底層的東東,弄清楚cpu的啟動原理。內容多為摘抄《Linux平台下Mini210S裸機程序開發指南》--友善之臂和他人博客,作為日后翻閱的筆記之用。

2.S5PV210介紹

S5PV210datasheet中有對它的基本架構的一些介紹,里面有這么一幅圖

        

         從這張圖中我們可以看出,對於S5PV210來說,采用ContextA8架構,具有32KB的一級緩存(Cache)和512K的二級緩存。

S5PV210有一個96KiRam和一個64KiRomiRom是拿來存放ContextA8的啟動BL0的,在出廠的時候由生產商固化在里面,iRamContextA8的內部RAM,這個才是真正意義上的內存,BL0會把BL1拷貝到iRam中運行。S5PV210支持存儲接口包括SRAM/ROM, OneNAND, SLC/MLC NAND, LPDDR1/LPDDR2/DDR2。

3.S5PV210內存映射 

       

3. S5PV210啟動流程

參考S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf(以下簡稱SIAP)以及S5PV210S5PV210_UM_REV1.1.pdf這個版本的datasheet

3.1板子是怎么啟動起來的?

首先我們看下面這一表(見SIAP p22頁):

從原文可知道OM[5:0] 引腳決定了SP5V210的啟動流程,可直接接VDD或GND來進行模式切換。OM[5]則需要多接一個100k的的下拉電阻。

從友善之臂的原理圖中可查到SD啟動時,OM[5:0]=001100b,跟原文相符。

接着我們來看看SIAN里面的一個圖:

           

下面還有個注:BL1 / BL2 : It can be variable size copied from boot device to internal SRAM area. 
                        BL1 max. size is 16KB. BL2 max. size is 80KB.       

    在這個圖中我們看以看出我們的S5PV210支持Nor Flash啟動,eSSD啟動,MMC啟動,OneNand啟動和Nand啟動。B1最大為16KB,BL2最大為80KB。這里的啟動代碼分為三個部分,第一個就是BL0,第二個就是BL1,第三個就是BL2,這里的BL就是Bootloader的意思。這些標着①②③的就是三星給我們的一個啟動流程建議步驟,為啥說是建議的步驟呢?因為我們的啟動有時候不一定按照它的建議來,不過流程是不變的,只是代碼存放的地方要做一些調整。下面為參考解釋:

(1)BL0:是指S5PV210的iROM中固化的啟動代碼
        作用:初始化系統時鍾,設置看門狗,初始化堆和棧,加載BL1

(2)BL1:是在iRAM自動從外擴存儲器(nand/sd/usb)中拷貝的uboot.bin二進制文件的頭最大16K代碼
        作用:初始化RAM,關閉Cache,設置棧,加載BL2

(3)BL2:是指在代碼重定向后在內存中執行的uboot的完整代碼
        作用:初始化其它外設,加載OS內核

(4)三者之間的關系:(Interal ROM固化代碼)BL0將BL1(bootloader的前16KB--BL1)加載到iRAM;BL1然后在iRAM中運行將BL2(剩下的bootloader)加載到SDRAM;BL2加載內核,把OS在SDRAM中運行起來,最終OS是運行在SDRAM(內存)中的。

下圖為SRAM的內存地址映射。

            

        因為我使用的是從SDMMC啟動,所以我們會使用到CopySDMMCtoMem這個函數,這個函數被定義在0xD0037F98這個位置.

    

這個函數的原型是:

SD/MMC Copy Function Address
External source clock parameter is used to fit EPLL source clock at 20MHz.
/**
* This Function copy MMC(MoviNAND/iNand) Card Data to memory.
* Always use EPLL source clock.
* This function works at 20Mhz.
* @param u32 StartBlkAddress : Source card(MoviNAND/iNand MMC)) Address.(It must block address.)
* @param u16 blockSize : Number of blocks to copy.
* @param u32* memoryPtr : Buffer to copy from.
* @param bool with_init : determined card initialization.
* @return bool(u8) - Success or failure.
*/
#define CopySDMMCtoMem(z,a,b,c,e)(((bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned
int *)0xD0037F98)))(z,a,b,c,e))
 

轉自:http://blog.csdn.net/shexujia/article/details/20962573


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM