⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lh7a400_evbstart.s

📁 sharp的arm920t 7A400的评估板附带光盘Sharp KEVLH7A400 v0.3b Welcome to the SHARP KEV7A400 Evaluation board
💻 S
📖 第 1 页 / 共 2 页
字号:
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 + -