/* PS_HOLD pin(GPH0_0) set to high */ @@供电锁存
ldr r0,=(ELFIN_CLOCK_POWER_BASE + PS_HOLD_CONTROL_OFFSET)
ldr r1,[r0]
orr r1, r1, #0x300 @@两步,因为一步是非法立即数
orr r1, r1, #0x1 @@
str r1,[r0]
初始化时钟
/* when we already run in ram, we don't need to relocate U-Boot.
* and actually, memory controller must be configured before U-Boot
* is running in ram.
*/ @@判断当前代码执行的地址;是通过代码运行的地址就能知道是否是冷启动,要不要 初始化DDR
ldr r0,=0xff000fff
bic r1, pc, r0 /* r0 <- current base addr of code */ @@ r1 = pc &~r0 ;运行地址
ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */ @@获取链接地址
bic r2, r2, r0 /* r0 <- current base addr of code */
cmp r1, r2 /* compare r0, r1 */
beq 1f/* r0 == r1 then skip sdram init */ @@ 1 是标号 f 向下找
@@通过上边的代码判断要不要执行下边这两个函数
/* init system clock */ @@初始化时钟
bl system_clock_init
/*
* Memory Setup stuff - taken from blob memsetup.S
*
* Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and
* Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
*
* Modified for the Samsung SMDK2410 by
* (C) Copyright 2002
* David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/#include<config.h>#include<version.h>#include<s5pc110.h>#include"smdkc110_val.h"
_TEXT_BASE:.word TEXT_BASE
.globl lowlevel_init
lowlevel_init:
push {
lr} @@压栈,调用之前有设置栈,所以才能压栈
/* check reset status */ @@检测复位状态;复位状态分为多种冷启动热启动休眠状态
@@判断复位状态;不同的状态硬件的状态不一样比如冷启动DDR还没有初始化
ldr r0,=(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)
ldr r1,[r0]
cmp r1, #0x10000
beq wakeup_reset_pre
cmp r1, #0x80000
beq wakeup_reset_from_didle
/* IO Retention release */ @@IO状态恢复
ldr r0,=(ELFIN_CLOCK_POWER_BASE + OTHERS_OFFSET)
ldr r1,[r0]
ldr r2,=IO_RET_REL
orr r1, r1, r2
str r1,[r0]/* Disable Watchdog */ @@关看门狗
ldr r0,=ELFIN_WATCHDOG_BASE /* 0xE2700000 */
mov r1, #0
str r1,[r0]/* SRAM(2MB) init for SMDKC110 *//* GPJ1 SROM_ADDR_16to21 */
ldr r0,=ELFIN_GPIO_BASE
ldr r1,[r0, #GPJ1CON_OFFSET]
bic r1, r1, #0xFFFFFF
ldr r2,=0x444444
orr r1, r1, r2
str r1,[r0, #GPJ1CON_OFFSET]
ldr r1,[r0, #GPJ1PUD_OFFSET]
ldr r2,=0x3ff
bic r1, r1, r2
str r1,[r0, #GPJ1PUD_OFFSET]/* GPJ4 SROM_ADDR_16to21 */
ldr r1,[r0, #GPJ4CON_OFFSET]
bic r1, r1, #(0xf<<16)
ldr r2,=(0x4<<16)
orr r1, r1, r2
str r1,[r0, #GPJ4CON_OFFSET]
ldr r1,[r0, #GPJ4PUD_OFFSET]
ldr r2,=(0x3<<8)
bic r1, r1, r2
str r1,[r0, #GPJ4PUD_OFFSET]/* CS0 - 16bit sram, enable nBE, Byte base address */
ldr r0,=ELFIN_SROM_BASE /* 0xE8000000 */
mov r1, #0x1
str r1,[r0]/* PS_HOLD pin(GPH0_0) set to high */ @@供电锁存
ldr r0,=(ELFIN_CLOCK_POWER_BASE + PS_HOLD_CONTROL_OFFSET)
ldr r1,[r0]
orr r1, r1, #0x300 @@两步,因为一步是非法立即数
orr r1, r1, #0x1 @@
str r1,[r0]/* when we already run in ram, we don't need to relocate U-Boot.
* and actually, memory controller must be configured before U-Boot
* is running in ram.
*/ @@判断当前代码执行的地址;是通过代码运行的地址就能知道是否是冷启动,要不要 初始化DDR
ldr r0,=0xff000fff
bic r1, pc, r0 /* r0 <- current base addr of code */ @@ r1 = pc &~r0 ;运行地址
ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */ @@获取链接地址
bic r2, r2, r0 /* r0 <- current base addr of code */
cmp r1, r2 /* compare r0