軟硬件環境
宿主機系統:ubuntu
板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand
交叉編譯器:arm-linux-gcc-4.5.1
手冊:S5PV210的S5PV210_UM_REV1.1(老版本居然連內存地址空間都不同)
1.寫在前面的話
雖然現在主要做應用層軟件,還是想學一下底層的東東,弄清楚cpu的啟動原理。內容多為摘抄《Linux平臺下Mini210S裸機程序開發指南》--友善之臂和他人博客,作為日后翻閱的筆記之用。
2.S5PV210介紹
S5PV210的datasheet中有對它的基本架構的一些介紹,里面有這么一幅圖
從這張圖中我們可以看出,對于S5PV210來說,采用ContextA8架構,具有32KB的一級緩存(Cache)和512K的二級緩存。
S5PV210有一個96K的iRam和一個64K的iRom。iRom是拿來存放ContextA8的啟動BL0的,在出廠的時候由生產商固化在里面,iRam是ContextA8的內部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)以及S5PV210的S5PV210_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))
上一篇:喜羊羊系列之【設備-驅動 動態載入進內核】
下一篇:linux驅動(九)platform驅動模型詳解,以及基于platform驅動模型的led驅動
- 熱門資源推薦
- 熱門放大器推薦
設計資源 培訓 開發板 精華推薦
- cdsj relay
- 用于 LED 照明的 DC 到 DC 單路輸出電源
- 使用 MCP1631 高速脈寬調制器和 +5.5V 至 +16.0V 輸入的典型應用電路
- AD8532ARMZ-REEL單電源直接接入調制解調器的典型應用
- 用于無線的 2.8 至 5.5V 差分放大器
- NSI45025ZT1G 用于基本交流應用的恒流 LED 驅動器的典型應用
- 使用 ROHM Semiconductor 的 BD45425 的參考設計
- 使用 ON Semiconductor 的 ILC7080 的參考設計
- 使用 ON Semiconductor 的 CS5203A-2G 的參考設計
- OP484ESZ 3V 單電源、50Hz 至 60Hz 有源陷波濾波器和假接地的典型應用