s3c6410 uboot 修改和过程分析

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_init   cd  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

/* simple 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

bl      board_init_f   功能

清空gd_t指向的结构体、填充结构体、

board_init_r 

最后进入main_loop()         U-boot 启动管理函数

红色标注的函数都是c语言写的,很重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值