S3c6410 IROM啓動代碼分析:
1) 跳轉到steppingstone
由於新做的板子要用SD卡啓動的方式測試板子硬件功能是否正常,所以我很想知道程序是如何由irom跳轉到我寫的測試代碼的:
jump_to_stepingldr0:
0x451c: e51ff004 ldr pc, [pc, #-4] ; 將0x4520內存處的數據作爲地址寫入PC
0x4520: 0c000000 stceq 0, c0, [r0], {0}
哦,原來就是通過寫pc寄存器的值跳轉到0x0c000000處執行啊,這就相當於跳轉後irom就休假了,不再幹任何事。這樣我寫代碼的時候不需要考慮堆棧等(不是通過BL命令跳轉的)的設置會破壞irom程序的執行。
2) 中斷向量表
大家知道,ARM程序的前32 字節必須放置異常中斷向量表,每次開機都從這裏開始執行程序。但是當從IROM啓動的時候,我們寫的代碼並不是放在0地址處的,那麼我們要想實現中斷程序的正確跳轉應該怎麼辦呢?我們的向量表得放在哪裏呢?這得知道irom的內部啓動代碼在這最開始的32字節存儲上放的是什麼代碼:
Reset_vector:
0x0: ea00002b b 0xb4 ; 跳轉到irom_entry處執行
0x4: ea000006 b 0x24 ;
0x8: ea00000b b 0x3c ;
0xc: ea000010 b 0x54 ;
0x10:ea000015 b 0x6c ;
0x14:eafffffe b 0x14 ; 在此處無限循環
0x18: ea000019 b 0x84 ;
0x1c: ea00001e b 0x9c ;
0x20:eafffffe b 0x20 ; 在此處無限循環
這裏我們當然很好奇0x24,0x3c,0x54,0x6c,0x84,0x9c處的代碼再會跳到哪去呢:
0x24: e24dd004 sub sp,sp, #4
0x28: e92d0001 push {r0}; 將r0壓入堆棧,保護數據
0x2c: e59f02ac ldr r0, [pc, #684] ; 0x2e0
0x30: e5900000 ldr r0, [r0]
0x34: e58d0004 str r0, [sp, #4]
0x38: e8bd8001 pop {r0,pc}; 將0x2e0處放置的數據作爲地址寫入pc,實現跳轉:
0x2e0:0c001fe4 stceq 15,c1, [r0], {228}
0x2e4:0c001fe8 stceq 15, c1, [r0],{232}
0x2e8:0c001fec stceq 15, c1,[r0], {236}
0x2ec:0c001ff0 stceq 15, c1,[r0], {240}
0x2f0:0c001ff8 stceq 15, c1,[r0], {248}
0x2f4:0c001ffc stceq 15,c1, [r0], {252}
於是我們知道,IROM內部啓動代碼並沒有實現中斷處理程序的編寫,而是跳轉到steppingstone的頂端的6字節。所以我們自己寫的程序(自己的u-boot)的第一級中斷向量表要放在BL1的最後面,這可以通過scatter-load裝載技術實現。另外,由於irom只有6條跳轉指令,因此我們寫的中斷向量表的格式得變一下了:
B HandlerUndef
B HandlerSWI
B HandlerPabort
B HandlerDabort
B HandlerIRQ
B HandlerFIQ
這裏就不需要添加b ResetHandle 和 b .這兩條指令了。
3) irom內部啓動代碼BL0都做了哪些硬件初始化工作:
理解了這個之後,有些事我們就不需要再去做了^_^
1. Disable the Watch-Dog Timer關閉看門狗
2. Initialize the TCM. 初始化TCM
3. Initialize the Block Device CopyFunction. 初始化了一些很有用的函數:將SD卡/NandFlash /OneNand的代碼複製到指定內存地址處。
4. Initialize the stack region 初始化堆棧
5. Initialize the PLL. 設置APLL(220,3,2),MPLL(220,3,3)和EPLL(60,2,4,0)
6. Initialize the instruction cache初始化 I-Cache
7. Initialize the heap region. 初始化堆
4) 數據複製函數
如何使用這些函數呢,很簡單,只要聲明幾個指針指向對應的函數的地址就可以了,具體可以參考三星官方網站。
地址 |
名稱 |
功能 |
0x0C004008 |
CopyMMCtoMem |
This internal function can copy any data from SD/MMC device to SDRAM. |