s3c6410 IROM啓動代碼分析

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.

發佈了13 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章