📄 sysalib.s
字号:
BICLT r2, r2, #INTEGRATOR_HDR_CTRL_FASTBUS
STRLT r2, [r1, #INTEGRATOR_HDR_CTRL_OFFSET]
/*
* setup default clocks
*
* Core clock must always be greater than memory clock.
*
* Read HDR_PROC register, if this is non zero then there is no
* coprocessor, in this case use the default settings. First,
* load the default settings.
*/
LDR r2, =INTEGRATOR_HDR_OSC_DFLT_VAL
LDR r1, =INTEGRATOR_HDR_BASE
LDR r3, [r1, #INTEGRATOR_HDR_PROC_OFFSET]
CMP r3, #0
BNE write_clock
/*
* HDR_PROC was zero => there is a coprocessor. Get the processor ID.
*
* If the processor type is not recognised then the default settings
* will be used.
*
* For safety's sake, make the following conditional upon there being a
* coprocessor in the CPU.
*/
#if defined(CPU_720T) || defined(CPU_720T_T) || \
defined(CPU_740T) || defined(CPU_740T_T) || \
defined(CPU_920T) || defined(CPU_920T_T) || \
defined(CPU_940T) || defined(CPU_940T_T) || \
defined(CPU_946ES) || defined(CPU_946ES_T) || \
defined(CPU_966ES) || defined(CPU_966ES_T)
MRC CP_MMU, 0, r1, c0, c0, 0
MOV r3, r1, LSL #16
MOV r3, r3, LSR #20 /* move bits 15-3 to 12-0 */
CMP r3, #0x720 /* is this a 720 */
LDREQ r2, =INTEGRATOR_HDR_OSC_720T_VAL
BEQ write_clock
CMP r3, #0x740 /* is this a 740 */
LDREQ r2, =INTEGRATOR_HDR_OSC_740T_VAL
BEQ write_clock
CMP r3, #0x940 /* is this a 940 */
LDREQ r2, =INTEGRATOR_HDR_OSC_940T_VAL
BEQ write_clock
LDR r12, =0x946
CMP r3, r12 /* is this a 946ES */
LDREQ r2, =INTEGRATOR_HDR_OSC_946ES_VAL
BEQ write_clock
CMP r3, #0x920 /* is this a 920 */
LDREQ r2, =INTEGRATOR_HDR_OSC_920T_VAL
BEQ write_clock
MOV r1, r3, LSR #4 /* is this a 966 */
CMP r1, #0x96
BNE write_clock
AND r1, r3, #0xF
CMP r1, #6
LDREQ r2, =INTEGRATOR_HDR_OSC_966ES_VAL
#endif /* defined(CPU_720T/740T/920T/940T/966ES) */
write_clock:
/* Write clock settings */
/*
LDR r1, =INTEGRATOR_HDR_BASE
LDR r3, =0xA05F
STR r3, [r1, #INTEGRATOR_HDR_LOCK_OFFSET]
STR r2, [r1, #INTEGRATOR_HDR_OSC_OFFSET]
MOV r2, #0
STR r2, [r1, #INTEGRATOR_HDR_LOCK_OFFSET]
*/
/* Set up System BUS and PCI clocks */
/*
LDR r1, =INTEGRATOR_SC_BASE
STR r3, [r1, #INTEGRATOR_SC_LOCK_OFFSET]
LDR r2, =(INTEGRATOR_SC_OSC_SYS_20MHz | INTEGRATOR_SC_OSC_PCI_33MHz)
STR r2, [r1, #INTEGRATOR_SC_OSC_OFFSET]
MOV r2, #0
STR r2, [r1, #INTEGRATOR_SC_LOCK_OFFSET]
*/
/* Initialize static memory. */
/* CS0 - ROM (Boot Flash) */ /* init Flash */
MOV r1, #INTEGRATOR_MC_BASE
MOV r2,#0
STR r2, [r1, #0x10]
STR r2, [r1, #0x50]
STR r2, [r1, #0x54] /*Memory controller protection unit disable*/
STR r2, [r1, #0x4] /* read only */
STR r2, [r1, #0x8] /* read only */
MOV r1, #INTEGRATOR_EBI_BASE
LDR r2, [r1, #0x0]
AND r2, r2, #0xFE /* CS0 is assigned to the Static Memory Controller */
STR r2, [r1, #0x0]
MOV r2, #AT91C_EBI_DBPUC & 0x00
ORR r2, r2, #AT91C_EBI_EBSEN & 0x00
STR r2, [r1, #0x4] /* [D15:0] Data Bus bits are internally pulled-up to the VDDIOM power supply. */
MOV r2, #AT91C_SMC2_DBW_16 | AT91C_SMC2_BAT | AT91C_SMC2_TDF
ORR r2, r2, # AT91C_SMC2_WSEN | AT91C_SMC2_NWS
STR r2, [r1, #INTEGRATOR_EBI_CSR0_OFFSET] /* Set SMC_CSR0 Register*/
/* CS1 - Flash (Application Flash) */
/*
MOV r2, #INTEGRATOR_EBI_32_BIT | INTEGRATOR_EBI_WS_3
STR r2, [r1, #INTEGRATOR_EBI_CSR1_OFFSET]
*/
/* CS2 - SSRAM (Not on Rev A Boards) */
/*
MOV r2, #INTEGRATOR_EBI_32_BIT | INTEGRATOR_EBI_WRITE_ENABLE | \
INTEGRATOR_EBI_SYNC | INTEGRATOR_EBI_WS_2
STR r2, [r1, #INTEGRATOR_EBI_CSR2_OFFSET]
*/
/* CS3 - Unused (Set up for debug) */
/*
MOV r2, #INTEGRATOR_EBI_8_BIT | INTEGRATOR_EBI_WRITE_ENABLE
STR r2, [r1, #INTEGRATOR_EBI_CSR3_OFFSET]
*/
/* set initial stack pointer so stack grows down from start of code */
ADR sp, FUNC(sysInit) /* initialise stack pointer */
/* now call usrInit */
MOV fp, #0 /* initialise frame pointer */
MOV r0, #BOOT_WARM_AUTOBOOT /* pass startType */
#if (ARM_THUMB)
LDR r12, L$_usrInit
BX r12
#else
B FUNC(usrInit)
#endif /* (ARM_THUMB) */
/*******************************************************************************
*
* sysIntStackSplit - split interrupt stack and set interrupt stack pointers
*
* This routine is called, via a function pointer, during kernel
* initialisation. It splits the allocated interrupt stack into IRQ and
* SVC-mode stacks and sets the processor's IRQ stack pointer. Note that
* the pointer passed points to the bottom of the stack allocated i.e.
* highest address+1.
*
* IRQ stack needs 6 words per nested interrupt;
* SVC-mode will need a good deal more for the C interrupt handlers.
* For now, use ratio 1:7 with any excess allocated to the SVC-mode stack
* at the lowest address.
*
* Note that FIQ is not handled by VxWorks so no stack is allocated for it.
*
* The stacks and the variables that describe them look like this.
* .CS
*
* - HIGH MEMORY -
* ------------------------ <--- vxIrqIntStackBase (r0 on entry)
* | |
* | IRQ-mode |
* | interrupt stack |
* | |
* ------------------------ <--{ vxIrqIntStackEnd
* | | { vxSvcIntStackBase
* | SVC-mode |
* | interrupt stack |
* | |
* ------------------------ <--- vxSvcIntStackEnd
* - LOW MEMORY -
* .CE
*
* NOTE: This routine should not be called by the user.
* void sysIntStackSplit
* (
* char *pBotStack /@ pointer to bottom of interrupt stack @/
* long size /@ size of stack @/
* )
*/
_ARM_FUNCTION_CALLED_FROM_C(sysIntStackSplit)
/*
* r0 = base of space allocated for stacks (i.e. highest address)
* r1 = size of space
*/
SUB r2, r0, r1 /* r2->lowest usable address */
LDR r3, L$_vxSvcIntStackEnd
STR r2, [r3] /* == end of SVC-mode stack */
SUB r2, r0, r1, ASR #3 /* leave 1/8 for IRQ */
LDR r3, L$_vxSvcIntStackBase
STR r2, [r3]
/* now allocate IRQ stack, setting irq_sp */
LDR r3, L$_vxIrqIntStackEnd
STR r2, [r3]
LDR r3, L$_vxIrqIntStackBase
STR r0, [r3]
MRS r2, cpsr
BIC r3, r2, #MASK_MODE
ORR r3, r3, #MODE_IRQ32 | I_BIT /* set irq_sp */
MSR cpsr, r3
MOV sp, r0
/* switch back to original mode and return */
MSR cpsr, r2
#if (ARM_THUMB)
BX lr
#else
MOV pc, lr
#endif /* (ARM_THUMB) */
/******************************************************************************/
/*
* PC-relative-addressable pointers - LDR Rn,=sym is broken
* note "_" after "$" to stop preprocessor preforming substitution
*/
.balign 4
L$_vxSvcIntStackBase:
.long VAR(vxSvcIntStackBase)
L$_vxSvcIntStackEnd:
.long VAR(vxSvcIntStackEnd)
L$_vxIrqIntStackBase:
.long VAR(vxIrqIntStackBase)
L$_vxIrqIntStackEnd:
.long VAR(vxIrqIntStackEnd)
#if (ARM_THUMB)
L$_usrInit:
.long FUNC(usrInit)
#endif /* (ARM_THUMB) */
#if defined(CPU_720T) || defined(CPU_720T_T) || \
defined(CPU_740T) || defined(CPU_740T_T)
L$_sysCacheSwapVar:
.long sysCacheSwapVar
#endif
#if defined(CPU_940T) || defined(CPU_940T_T)
L$_sysCacheUncachedAdrs:
.long SYS_CACHE_UNCACHED_ADRS
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -