s3c2410 bootloader 第一部分启动代码分析

/*  
 * vivi/arch/s3c2410/head.S:(启动代码第一部分 前200行左右)  
 *   Initialise hardware  
 *    
 *  芯片:         s3c2410  
 *  中文注释:   刘星(362377891@qq.com)  
 *  注释时间:   2012-05-30  
 *  
 */  
#include "config.h"         @ 配置文件  
#include "linkage.h"        @ 实现了ENTRT宏的封装  
#include "machine.h"        @ 开发板环境参数  
@ 启动代码   
ENTRY(_start)               @ 引入外部_start  
ENTRY(ResetEntryPoint)      @ 引入外部ResetEntryPoint  
@  
@ 中断向量表 (物理地址 = 0x00000000)  
@  
@ ARM规定,在起始的地方必须要有中断向量表这8句话,相当于startup中的  
@ b标号也可以用ldr pc标号,这8句话可以认为是bootloader的识别代码,  
@ 因为在实际中,可能会没有bootloader  
@ 0x00: 复位地址  
    b   Reset  
@ 0x04: 未定义中断地址  
UndefEntryPoint:  
    b   HandleUndef  
@ 0x08: 软中断地址  
SWIEntryPoint:  
    b   HandleSWI  
@ 0x0c: 内存操作异常中断地址  
PrefetchAbortEnteryPoint:  
    b   HandlePrefetchAbort  
@ 0x10: 数据异常中断地址  
DataAbortEntryPoint:  
    b   HandleDataAbort  
@ 0x14: 未使用  
NotUsedEntryPoint:  
    b   HandleNotUsed  
@ 0x18: 慢中断地址  
IRQEntryPoint:  
    b   HandleIRQ  
@ 0x1c: 快速中断地址  
FIQEntryPoint:  
    b   HandleFIQ  
@  
@ 环境变量的存放  
@  
@ 0x20: magic number so we can verify that we only put   
    .long   0  
@ 0x24:  
    .long   0  
@ 0x28: _start用来指定链接后的起始装载地址装载到内存中的地址  
    .long   _start  
@ 0x2C: this contains the platform, cpu and machine id  
    .long   ARCHITECTURE_MAGIC  
@ 0x30: vivi capabilities   
    .long   0  
#ifdef CONFIG_PM  
@ 0x34: 电源管理的设置  
    b   SleepRamProc  
#endif  
#ifdef CONFIG_TEST  
@ 0x38:  
    b   hmi  
#endif  
@  
@ Start VIVI head  
@  
Reset:  
    @ 禁用看门狗定时器   
    mov r1, #0x53000000  
    mov r2, #0x0  
    str r2, [r1]        @给看门狗寄存器WTCON赋值0 disable  
#ifdef CONFIG_S3C2410_MPORT3 @GPH配置  
    @基址=0x56000000  
    mov r1, #0x56000000   
    @给0x56000070 GPHCON赋值0x05  GPH1=OUTPUT GPH0=OUTPUT
    mov r2, #0x00000005  
    str r2, [r1, #0x70]  
    @给0x56000078 GPHUP赋值0x01 禁用上拉函数   
    mov r2, #0x00000001  
    str r2, [r1, #0x78]  
    @给0x56000074 GPHDAT赋值0x01 使能数据寄存器  
    mov r2, #0x00000001  
    str r2, [r1, #0x74]  
#endif  
    @ 禁用所有中断  
    mov r1, #INT_CTL_BASE  
    mov r2, #0xffffffff  
    str r2, [r1, #oINTMSK]      @掩码关闭所有中断  
    ldr r2, =0x7ff  
    str r2, [r1, #oINTSUBMSK]     
    @ 初始CPU的速度和时钟频率  
    mov r1, #CLK_CTL_BASE  
    mvn r2, #0xff000000  
    str r2, [r1, #oLOCKTIME]  
    @ldr    r2, mpll_50mhz  
    @str    r2, [r1, #oMPLLCON]  
#ifndef CONFIG_S3C2410_MPORT1  
    @ 1:2:4  
    mov r1, #CLK_CTL_BASE  
    mov r2, #0x3  
    str r2, [r1, #oCLKDIVN]  
    mrc p15, 0, r1, c1, c0, 0       @ 读取控制寄存器   
    orr r1, r1, #0xc0000000     @ Asynchronous    
    mcr p15, 0, r1, c1, c0, 0       @ 写去控制寄存器  
    @ CPU频率 200 Mhz  
    mov r1, #CLK_CTL_BASE  
    ldr r2, mpll_200mhz  
    str r2, [r1, #oMPLLCON]  
#else
    @ 1:2:2  
    mov r1, #CLK_CTL_BASE  
    ldr r2, clock_clkdivn  
    str r2, [r1, #oCLKDIVN]  
    mrc p15, 0, r1, c1, c0, 0       @ 读取控制寄存器   
    orr r1, r1, #0xc0000000     @ Asynchronous  
    mcr p15, 0, r1, c1, c0, 0       @ 写去控制寄存器  
    @ CPU频率 100 Mhz  
    mov r1, #CLK_CTL_BASE  
    ldr r2, mpll_100mhz  
    str r2, [r1, #oMPLLCON]  
#endif  
    bl  memsetup  
#ifdef CONFIG_PM    @ 电源配置  
    @ 检查是否从睡眠模式唤醒  
    ldr r1, PMST_ADDR  
    ldr r0, [r1]  
    tst r0, #(PMST_SMR)  
    bne WakeupStart  
#endif  
#ifdef CONFIG_S3C2410_SMDK  
    @ 点亮所有LED灯  
    mov r1, #GPIO_CTL_BASE  
add r1, r1, #oGPIO_F  
    ldr r2,=0x55aa  
    str r2, [r1, #oGPIO_CON]  
    mov r2, #0xff  
    str r2, [r1, #oGPIO_UP]  
    mov r2, #0x00  
    str r2, [r1, #oGPIO_DAT]  
#endif  
#if 0  
    @ SVC  
    mrs r0, cpsr  
    bic r0, r0, #0xdf  
    orr r1, r0, #0xd3  
    msr cpsr_all, r1  
#endif  
    @ 配置UART串口  
    mov r1, #GPIO_CTL_BASE  
add r1, r1, #oGPIO_H  
    ldr r2, gpio_con_uart     
    str r2, [r1, #oGPIO_CON]  
    ldr r2, gpio_up_uart  
    str r2, [r1, #oGPIO_UP]   
    bl  InitUART    @初始化UART  
#ifdef CONFIG_DEBUG_LL  
    @ Print current Program Counter  
    ldr r1, SerBase  
    mov r0, #'\r'
    bl  PrintChar  
    mov r0, #'\n'
    bl  PrintChar  
    mov r0, #'@'
    bl  PrintChar  
    mov r0, pc  
    bl  PrintHexWord  
#endif  
#ifdef CONFIG_BOOTUP_MEMTEST  
    @ 简单内存测试跳转  
    bl  memtest  
#endif  
#ifdef CONFIG_S3C2410_NAND_BOOT  
    bl  copy_myself  
    @ 跳转到ram  
    ldr r1, =on_the_ram  
add pc, r1, #0  
    nop  
    nop  
1:  b   1b      @ infinite loop  
on_the_ram:  
#endif  
#ifdef CONFIG_DEBUG_LL  
    ldr r1, SerBase  
    ldr r0, STR_STACK  
    bl  PrintWord  
    ldr r0, DW_STACK_START  
    bl  PrintHexWord  
#endif  
    @ 读取C语言函数  
    ldr sp, DW_STACK_START  @ 启动栈指针  
    mov fp, #0          @ fp赋值0  
    mov a2, #0          @ 设置argv = 0   
    bl  main            @ 跳转到main函数   
    mov pc, #FLASH_BASE     @ 覆盖,重启  
@  
@ End VIVI head  
@ 
有些是板子上的配置参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值