s3c6410 uboot 修改和過程分析

2021-07-14 03:09:40 字數 2998 閱讀 8363

1.找到入口:cd arch/arm/cpu/arm1176  vim  start.s  _start就是開始         

b       跳轉指令

bl      帶返回跳轉

bx     帶狀態切換的跳轉指令

blx    帶返回跳轉和狀態切換的跳轉指令

2.復位:設定cpu 為svc32模式

mrs     r0, cpsr                cpsr狀態暫存器的值取出儲存在r0                                   

bic     r0, r0, #0x3f           將r0的 0x3f(為1的位)清0   xx000000                                     

orr     r0, r0, #0xd3          或運算                                        11010011                                   

msr     cpsr, r0                將r0的值付給cpsr                    cpsr=11010011

cpsr   7    6     5      4      3       2      1      0

i    f     t     m4    m3    m2   m1    m0

i=1,禁止irq中斷

f=1,禁止fiq中斷

t=1,執行thumb指令;t=0,執行arm指令

m[4:0]=0x13   管理模式

3.caches初始化

mov     r0, #0

mcr     p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */          cache失效

mcr     p15, 0, r0, c8, c7, 0   /* flush v4 tlb */                  tlb失效

關閉mmu

4.外設基位址初始化

#ifdef config_periport_remap

/* peri port setup */

ldr     r0, =config_periport_base

orr     r0, r0, #config_periport_size

mcr     p15,0,r0,c15,c2,4

#endif

5.單板初始化    bl      lowlevel_initcd  board/samsung/smdk6410  vim  lowlevel_init.s(這裡貼出的僅僅是修改後的**,只貼了**開始的解釋的表示沒有修改)

/* led on only #8 */ led初始化

ldr     r0, =elfin_gpio_base

ldr     r1, =0x00001111

str     r1, [r0, #gpmcon_offset]

ldr     r1, =0x00000055

str     r1, [r0, #gpmpud_offset]

ldr     r1, =0x000f

str     r1, [r0, #gpmdat_offset]

134行:

/* led test */  led測試

ldr     r0, =elfin_gpio_base

ldr     r1, =0x0003   亮2個燈

str     r1, [r0, #gpndat_offset]

/* disable watchdog */不使能看門狗

/* external interrupt pending clear */ 清除外部中斷標誌位

/* disable all interrupts (vic0 and vic1) */不使能所有中斷

/* set all interrupts as irq */  設定所有中斷為irq

/* pending interrupt clear */  清除中斷

/* init system clock */   初始化系統時鐘

bl system_clock_init    151行

225行修改:

/* fout of epll is 96mhz */

ldr     r1, =0x80200203

/* for uart */    初始化串列埠

bl uart_asm_init

/* ****** init for nand */初始化nandflash

bl nand_asm_init

/* memory subsystem address 0x7e00f120 */  記憶體初始化

bl      mem_ctrl_asm_init     cd  /arch/arm/cpu/arm1176/s3c64xx  vim cpu_init.s  

/* wakeup support. don't know if it's going to be used, untested. */  喚醒復位初始化

/* jump to kernel (sleep-s3c6400.s) */  進入main函式     

mov     pc, r1              cd arch/arm/lib/     vim crt0.s  _main

blboard_init_f   功能

清空gd_t指向的結構體、填充結構體、

board_init_r

最後進入main_loop()u-boot 啟動管理函式

紅色標註的函式都是c語言寫的,很重要。

使uboot支援S3C6410的SD啟動

這裡使用的uboot並非uboot官方發布的uboot 而是為三星定製的乙個uboot版本s3c u boot 1.1.6,其 作者就包括了三星的程式設計師與denx的員工。這個版本支援sd啟動,不過預設是nand啟動,使它支援uboot需要做以下事情 1 雖然支援uboot啟動,但是uboot 裡...

S3C6410 SD卡啟動uboot分析(詳細)

6410的手冊上說,可以從nandflash onenand sd卡啟動,沒有專用的燒錄工具的情況下,只有sd卡啟動是可以考慮 的。手冊上看到,sd卡啟動,實際上是先執行片內irom中的一段程式,該程式從sd卡中讀取 寫到stepping stone 中,stepping stone是位於0x0c0...

使uboot支援S3C6410的SD啟動

一直以來都不知道sd卡中的uboot和nandflash中的uboot有什麼區別?今天終於看到一篇文章,介紹了一下兩者的區別,和如何用原生uboot製作sd卡uboot,記錄下來以供後面查閱。找到了原出處 6410的手冊上說,可以從nandflash onenand sd卡啟動,沒有專用的燒錄工具的...