/*
* 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
@
有些是板子上的配置参数
s3c2410 bootloader 第一部分启动代码分析
最新推荐文章于 2020-02-11 14:10:25 发布