【2014-4/11~4/14】通過以前的實驗,對Uboot已經有了大致的瞭解,前咱們已經把led燈給點亮,但這不是咱們的根本目的,咱們是要進入boot啓動,通過兩天的分析代碼和反覆的實驗,終於能夠進入正常的uboot啓動了。linux
接下來,咱們看看關閉MMU,至於爲何要關閉MMU,網上你們都說的很清楚,我就再也不重述,但關於關閉MMU有以下代碼:函數
/* * disable MMU stuff and caches */
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
/* Prepare to disable the MMU */
mcr p15, 0, r0, c1, c0, 0
#if 0 //I don't know why mark blow
/* Prepare to disable the MMU */
adr r1, mmu_disable_phys
/* We presume we're within the first 1024 bytes */
and r1, r1, #0x3fc
ldr r2, _TEXT_PHY_BASE
ldr r3, =0xfff00000
and r2, r2, r3
orr r2, r2, r1
b mmu_disable
.align 5
/* Run in a single cache-line */
mmu_disable:
mcr p15, 0, r0, c1, c0, 0
nop
nop
mov pc, r2
#endif
#endif
我嘗試不去註釋掉if0的內容,可是連燈都亮不起來,我不是太清楚這是問什麼,反正mcr p15, 0, r0, c1, c0, 0將MMU關閉清楚就好了。this
接下來就進入bl lowlevel_init /* go setup pll,mux,memory */,進行系統時鐘,nandflash控制器,ddr內存控制室,led等簡單的 初始化。spa
接下來也是大多數移植過程當中須要改的地方了:指針
重定位代碼->從nandflash複製到DDR中並執行!code
我本身寫的代碼以下:blog
#ifdef CONFIG_BOOT_NAND
relocate:
adr r0, _start /* 當前指令地址 */
ldr r1, =_start /* 連接地址 */
//ldr r2, _armboot_start
//ldr r3, _bss_start
cmp r0, r1
beq after_copy
copy_from_nand:
ldr r0, _armboot_start
ldr r1, _bss_start
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, #12
bl copy_nand2ram
tst r0, #0x0
bne copy_fail
copy_fail:
nop /* copy from nand failed */
b copy_fail
#endif
首先比較r0,r1, 你們能夠用反彙編來看看代碼執行過程(反彙編生成方法爲:arm-linux-objdump –D uboot > uboot.dis),反彙編後發現,內存
r0 存放的是程序當前指令地址,即r0 =0,而r1 = 0x57e00000,所以須要重定位。而關鍵在於,我想經過r0,r1來把代碼的起始地址和終止地址傳入nandcopy2ram函數,這樣就靈活了,可是奇怪的是,傳參並傳不進去,會致使啓動不來,後來咱們把這些零零碎碎的判斷啊,重定位什麼的都不要了,就兩句代碼:設置棧指針,跳入c函數的copy_nand2ram ,而copy_nand2ram 函數複製uboot代碼大小固定死了,爲0x3c000,結果燒進去,咦!終於看到但願,終於起來了!!!!文檔
甚是高興,後來咱們又改回r0,r1來傳參,仍是不行,算了,這確定是由某個緣由致使的。get
咱們對於彙編指令不是特別熟悉,特別是adr,ldr,還有ldr, =XXX、tst,beq, bnq這些指令太陌生了。後面須要去深刻理解。
我同窗的這個想法很好,什麼都不用作,咱們最終的結果不就是去nandflash複製到ram嘛,乾脆用如下兩句:
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
bl copy_nand2ram
有時咱們爲了達到目的,確實能夠去簡化過程,達到目的後再來添加詳細過程和步驟。今天總算有點進展了,加油!!!
因爲下班回來思路沒有理清,過段時間把思考的過程文檔化寫出來。