📄 rominit.s
字号:
/* romInit.s - Samsung SBC ARM7 ROM initialization module */
/* Copyright 1984-2001 Wind River Systems, Inc. */
/*
modification history
--------------------
01o,05aug04,a_m BSP定制 for 多刃剑开发板
01f,18jan02,m_h CLKCON initialization (74497), _sdata for vxWorks.res*
01e,30nov01,m_h additional label with "_" on entry point functions
01d,15oct01,jb Removing pre-pended underscores for new compilers (Diab/Gnu
elf)
01c,26apr01,m_h fix thumb mode
01b,26apr01,m_h convert tabs to spaces for readability
01a,12apr01,m_h created from snds100 template.
*/
/*
DESCRIPTION
This module contains the entry code for VxWorks images that start
running from ROM, such as 'bootrom' and 'vxWorks_rom'. The entry
point, romInit(), is the first code executed on power-up. It performs
the minimal setup needed to call the generic C routine romStart() with
parameter BOOT_COLD.
romInit() masks interrupts in the processor and the interrupt
controller and sets the initial stack pointer (to STACK_ADRS which is
defined in configAll.h). Other hardware and device initialisation is
performed later in the sysHwInit routine in sysLib.c.
The routine sysToMonitor() jumps to a location after the beginning of
romInit, (defined by ROM_WARM_ADRS) to perform a "warm boot". This
entry point allows a parameter to be passed to romStart().
The routines in this module don't use the "C" frame pointer %r11@ ! or
establish a stack frame.
SEE ALSO:
.I "ARM Architecture Reference Manual,"
.I "Samsung KS32C50100 Microcontroller User's Manual,"
.I "Samsung KS32C5000(A)/50100 Microcontroller Application Notes."
*/
#define _ASMLANGUAGE
#include "vxWorks.h"
#include "sysLib.h"
#include "arch/arm/arm.h"
#include "arch/arm/mmuArmLib.h"
#include "config.h"
#include "regs.h"
.data
.globl FUNC(copyright_wind_river)
.long FUNC(copyright_wind_river)
/* internals */
.globl FUNC(romInit) /* start of system code */
.globl FUNC(sdata) /* start of data */
.globl _sdata
/* externals */
.globl FUNC(romStart) /* system initialization routine */
_sdata:
FUNC_LABEL(sdata)
.asciz "start of data"
.balign 4
.text
.balign 4
/*******************************************************************************
*
* romInit - entry point for VxWorks in ROM
*
* romInit
* (
* int startType /@ only used by 2nd entry point @/
* )
* INTERNAL
* sysToMonitor examines the ROM for the first instruction and the string
* "Copy" in the third word so if this changes, sysToMonitor must be updated.
*/
_ARM_FUNCTION(romInit)
_romInit:
/* : 在Flash存储器的开始处添加硬件中断入口,VxWorks只提供5个异常入口 */
B cold
B _romUndef
B _romSwi
B _romPrefetch
B _romDataAbort
B cold /* _romReserved */
B _romIRQ
B cold /* _romFIQ */
cold:
MOV r0, #BOOT_COLD /* fall through to warm boot entry */
warm:
B start
/* copyright notice appears at beginning of ROM (in TEXT segment) */
.ascii "Copyright 1984-2001 Wind River Systems, Inc."
.balign 4
start:
/* : 设置CPU核心寄存器 */
LDR r2, L$_S3C44B0XWtcon /*watch dog disable*/
MOV r1, #0
STR r1, [r2]
LDR r2, L$_SBCARM7Intmsk /*all interrupt disable*/
MOV r1, #0x07ffffff
STR r1, [r2]
LDR r2, L$_SBCARM7Locktime /*set clock control registers*/
LDR r1, L$_LockTime
STR r1, [r2]
LDR r2, L$_SBCARM7Pllcon /*temporary setting of PLL*/
LDR r1, L$_PllCon
STR r1, [r2]
LDR r2, L$_SBCARM7ClkCon /*all unit block CLK enable*/
LDR r1, L$_ClkCon
STR r1, [r2]
/* : 设置结束 */
MOV r13, r0 /* Save starttype in r13 so that r0 can be used for other purposes */
/*
* If not BOOT_COLD, bypass memory configuration, memory region
* switching etc.
*/
CMP r0, #BOOT_COLD
BNE HiPosn
SYNC_DRAM:
LDR r0, L$_SBCARM7Syscfg
LDR r1, L$_SysCfgSdram
STR r1, [r0] /* Cache,WB disable */
/* ROM and RAM Configuration(Multiple Load and Store). Multiple load
* LDMIA instruction cannot be used as there is no way to load the
* address L$_SystemInitDataSDRAM into a register (LDR Rn,=sym is broken)
*/
LDR r1, L$_SystemInitDataSDRAM
LDR r2, L$_SystemInitDataSDRAM + 0x04
LDR r3, L$_SystemInitDataSDRAM + 0x08
LDR r4, L$_SystemInitDataSDRAM + 0x0c
LDR r5, L$_SystemInitDataSDRAM + 0x10
LDR r6, L$_SystemInitDataSDRAM + 0x14
LDR r7, L$_SystemInitDataSDRAM + 0x18
LDR r8, L$_SystemInitDataSDRAM + 0x1c
LDR r9, L$_SystemInitDataSDRAM + 0x20
LDR r10,L$_SystemInitDataSDRAM + 0x24
LDR r11,L$_SystemInitDataSDRAM + 0x28
LDR r12,L$_SystemInitDataSDRAM + 0x2c
LDR r0, L$_SBCARM7Extdbwth /* Extdbwth Offset : 0x3010 */
STMIA r0, {r1-r12}
/* : r13存储启动类型,不能使用 */
LDR r0, L$_SBCARM7Mrsrb7
LDR r1, L$_SystemInitDataSDRAM +0x30
STR r1, [r0]
/*=============================================================
* Copy to DRAM the section of ROM in which we are currently executing.
* Soon, we will set the base pointer of DRAM to where the base pointer of
* ROM used to be. At that point the PC will suddenly be set in RAM and
* must have legitimate code to execute.
*=============================================================
*/
MOV r0, #RESET_ROM_START /* Get pointer to ROM data */
LDR r1, L$_RomCopySize /* number of ROM bytes to copy into RAM */
MOV r2, #RESET_DRAM_START /* Copy DRAM area base */
ROM2SDRAM_COPY_LOOP:
LDR r3, [r0], #4
STR r3, [r2], #4
SUBS r1, r1, #4 /* Down Count */
BNE ROM2SDRAM_COPY_LOOP
LDR PC, L$_HiPosn
HiPosn:
/*
* Initialize the stack pointer to just before where the
* uncompress code, copied from ROM to RAM, will run.
*/
MOV r0, r13 /* restore starttype to r0 from r13 */
LDR sp, L$_STACK_ADDR
MOV fp, #0 /* zero frame pointer */
/* jump to C entry point in ROM: routine - entry point + ROM base */
#if (CPU == ARMARCH4_T)
LDR r12, L$_rStrtInRom
ORR r12, r12, #1 /* force Thumb state */
BX r12
#else
LDR pc, L$_rStrtInRom
#endif /* (CPU == ARMARCH4_T) */
/* : 中断处理函数 */
_ARM_FUNCTION(romUndef)
_romUndef:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promUndef
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
_ARM_FUNCTION(romSwi)
_romSwi:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promSwi
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
_ARM_FUNCTION(romPrefetch)
_romPrefetch:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promPrefetch
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
_ARM_FUNCTION(romDataAbort)
_romDataAbort:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promDataAbort
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
_ARM_FUNCTION(romReserved)
_romReserved:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promReserved
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
_ARM_FUNCTION(romIRQ)
_romIRQ:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promIRQ
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
_ARM_FUNCTION(romFIQ)
_romFIQ:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promFIQ
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
/******************************************************************************/
/*
* PC-relative-addressable pointers - LDR Rn,=sym is broken
* note "_" after "$" to stop preprocessor preforming substitution
*/
.balign 4
/* : SDT调试,程序直接位于RAM中 */
#ifdef RAM_SIM
L$_HiPosn:
.long RAM_HIGH_ADRS + HiPosn - FUNC(romInit)
L$_rStrtInRom:
.long RAM_HIGH_ADRS + FUNC(romStart) - FUNC(romInit)
#else
L$_HiPosn:
.long ROM_TEXT_ADRS + HiPosn - FUNC(romInit)
L$_rStrtInRom:
.long ROM_TEXT_ADRS + FUNC(romStart) - FUNC(romInit)
#endif
L$_STACK_ADDR:
.long STACK_ADRS
L$_SBCARM7Intmsk:
.long S3C44B0X_INTMASK
/* : added */
L$_SBCARM7Pllcon:
.long S3C44B0X_PLLCON
L$_SBCARM7Locktime:
.long S3C44B0X_LOCKTIME
L$_S3C44B0XWtcon:
.long S3C44B0X_WTCON
/* : deleted */
/*L$_IopModReg:
.long SNGKS32C_IOPMOD*/
/* : deleted */
/*L$_IopConReg:
.long SNGKS32C_IOPCON*/
/* : deleted */
/*L$_IopDat:
.long SNGKS32C_IOPDATA*/
L$_SBCARM7Romcon0:
.long S3C44B0X_BANKCON0 /* : SNGKS32C_ROMCON0->S3C44B0X_BANKCON0 */
L$_SBCARM7Extdbwth:
.long S3C44B0X_BWSCON /* : SNGKS32C_EXTDBWTH->S3C44B0X_BWSCON */
L$_SBCARM7Mrsrb7: /* : added */
.long S3C44B0X_MRSRB7
L$_SBCARM7Syscfg:
.long S3C44B0X_SYSCFG
/* : deleted */
/*L$_SysCfg:
.long SYSCONFIG_VAL*/
L$_SysCfgSdram:
.long SYSCONFIG_VAL_SDRAM
L$_SBCARM7ClkCon:
.long S3C44B0X_CLKCON
L$_ClkCon:
.long rCLKCON
/* : added */
L$_PllCon:
.long rPLLCON
L$_LockTime:
.long rLOCKTIME
/* : deleted */
/*L$_SBCARM7ExtACon:
.long SNGKS32C_EXTACON0
.long SNGKS32C_EXTACON1*/
/* : deleted */
/*L$_ExtACon:
.long rEXTACON0
.long rEXTACON1*/
/*======================================================
* SDRAM System Initialize Data (KS32C50100 only)
*======================================================
*/
L$_SystemInitDataSDRAM:
.long rEXTDBWTH /* DRAM1(Half), ROM5(Byte), ROM1(Half), else 32bit */
.long rROMCON0 /* 0x0000000 ~ 0x40000, ROM0,256K,2cycle */
.long rROMCON1
.long rROMCON2
.long rROMCON3
.long rROMCON4
.long rROMCON5
.long rSDRAMCON0 /* 0x1000000 ~ 0x13FFFFF, DRAM0 4M, */
.long rSDRAMCON1
/* : added */
.long rSREFEXTCON
.long rBANKSIZE
.long rMRSRB6
.long rMRSRB7
L$_pSystemInitDataSDRAM:
.long L$_SystemInitDataSDRAM
/* : RAM中断入口 */
L$_promUndef:
.long S3C_EXC_BASE
L$_promSwi:
.long S3C_EXC_BASE + 4
L$_promPrefetch:
.long S3C_EXC_BASE + 8
L$_promDataAbort:
.long S3C_EXC_BASE + 12
L$_promReserved:
.long S3C_EXC_BASE + 16
L$_promIRQ:
.long S3C_EXC_BASE + 20
L$_promFIQ:
.long S3C_EXC_BASE + 24
/* : 在L$_RomCopySize之前,保证计算正确 */
L$_RomCopySize:
.long L$_RomCopySize - FUNC(romInit)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -