先了解一下FS4412開發板的硬件環境,
可以看到:
4412有8G內存,即 DDRⅢ 雙速率SDRAM,可片上執行,一般為機器運行軟件提供內存,掉電后數據丟失。
還有4G的eMMC,也就是Nand Flash,但是同時集成了主控芯片與接口,不可以片上執行,但掉電后數據不會丟失。
同時4412支持SD卡啟動,SD也是Nand Flash的集成,一般我們會把uboot或裸機程序燒寫到eMMC或SD卡上。
以下內容轉自:
Exynos4412啟動過程分析
再看一下芯片啟動框圖(芯片手冊里的)
從圖中可以看到4412內部有64K的ROM和256K SRAM,在ROM中已經固化好了一段代碼——iROM BOOT代碼,上電后先運行 iROM BOOT (BL0),用於初始化SRAM,並將eMMC中256k代碼(BL1)拷貝到SRAM中,進而BL1進行初始化DRAM。(在這兒,我們知道ROM掉電不會丟失數據,且CPU可以直接訪問,進行取指令,但是不能直接寫數據,由此應該為片內Nor Flash)
啟動運行過程大概如下:
1:、硬件上電后,實現運行iROM中固化的代碼,讀取OM電平從而確定硬件啟動模式(撥碼開關:0110--eMMC啟動, 1000--SD卡啟動);
2、把已經設置啟動存儲單元代碼復制到內部RAM中並跳轉到RAM運行;
3、運行系統
一、iROM
iROM里面的代碼具體干了什么呢?先通過ROM運行流程圖來分析一下:
由流程圖可以看出,首先關閉看門狗,關閉中斷及MMU,關閉數據緩存,打開指令緩存,清除TLB,然后將其他核進入IDLE模式(待機模式),只留CPU0,這里有了第一個跳轉分支,IROM判斷當前啟動模式,是冷啟動還是喚醒,如果是喚醒模式,那么就是直接跳轉到BL1,在BL1里面我們會再次判斷是否是喚醒模式,如果是就直接跳轉到喚醒函數,一般都是linux內核的喚醒句柄。當然在裸機里都是冷啟動的哈,休眠喚醒一般是不需要關注的,當然如果你的裸機程序需要支持休眠喚醒,就需要增加相應的代碼了。
繼續看,冷啟動模式后,設置IRQ及SVC模式的棧空間,這個時間,棧地址是其內部的一片IRAM,這小片RAM是IROM運行的外部隨機存儲器,沒有這片小內存,IROM是無法運行的。接下了就是初始化IROM里面所使用的各種變量,初始化只讀數據段,未初始化數據段清零,導出部分核心函數,這個函數可以在BL1中使用,獲取當前復位的狀態,設置系統時鍾分頻,獲取OM管腳配置模式,這里可以從多種外設啟動。
簡單地說,iROM就是先設置程序運行環境 (比如關看門狗、關中斷、關MMU 、設置棧 、設置棧 、啟動 PLL 等 );然后根據OM引腳確定啟動設備 (NAND Flash/SD 卡/其他 ),把 BL1 從里面讀出存入iRAM;最后啟動 BL1 。
二、BL1的啟動過程
單地說,也是設置程序運行環境(初始化中斷、設置棧等 );然后從啟動設備上把 BL2讀入iRAM;最后啟動BL2。
三、SD卡作為啟動方式
BL1 位於SD卡偏移地址 512字節處(即從第一個扇區開始,前面有一個扇區保留,每個扇區512字節,為什么保留第一個扇區,如果有同學對DOS分區表有過研究,就能明白其中的道理了,第一個扇區是分區表的配置區),iROM從這個位置讀入8K 字節的數據,存在iRAM地址 0x02021400位置處。 所以 BL1不能大於8K 。
IROM計算校驗和且驗證通過后並解密BL1成功后就可以跳轉到BL1了,至此IROM已執行完備,權限已交由BL1了,補充說明一下,解密BL1是加密模式啟動時才需要的,非加密模式啟動是無需解密BL1的。
BL2 位於 SD 卡偏移地址 (512 +8K)字節處,BL1從這個位置讀入14K 字節的數據,存在iRAM 地址 0x02023400 處。 BL2 不能大於(14K – 4) 字節,最后 4字節用於存放較驗碼(在匯編流水燈試驗中我們用mkbl2工具制作的BL2,其中mkbl2工具最主要的作用就是計算出校驗碼)。
如果我們的程序大於 (14K – 4) 字節,那么需要截取前面 (14K – 4) 字節用來制作BL2並燒入SD卡偏移地址 (512 +8K) 字節處。當BL2啟動后,由它來將存放在SD卡另外位置的、完整程序讀入內存。
更精彩的解析詳見:
Exynos4412裸機開發系列教程--啟動