📄 main.s
字号:
;------------------------------------------------------------------------------
;
; FUNCTION:
; IsICacheEnabled()
;
; DESCRIPTION:
; This routine is called by "C" to determine if the ICache is enabled.
;
; INPUT PARAMETERS:
; None.
;
; RETURNS:
; R0 - zero if ICache not enabled, non-zero of ICache enabled.
;
; GLOBAL EFFECTS:
; None.
;
; ASSUMPTIONS:
; None.
;
; CALLS:
; None.
;
; CALLED BY:
; "C" code.
;
; PROTOTYPE:
; UINT IsICacheEnabled(VOID);
;
;------------------------------------------------------------------------------
IsICacheEnabled
stmfd sp!, {r1, lr} ; Save registers
getARMControl r0 ; Get co-processor 15 register 1
tst r0, #CONTROL_ICACHE ; Check ICache enable bit
bne %F600 ; If set, return ICache enabled
mov r0, #0 ; ICache not enabled
b %F610 ; Exit
600 mov r0, #1 ; ICache enabled
610
ldmfd sp!, {r1, pc} ; Restore registers and return
;------------------------------------------------------------------------------
;
; FUNCTION:
; IsDCacheEnabled()
;
; DESCRIPTION:
; This routine is called by "C" to determine if the DCache is enabled.
;
; INPUT PARAMETERS:
; None.
;
; RETURNS:
; R0 - zero if DCache not enabled, non-zero of DCache enabled.
;
; GLOBAL EFFECTS:
; None.
;
; ASSUMPTIONS:
; None.
;
; CALLS:
; None.
;
; CALLED BY:
; "C" code.
;
; PROTOTYPE:
; UINT IsDCacheEnabled(VOID);
;
;------------------------------------------------------------------------------
IsDCacheEnabled
stmfd sp!, {r1, lr} ; Save registers
getARMControl r0 ; Get co-processor 15 register 1
tst r0, #CONTROL_DCACHE ; Check DCache enable bit
bne %F700 ; If set, return DCache enabled
mov r0, #0 ; DCache not enabled
b %F710 ; Exit
700 mov r0, #1 ; DCache enabled
710
ldmfd sp!, {r1, pc} ; Restore registers and return
;------------------------------------------------------------------------------
;
; FUNCTION:
; InitiateFCS
;
; DESCRIPTION:
; This subroutine checks r0 and r1 to see if turbo and/or fast bus mode, then
; initiates the frequency change sequence and restarts the memory controller
;
; INPUT PARAMETERS:
; int turbo: 1 - turbo mode; 0 - run mode.
; int fastBus: 1 - start fast bus mode; 0 - normal bus mode
;
; RETURNS:
; None.
;
; GLOBAL EFFECTS:
; Completes the process of changes the core frequency.
;
; ASSUMPTIONS:
; None.
;
; CALLS:
; None.
;
; CALLED BY:
; DVM device driver.
;
; PROTOTYPE:
; VOID InitiateFcs(int, int);
;
;------------------------------------------------------------------------------
;
InitiateFcs
; stmfd sp!, {r1, r2, lr} ; Save r1, r2 and link register on the stack
stmfd sp!, {r0, r1, r2, lr} ; Save r0, r1, r2 and link register on the stack
and r0, r0, #1 ; Isolate LSB for turbo mode
and r1, r1, #1 ; Isolate LSB for fast bus mode
mov r1, r1, LSL #3 ; Move to bit position #3
mrc p14, 0, r2, c6, c0, 0 ; get present status of CP14
orr r2, r2, r0 ; Update with value from user for turbo
orr r2, r2, r1 ; Update with value from user for fast bus
orr r2, r2, #2 ; Set the F bit
mcr p14, 0, r2, c6, c0, 0 ; initiate the frequency change sequence - Wheeeeeeeee!
;
; If the clock frequency is chaged, the MDREFR Register must be rewritten, even
; if it's the same value. This will result in a refresh being performed and the
; refresh counter being reset to the reset interval. (Section 13.10.3, pg 13-17 of EAS)
;
ldr r2, =xlli_MEMORY_CONFIG_BASE ; Get memory controller base address
ldr r1, [r2, #xlli_MDREFR_offset] ; Get the current state of MDREFR
str r1, [r2, #xlli_MDREFR_offset] ; Re-write this value
ldmfd sp!, {r0, r1, r2, pc} ; Restore r0, r1, r2 and return to caller
;
Undefined_Handler
;
; Capture the register set
;
stmfd sp!, {r0} ; Save registers
ldr r0, =regset
str r1, [r0, #4]
str r2, [r0, #8]
str r3, [r0, #12]
str r4, [r0, #16]
str r5, [r0, #20]
str r6, [r0, #24]
str r7, [r0, #28]
str r8, [r0, #32]
str r9, [r0, #36]
str r10, [r0, #40]
str r11, [r0, #44]
str r12, [r0, #48]
str r14, [r0, #56]
str r15, [r0, #60]
ldmfd sp!, {r0} ; Restore registers and return
;
; Store the remaining registers
;
ldr r1, =regset
str r0, [r1, #0]
str r13, [r1, #52]
mrs r2, CPSR ; get the processor status
str r2, [r1, #64]
;
; Display the LED error codes here
;
ldr r0, =0xFFFF0005 ; Display pattern: 0xFFFF0005
setHexLED r0, r2
;
; Dump the registers
;
bl DumpProcessorRegisters
;
; Flash the LEDs if returned
;
1000
ldr r1, =0xFFFF
maskHexLED r1, r2, r3
pauseMilliSecs #250, r1, r2, r3
ldr r1, =0
maskHexLED r1, r2, r3
pauseMilliSecs #500, r1, r2, r3
b %B1000
SWI_Handler
;
; Capture the register set
;
stmfd sp!, {r0} ; Save registers
ldr r0, =regset
str r1, [r0, #4]
str r2, [r0, #8]
str r3, [r0, #12]
str r4, [r0, #16]
str r5, [r0, #20]
str r6, [r0, #24]
str r7, [r0, #28]
str r8, [r0, #32]
str r9, [r0, #36]
str r10, [r0, #40]
str r11, [r0, #44]
str r12, [r0, #48]
str r14, [r0, #56]
str r15, [r0, #60]
ldmfd sp!, {r0} ; Restore registers and return
;
; Store the remaining registers
;
ldr r1, =regset
str r0, [r1, #0]
str r13, [r1, #52]
mrs r2, CPSR ; get the processor status
str r2, [r1, #64]
;
; Display the LED error codes here
;
ldr r0, =0xFFFF0006 ; Display pattern: 0xFFFF0006
setHexLED r0, r2
;
; Dump the registers
;
bl DumpProcessorRegisters
;
; Flash the LEDs if returned
;
1100
ldr r1, =0xFFFF
maskHexLED r1, r2, r3
pauseMilliSecs #250, r1, r2, r3
ldr r1, =0
maskHexLED r1, r2, r3
pauseMilliSecs #500, r1, r2, r3
b %B1100
Prefetch_Handler
;
; Capture the register set
;
stmfd sp!, {r0} ; Save registers
ldr r0, =regset
str r1, [r0, #4]
str r2, [r0, #8]
str r3, [r0, #12]
str r4, [r0, #16]
str r5, [r0, #20]
str r6, [r0, #24]
str r7, [r0, #28]
str r8, [r0, #32]
str r9, [r0, #36]
str r10, [r0, #40]
str r11, [r0, #44]
str r12, [r0, #48]
str r14, [r0, #56]
str r15, [r0, #60]
ldmfd sp!, {r0} ; Restore registers and return
;
; Store the remaining registers
;
ldr r1, =regset
str r0, [r1, #0]
str r13, [r1, #52]
mrs r2, CPSR ; get the processor status
str r2, [r1, #64]
;
; Display the LED error codes here
;
ldr r0, =0xFFFF0007 ; Display pattern: 0xFFFF0007
setHexLED r0, r2
;
; Dump the registers
;
bl DumpProcessorRegisters
;
; Flash the LEDs if returned
;
1200
ldr r1, =0xFFFF
maskHexLED r1, r2, r3
pauseMilliSecs #250, r1, r2, r3
ldr r1, =0
maskHexLED r1, r2, r3
pauseMilliSecs #500, r1, r2, r3
b %B1200
Abort_Handler
;
; Capture the register set
;
stmfd sp!, {r0} ; Save registers
ldr r0, =regset
str r1, [r0, #4]
str r2, [r0, #8]
str r3, [r0, #12]
str r4, [r0, #16]
str r5, [r0, #20]
str r6, [r0, #24]
str r7, [r0, #28]
str r8, [r0, #32]
str r9, [r0, #36]
str r10, [r0, #40]
str r11, [r0, #44]
str r12, [r0, #48]
str r14, [r0, #56]
str r15, [r0, #60]
ldmfd sp!, {r0} ; Restore registers and return
;
; Store the remaining registers
;
ldr r1, =regset
str r0, [r1, #0]
str r13, [r1, #52]
mrs r2, CPSR ; get the processor status
str r2, [r1, #64]
;
; Display the LED error codes here
;
ldr r0, =0xFFFF0008 ; Display pattern: 0xFFFF0008
setHexLED r0, r2
;
; Dump the registers
;
bl DumpProcessorRegisters
;
; Flash the LEDs if returned
;
1300
ldr r1, =0xFFFF
maskHexLED r1, r2, r3
pauseMilliSecs #250, r1, r2, r3
ldr r1, =0
maskHexLED r1, r2, r3
pauseMilliSecs #500, r1, r2, r3
b %B1300
IRQ_Handler
;
; Capture the register set
;
stmfd sp!, {r0} ; Save registers
ldr r0, =regset
str r1, [r0, #4]
str r2, [r0, #8]
str r3, [r0, #12]
str r4, [r0, #16]
str r5, [r0, #20]
str r6, [r0, #24]
str r7, [r0, #28]
str r8, [r0, #32]
str r9, [r0, #36]
str r10, [r0, #40]
str r11, [r0, #44]
str r12, [r0, #48]
str r14, [r0, #56]
str r15, [r0, #60]
ldmfd sp!, {r0} ; Restore registers and return
;
; Store the remaining registers
;
ldr r1, =regset
str r0, [r1, #0]
str r13, [r1, #52]
mrs r2, CPSR ; get the processor status
str r2, [r1, #64]
;
; Display the LED error codes here
;
ldr r0, =0xFFFF0009 ; Display pattern: 0xFFFF0009
setHexLED r0, r2
;
; Dump the registers
;
bl DumpProcessorRegisters
;
; Flash the LEDs if returned
;
1400
ldr r1, =0xFFFF
maskHexLED r1, r2, r3
pauseMilliSecs #250, r1, r2, r3
ldr r1, =0
maskHexLED r1, r2, r3
pauseMilliSecs #500, r1, r2, r3
b %B1400
FIQ_Handler
;
; Capture the register set
;
stmfd sp!, {r0} ; Save registers
ldr r0, =regset
str r1, [r0, #4]
str r2, [r0, #8]
str r3, [r0, #12]
str r4, [r0, #16]
str r5, [r0, #20]
str r6, [r0, #24]
str r7, [r0, #28]
str r8, [r0, #32]
str r9, [r0, #36]
str r10, [r0, #40]
str r11, [r0, #44]
str r12, [r0, #48]
str r14, [r0, #56]
str r15, [r0, #60]
ldmfd sp!, {r0} ; Restore registers and return
;
; Store the remaining registers
;
ldr r1, =regset
str r0, [r1, #0]
str r13, [r1, #52]
mrs r2, CPSR ; get the processor status
str r2, [r1, #64]
;
; Display the LED error codes here
;
ldr r0, =0xFFFF000A ; Display pattern: 0xFFFF000A
setHexLED r0, r2
;
; Dump the registers
;
bl DumpProcessorRegisters
;
; Flash the LEDs if returned
;
1500
ldr r1, =0xFFFF
maskHexLED r1, r2, r3
pauseMilliSecs #250, r1, r2, r3
ldr r1, =0
maskHexLED r1, r2, r3
pauseMilliSecs #500, r1, r2, r3
b %B1500
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -