1. 设定 CPU 内部寄存器, 包括状态寄存器和SP等.
start_code:
/*
* set the cpu to SVC32 mode
*/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr, r0
2. 关闭看门狗.
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
3. 设定中断向量表.
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
4. 设定 CPU 内部各单元(包括 CPU 核与内置的其他设备如定时器, 电源管理, SDRAM控制器, LCD控制器, 时钟等)的 Clock 时钟.
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
Bus设置------设置各个外部内存的特性, 包括要插入几个 waiting cycle, 操作该内存的基本单位宽度(8/16/32bit)等.
// 见 MMU 设置.
5. 设置 CPU 各个 PIN 引脚的用途使其符合系统或应用程序的要求. 一般都是设置选择输入输出或者其他第二功能的寄存器.
6. 设置 CPU 的工作模式, 刚开始一般都为 Full run mode.
// 如上面
7. 设置 MMU等存储相关的设备.
/*
*************************************************************************
*
* CPU_init_critical registers
*
* setup important registers
* setup memory timing
*
*************************************************************************
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*
* flush v4 I/D caches
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/*
* 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
mcr p15, 0, r0, c1, c0, 0
/*
* before relocating, we have to setup RAM timing
* because memory timing is board-dependend, you will
* find a lowlevel_init.S in your board directory.
*/
mov ip, lr
bl lowlevel_init
mov lr, ip
mov pc, lr
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
8. 其他内部设备的初始化.
=============================================================================================================================