上面说到了start.S这个文件,现在说说lowlevel.S这个代码的作用以及代码的相关注释!
/*
* 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 <s3c2440.h>
#include "smdk2440_val.h"
_TEXT_BASE:
.word TEXT_BASE
.globl lowlevel_init /* lowlevel_init的入口 */
lowlevel_init:
mov r12, lr
/* init system clock */
bl system_clock_init /* 跳转到system_clock_init */
/* for UART */
bl uart_asm_init /* 跳转到uart_asm_init */
/* simple init for NAND */
bl nand_asm_init /* 跳转到nand_asm_init */
/* 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.
*/
ldr r0, =0xf0000fff /* r0=0xf0000fff */
bic r1, pc, r0 /* r0 <- current base addr of code */
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 */
adrl r0, mem_cfg_val /* 取得mem_cfg_val子程序的入口 */
bl mem_con_init /* 跳转到mem_con_init,文件在\cpu\s3c24xx\s3c2440\cpu_init.S下 */
ldr r0, =ELFIN_UART_BASE /* 加载ELFIN_UART_BASE地址到r0 ,ELFIN_UART_BASE是UART的初始地址 */
ldr r1, =0x4b4b4b4b /* 加载立即数0x4b4b4b4b到r1 */
str r1, [r0, #0x20] /* 地址(ELFIN_UART_BASE+0x20)=0x4b4b4b4b,用来设置串口传输缓冲寄存器,输出K字母 */
1: mov lr, r12
mov pc, lr /* 子程序返回 */
/*
* system_clock_init: Initialize core clock and bus clock.
* void system_clock_init(void)
*/
system_clock_init:
/* Disable Watchdog */
ldr r0, =ELFIN_WATCHDOG_BASE /* 加载ELFIN_WATCHDOG_BASE地址到r0 */
mov r1, #0 /* r1=0x0 */
str r1, [r0] /* ELFIN_WATCHDOG_BASE=0,关闭看门狗 */
/* mask all IRQs by setting all bits in the INTMR - default */
ldr r0, =ELFIN_INTERRUPT_BASE /* 加载ELFIN_INTERRUPT_BASE地址到r0,ELFIN_INTERRUPT_BASE是SRCPND寄存器地址 */
mov r1, #0xffffffff /* r1=0xffffffff */
str r1, [r0, #INTMSK_OFFSET] /* (ELFIN_INTERRUPT_BASE+INTMSK_OFFSET)=0xffffffff */
/***************************************************************************************************
*NOTE:INTERRUPT,中断掩码寄存器,决定那个中断源被屏蔽,某位为1则屏蔽中断源,初始值为0xFFFFFFFF,屏蔽所有中断 *
***************************************************************************************************/
ldr r1, =0x00001fff /* 加载立即数0x000007ff*/ /*modify by chenpx 7ff */
str r1, [r0, #INTSUBMSK_OFFSET] /* (ELFIN_INTERRUPT_BASE+INTSUBMSK_OFFSET)=0x000001fff */
/*********************************************************************************************
* NOTE:INTSUBMSK,中断子掩码寄存器,该寄存器只能屏蔽13个中断源,因此其仅低11位有效,初始值为0x7FF *
*********************************************************************************************/
/* Initialize System Clock */
ldr r0, =ELFIN_CLOCK_POWER_BASE /* 加载ELFIN_CLOCK_POWER_BASE地址到r0中 */
ldr r1, =0x00ffffff /* 加载立即数0x00ffffff到r1中 */
str r1, [r0, #LOCKTIME_OFFSET] /* Set Clock Divider */
#ifndef S3C2440_PLL_OFF
/* FCLK:HCLK:PCLK */ /* FCLK是帧同步时钟,HCLK是行同步时钟,PCLK是LCD的扫描时钟 */
mov r1, #0x00000000 /* r1=0x00000000 */
str r1, [r0, #CAMDIVN_OFFSET] /* CAMDIVN=0x00000000,初始化照相机时钟分配寄存器 */
ldr r1, =CLKDIVN_VAL /* 加载CLKDIVN_VAL地址到r1中 */
str r1, [r0, #CLKDIVN_OFFSET] /* CLKDIVN=CLKDIVN_VAL,设置时钟分配控制寄存器 */
/*********************************************************************
* NOTE:设置时钟寄存器,CLKDIVN第0位为PDIVN,为0则PCLK=HCLK, *
* 为1则PCLK=HCLK/2 ;第1位为HDIVN,为0则HCLK=FCLK,为1则HCLK=FCLK/2 *
*********************************************************************/
评论
发表评论