📄 lh7a400_evbstart.s
字号:
91
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Initialize MMU coprocessor
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Since we have a stack, we can set up the Translation Table and
; Page Tables from 'C'.
init_trans_table
; set up base address of Translation Table
LDR r0,=TT_BASE_XADDR
BL LH7A400_init_mmu_tables_wrapper
init_mmu
;MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
;MCR{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
; Ensure MMU is disabled (could be soft reset)
MRC MMU_CP, 0, r1, MMU_REG_CONTROL, c0, 0
LDR r2,=(MMU_CONTROL_ALL_BITS)
; Preserve the Bus Mode set when clocks were set
LDR r3,=(MMU_CONTROL_IA :OR: MMU_CONTROL_NF)
BIC r2, r2, r3
BIC r1, r1, r2
MCR MMU_CP, 0, r1, MMU_REG_CONTROL, c0, 0
NOP
NOP
NOP
NOP
NOP
; Set up the Domain Access Control as all Manager
; Make all domains all open, user can impose restrictions if desired
MVN r1,#0
MCR MMU_CP, 0, r1, MMU_REG_DAC, c0, 0
; Flush TLB
MOV r1,#0
MCR MMU_CP, 0, r1, MMU_REG_TLB_OP, c7, 0
; Invalidate both I and D Cache
MOV r1,#0
MCR MMU_CP, 0, r1, MMU_REG_CACHE_OP, c7, 0
; Set up Translation Table Base
LDR r0, =(TT_BASE_XADDR :AND: 0xFFFFC000)
MCR MMU_CP, 0, r0, MMU_REG_TTB, c0, 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Enable the MMU and caches, using read-modify-write
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
enable_mmu_setup
BL SMA_get_mmu_control_reg
MOV r4, r0 ; old value is now in r4, I and D caches disabled
MOV r0, #0 ; get cpu dip switch
BL LH7A400_evb_get_dipsw
; check for user run mode, enable or disable both caches
MOV r2, #CPLD_CPUDIPSW_USER_RUN
AND r1, r0, #CPLD_CPUDIPSW_MAJOR_MODE
CMP r2, r1
BNE icache_check
TST r0, #CPLD_CPUDIPSW_DCACHE_BIT
ORRNE r4, r4, #MMU_CONTROL_C
ORRNE r4, r4, #MMU_CONTROL_I
b enable_mmu
; check for I-Cache enable
icache_check
TST r0, #CPLD_CPUDIPSW_ICACHE_BIT
ORRNE r4, r4, #MMU_CONTROL_I
BICEQ r4, r4, #MMU_CONTROL_I
; check for D-Cache enable
dcache_check
TST r0, #CPLD_CPUDIPSW_DCACHE_BIT
ORRNE r4, r4, #MMU_CONTROL_C
BICEQ r4, r4, #MMU_CONTROL_C
; set MMU enable
enable_mmu
ORR r4, r4, #MMU_CONTROL_M
; Set up jump to run out of virtual flash location
ADR r5, inVirtMem
ORR r5, r5, #ASYNCHFLASH_MMU_BASE
; enable the MMU
MCR MMU_CP, 0, r4, MMU_REG_CONTROL, c0, 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Jump to the virtual address
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV pc, r5 ; Jump to the virtual address
NOP ; These NOP's are in the pipeline and do nothing'
NOP ; as they are executed.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Running at Virtual Memory addresses hereafter
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
inVirtMem
__rom
; init stacks in SDRAM below Page Tables and above BootROM code
; See LHA400_evb.i for addresses in IRAM where stacks are located.
init_stacks
;All interrupts disabled at core
MOV r1,#I_MASK:OR:F_MASK ; No Interrupts
; Enter IRQ mode and setup the IRQ stack pointer
ORR r0,r1,#MODE_IRQ
MSR cpsr_cxsf, r0
LDR r13, =IRQ_STACK_BASE
; Enter FIQ mode and setup the FIQ stack pointer
ORR r0,r1,#MODE_FIQ
MSR cpsr_cxsf, r0
LDR r13, =FIQ_STACK_BASE
; Enter Abort mode and setup the Abort stack pointer
ORR r0,r1,#MODE_ABORT
MSR cpsr_cxsf, r0
LDR r13, =ABORT_STACK_BASE
; Enter Undefined mode and setup the Undefined stack pointer
ORR r0,r1,#MODE_UNDEF
MSR cpsr_cxsf, r0
LDR r13, =UNDEF_STACK_BASE
; Enter System mode and setup the User/System stack pointer
ORR r0,r1,#MODE_SYSTEM
MSR cpsr_cxsf, r0
LDR r13, =SYSTEM_STACK_BASE
; Enter SVC mode and setup the SVC stack pointer.
; This is the mode for runtime initialization.
ORR r0,r1,#MODE_SVC
MSR cpsr_cxsf, r0
LDR r13, =SVC_STACK_BASE
;disable all interrupts at interrupt controller
disable_interrupts
MVN r0,#0
LDR r1,=INTC_REG_BASE
STR r0,[r1,#INTC_INTENC_OFFSET]
; Ready to either enter or spin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; START_C_ENTRY Conditional Assembly code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF :DEF: START_C_ENTRY
IF START_C_ENTRY = {TRUE}
MOV r0,#MODE_SVC ; Enable Processor Interrupts
MSR cpsr_cxsf, r0
LDR r13, =SVC_STACK_BASE
;
;-- Now we enter the C runtime initialization code
;
IMPORT C_Entry
B C_Entry
ENDIF
ENDIF ;START_C_ENTRY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; End START_C_ENTRY Conditional Assembly code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-- or Now we sit and spin with interrupts disabled and SP in IRAM
;
idle_sitnspin
MOV r0,#MODE_SVC:OR:I_MASK:OR:F_MASK ; No Interrupts
MSR cpsr_cxsf, r0
LDR r13, =IRAM_SVC_STACK_BASE
; r8 holds simple 32-bit activity counter
MOV r8, #0
MOV r5, #0
LDR r7, = 0xFFFFFF00
33
ADD r5, r5, #1
BIC r5, r5, r7
MOV r0, r5
MOV r1, #0
BL util_set_sevenseg_hexval
MOV r0, #200 ; ~1/5 second
BL LH7A400_delay_timer_msecs
ADD r8, r8, #1
b %B33
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Dummy Area to prevent link to C runtime lib
; This is also done in crt0, so only do it one place
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;EXPORT __main defined to ensure C runtime lib is not linked in
;__main uncomment to ensure C runtime lib is not linked in
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Save_Status Memory Map, near top of IRAM
; Save_Status written to fixed location starting downward from
; SAVE_STATUS_STORE_ADDR
; 0xB0013FEC Exception mode LR
; 0xB0013FE8 Exception mode SP
; 0xB0013FE4 Exception mode CPSR
; 0xB0013FE0 Exception mode SPSR
; 0xB0013FDC-0xB0013FAC r12 through r0 in that order
; 0xB0013FA8 MMU Control Register value
; 0xB0013FA4 MMU TTB
; 0xB0013FA0 MMU FSR
; 0xB0013F9C MMU FAR
; 0xB0013F98 MMU DAC
; 0xB0013F94 Faulting mode LR
; 0xB0013F90 Faulting mode SP
; 0xB0013F8C Faulting mode SPSR (if Fault mode not User or System)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Save_Status
MOV r12,r13 ; save current SP (ip destroyed)
LDR r13,=SAVE_STATUS_STORE_ADDR ; create current stack in IRAM
STMDB r13!,{r12,r14} ; store current mode SP,LR
MRS r14,cpsr ; get current mode CPSR
STMDB r13!,{r14} ; store current mode CPSR
MRS r14,spsr ; get current mode SPSR
STMDB r13!,{r14} ; store current mode SPSR
STMDB r13!,{r0-r12} ; store r0-r12
;get MMU Control Register
MRC MMU_CP, 0, r14, MMU_REG_CONTROL, c0, 0
STMDB r13!,{r14} ;store MMU Control Register
;get MMU TTB
MRC MMU_CP, 0, r14, MMU_REG_TTB, c0, 0
STMDB r13!,{r14} ;store MMU TTB
;get MMU FSR
MRC MMU_CP, 0, r14, MMU_REG_FS, c0, 1
STMDB r13!,{r14} ;store MMU FSR
;get MMU FAR
MRC MMU_CP, 0, r14, MMU_REG_FA, c0, 0
STMDB r13!,{r14} ;store MMU FAR
;get MMU DAC
MRC MMU_CP, 0, r14, MMU_REG_DAC, c0, 0
STMDB r13!,{r14} ;store MMU DAC
MRS r14,spsr ; get current mode SPSR again
MVN r12, #0x1F
BICS r0,r14,r12
CMP r0, #MODE_USR
ORREQ r14, r14, #MODE_SYSTEM
ORR r14,r14,#I_MASK:OR:F_MASK ; Mask Interrupts in faulting mode
BIC r14,r14,#T_MASK ; Ensure ARM mode, not Thumb
MOV r1,r13 ; store SP in r1
MSR cpsr_c, r14 ;switch back to faulting mode
STMDB r1!,{r14} ;store faulting mode LR
STMDB r1!,{r13} ;store faulting mode SP
CMP r0, #MODE_SYSTEM
MRSNE r14,spsr ;get faulting mode SPSR
STMNEDB r1!,{r14} ;store faulting mode SPSR
b fault_spin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Fault spin area
; Set up a valid stack pointer for calls, fast blink led D10, and
; spin.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fault_spin
; Enter SVC mode, ARM Mode, no interrupts,
; and setup the SVC stack pointer in Internal SRAM
MOV r0,#(MODE_SVC:OR:I_MASK:OR:F_MASK) ; No Interrupts
MSR cpsr_c, r0
LDR r13, =IRAM_SVC_STACK_BASE
89
MOV r0, #0x06 ; bits 1 and 2 are D16 and D17
BL LH7A400_evb_toggle_led
MOV r0, #100 ; 100 msecs
BL LH7A400_delay_timer_msecs
B %B89
BootROM_Limit
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -