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

📄 start.s

📁 lxRTOS一个用于嵌入系统的操作系统
💻 S
字号:
;
; file:
;       start.S
; description:
;       s3c2410 startup code.
;

; MEMORY AREA
_RAM_STARTADDRESS   EQU 0x30000000
_RAM_ENDADDRESS     EQU 0x34000000
_ROM_STARTADDRESS   EQU 0x00000000
_ROM_ENDADDRESS     EQU 0x00200000


; STACK DEFINITIONS
_FIQ_STACK_ADDRESS  EQU (_RAM_ENDADDRESS-0x08000)   ; 14K
_IRQ_STACK_ADDRESS  EQU (_RAM_ENDADDRESS-0x0b800)   ; 14K
_ABT_STACK_ADDRESS  EQU (_RAM_ENDADDRESS-0x0f000)   ; 1K
_SVC_STACK_ADDRESS  EQU (_RAM_ENDADDRESS-0x0f400)   ; 2K
_UND_STACK_ADDRESS  EQU (_RAM_ENDADDRESS-0x0fc00)   ; 1k
_USR_STACK_ADDRESS  EQU (_RAM_ENDADDRESS-0x10000)   ; 0k


; PROCESSOR MODE
FIQ_MODE    EQU     0x11        ; Fast Interrupt Mode (FIQ)
IRQ_MODE    EQU     0x12        ; Interrupt Mode (IRQ)
ABT_MODE    EQU     0x17        ; Abort Mode(ABT)
SVC_MODE    EQU     0x13        ; Supervisor Mode (SVC)
UND_MODE    EQU     0x1b        ; Undefine Mode(UDF)
USR_MODE    EQU     0x10        ; User Mode(USR)
SYS_MODE    EQU     0x1f        ; System Mode(SYS)
MODE_MSK    EQU     0x1f        ; Processor Mode Mask


; IRQ BITS
F_BIT       EQU     0x40        ; FIQ Disable
I_BIT       EQU     0x80        ; IRQ Disable
LOCKOUT     EQU     0xc0        ; Interrupt lockout mask value


; watchdog controller
WTCON       EQU     0x53000000
WTDAT       EQU     0x53000004
WTCNT       EQU     0x53000008


; interrupt controller
SRCPND      EQU     0x4a000000
INTMOD      EQU     0x4a000004
INTMSK      EQU     0x4a000008
PRIORITY    EQU     0x4a00000c
INTPND      EQU     0x4a000010
INTOFFSET   EQU     0x4a000014
SUBSRCPND   EQU     0x4a000018
INTSUBMSK   EQU     0x4a00001c


; clock controller
LOCKTIME    EQU     0x4c000000
MPLLCON     EQU     0x4c000004
UPLLCON     EQU     0x4c000008
CLKCON      EQU     0x4c00000c
CLKSLOW     EQU     0x4c000010
CLKDIVN     EQU     0x4c000014
MM_DIV      EQU     0xa1                ; Fin=12MHz Fout=202.8MHz
MP_DIV      EQU     0x03
MS_DIV      EQU     0x01
UM_DIV      EQU     0x78
UP_DIV      EQU     0x02
US_DIV      EQU     0x03


; memory controller
BWSCON    EQU       0x48000000
BANKCON0  EQU       0x48000004
BANKCON1  EQU       0x48000008
BANKCON2  EQU       0x4800000c
BANKCON3  EQU       0x48000010
BANKCON4  EQU       0x48000014
BANKCON5  EQU       0x48000018
BANKCON6  EQU       0x4800001c
BANKCON7  EQU       0x48000020
REFRESH   EQU       0x48000024
BANKSIZE  EQU       0x48000028
MRSRB6    EQU       0x4800002c
MRSRB7    EQU       0x48000030


; STARTUP CODE
        AREA    start, CODE, READONLY, ALIGN=4
        CODE32

        ENTRY
        b       SystemResetHandler
        ldr     pc, =_RAM_STARTADDRESS+4    ; b       SystemUndefinedHandler
        ldr     pc, =_RAM_STARTADDRESS+8    ; b       SystemSwiHandler
        ldr     pc, =_RAM_STARTADDRESS+12   ; b       SystemPrefetchHandler
        ldr     pc, =_RAM_STARTADDRESS+16   ; b       SystemAbortHandler
        ldr     pc, =_RAM_STARTADDRESS+20   ; b       SystemReservedHandler
        ldr     pc, =_RAM_STARTADDRESS+24   ; b       SystemIrqHandler
        ldr     pc, =_RAM_STARTADDRESS+28   ; b       SystemFiqHandler
        LTORG


ConfigMemoryData
        DCD     0x22111112              ; BWSCON
        DCD     0x00000600              ; BANKCON0
        DCD     0x00000700              ; BANKCON1
        DCD     0x00000700              ; BANKCON2
        DCD     0x00000700              ; BANKCON3
        DCD     0x00000700              ; BANKCON4
        DCD     0x00000700              ; BANKCON5
        DCD     0x00018001              ; BANKCON6
        DCD     0x00018001              ; BANKCON7
        DCD     0x008001e9              ; REFRESH
        DCD     0x00000032              ; BANKSIZE
        DCD     0x00000030              ; MRSRB6
        DCD     0x00000030              ; MRSRB7


SystemReservedHandler
        b       SystemReservedHandler


SystemResetHandler
        ldr     r0, =WTCON              ; Disable WatchDog
        ldr     r1, =0x8000
        str     r1, [r0]

        ldr     r0, =INTMSK             ; Disable interrupt
        ldr     r1, =0xffffffff
        str     r1, [r0]

        ldr     r0, =INTSUBMSK          ; Disable sub interrupt
        ldr     r1, =0x07ff
        str     r1, [r0]

        ldr     r0, =INTMOD             ; IRQ mode
        ldr     r1, =0x00
        str     r1, [r0]

        ldr     r0, =SUBSRCPND          ; Clear sub interrupt pending
        ldr     r1, =0x07ff
        str     r1, [r0]

        ldr     r0, =SRCPND             ; Clear interrupt source
        ldr     r1, =0xffffffff
        str     r1, [r0]

        ldr     r0, =INTPND             ; Clear interrupt pending
        ldr     r1, =0xffffffff
        str     r1, [r0]

        b       Initialize_Memory
        LTORG


Initialize_Memory
        mov     r0, pc
        ldr     r1, =_RAM_STARTADDRESS
        cmp     r0, r1
        ldr     r0, =ConfigMemoryData
        sublt   r0, r0, r1
        ldmia   r0, {r1-r13}
        ldr     r0, =BWSCON
        stmia   r0, {r1-r13}

        b       Initialize_Code
        LTORG


        IMPORT  |Image$$RO$$Base|
        IMPORT  |Image$$RO$$Limit|
        IMPORT  |Image$$RW$$Base|
        IMPORT  |Image$$RW$$Limit|
        IMPORT  |Image$$ZI$$Base|
        IMPORT  |Image$$ZI$$Limit|
Initialize_Code
        mov     r0, pc
        ldr     r1, =_RAM_STARTADDRESS
        cmp     r0, r1
        bge     Initialize_Clock

        ldr     r0, =_ROM_STARTADDRESS
        ldr     r1, =|Image$$RO$$Base|
        ldr     r2, =|Image$$ZI$$Base|
0
        cmp     r1, r2
        bge     %F1
        ldmia   r0!, {r3-r10}
        stmia   r1!, {r3-r10}
        b       %B0
1
        ldr     pc, =_RAM_STARTADDRESS
        LTORG


Initialize_Clock
        ldr     r0, =CLKDIVN
        ldr     r1, =0x03
        str     r1, [r0]

        ldr     r0, =LOCKTIME
        ldr     r1, =0x00ffffff
        str     r1, [r0]

        ldr     r0, =MPLLCON
        ldr     r1, =((MM_DIV<<12)+(MP_DIV<<4)+MS_DIV)
        str     r1, [r0]

        ldr     r0, =UPLLCON
        ldr     r1, =((UM_DIV<<12)+(UP_DIV<<4)+US_DIV)
        str     r1, [r0]

        ldr     r0, =CLKCON
        ldr     r1, =0x0007fff0
        str     r1, [r0]

        ldr     r0, =CLKSLOW
        ldr     r1, =0x04
        str     r1, [r0]

        b       Initialize_Vector
        LTORG


Initialize_Vector
        ldr     r0, =_RAM_STARTADDRESS;

        add     r0, r0, #4
        ldr     r1, =SystemUndefinedHandler
        sub     r1, r1, #8
        sub     r1, r1, r0
        mov     r1, r1, lsr#2
        orr     r1, r1, #0xea000000
        str     r1, [r0]

        add     r0, r0, #4
        ldr     r1, =SystemSwiHandler
        sub     r1, r1, #8
        sub     r1, r1, r0
        mov     r1, r1, lsr#2
        orr     r1, r1, #0xea000000
        str     r1, [r0]

        add     r0, r0, #4
        ldr     r1, =SystemPrefetchHandler
        sub     r1, r1, #8
        sub     r1, r1, r0
        mov     r1, r1, lsr#2
        orr     r1, r1, #0xea000000
        str     r1, [r0]

        add     r0, r0, #4
        ldr     r1, =SystemAbortHandler
        sub     r1, r1, #8
        sub     r1, r1, r0
        mov     r1, r1, lsr#2
        orr     r1, r1, #0xea000000
        str     r1, [r0]

        add     r0, r0, #4
        ldr     r1, =SystemReservedHandler
        sub     r1, r1, #8
        sub     r1, r1, r0
        mov     r1, r1, lsr#2
        orr     r1, r1, #0xea000000
        str     r1, [r0]

        add     r0, r0, #4
        ldr     r1, =SystemIrqHandler
        sub     r1, r1, #8
        sub     r1, r1, r0
        mov     r1, r1, lsr#2
        orr     r1, r1, #0xea000000
        str     r1, [r0]

        add     r0, r0, #4
        ldr     r1, =SystemFiqHandler
        sub     r1, r1, #8
        sub     r1, r1, r0
        mov     r1, r1, lsr#2
        orr     r1, r1, #0xea000000
        str     r1, [r0]

        b       Initialize_Stack
        LTORG


Initialize_Stack
        mov     r0, #0x00

        orr     r1, r0, #LOCKOUT|FIQ_MODE
        msr     cpsr_cxsf, r1
        ldr     sp, =_FIQ_STACK_ADDRESS

        orr     r1, r0, #I_BIT|IRQ_MODE
        msr     cpsr_cxsf, r1
        ldr     sp, =_IRQ_STACK_ADDRESS

        orr     r1, r0, #LOCKOUT|ABT_MODE
        msr     cpsr_cxsf, r1
        ldr     sp, =_ABT_STACK_ADDRESS

        orr     r1, r0, #LOCKOUT|UND_MODE
        msr     cpsr_cxsf, r1
        ldr     sp, =_UND_STACK_ADDRESS

        orr     r1, r0, #LOCKOUT|SVC_MODE
        msr     cpsr_cxsf, r1
        ldr     sp, =_SVC_STACK_ADDRESS

        b       Initialize_Data
        LTORG


Initialize_Data
        ldr     r0, =|Image$$RO$$Limit|
        ldr     r1, =|Image$$RW$$Base|
        ldr     r2, =|Image$$ZI$$Base|
        ldr     r3, =|Image$$ZI$$Limit|
        mov     r4, #0x00

        cmp     r0, r1
        beq     %F1
0
        cmp     r1, r2
        ldrcc   r5, [r0], #4
        strcc   r5, [r1], #4
        bcc     %B0
1
        cmp     r2, r3
        strcc   r4, [r2], #4
        bcc     %B1

        b       Initialize_Entry
        LTORG


        IMPORT  _os_entry
Initialize_Entry
        mov     r0, #SYS_MODE
        msr     cpsr_cxsf, r0
        ldr     sp, =_USR_STACK_ADDRESS

        bl      _os_entry
        b       .
        LTORG


        IMPORT  Isr_UndefineHandler
SystemUndefinedHandler
        stmfd   sp!, {r0-r3, ip, lr}
        sub     r0, lr, #4
        bl      Isr_UndefineHandler
        ldmfd   sp!, {r0-r3, ip, pc}^


        IMPORT  Isr_SwiHandler
SystemSwiHandler
        stmfd   sp!, {r0-r3, ip, lr}
        sub     r0, lr, #4
        ldr     r1, [r0]
        bic     r1, r1, #0xff000000
        bl      Isr_SwiHandler
        ldmfd   sp!, {r0-r3, ip, pc}^


        IMPORT  Isr_PrefetchAbortHandler
SystemPrefetchHandler
        stmfd   sp!, {r0-r3, ip, lr}
        sub     r0, lr, #4
        bl      Isr_PrefetchAbortHandler
        ldmfd   sp!, {r0-r3, ip, lr}
        subs    pc, lr, #4


        IMPORT  Isr_DataAbortHandler
SystemAbortHandler
        stmfd   sp!, {r0-r3, ip, lr}
        sub     r0, lr, #8
        bl      Isr_DataAbortHandler
        ldmfd   sp!, {r0-r3, ip, lr}
        subs    pc, lr, #8


        IMPORT  _irq_entry
SystemIrqHandler
        stmfd   sp!, {r0-r3, ip, lr}

        ldr     r0, =INTOFFSET
        ldr     r0, [r0]

        b       _irq_entry
        LTORG


        IMPORT  _irq_entry
SystemFiqHandler
        stmfd   sp!, {r0-r3, ip, lr}

        ldr     r1, =SRCPND
        ldr     r1, [r1]
        cmp     r1, #0x00
        beq     %F2
        mov     r0, #0x00
0
        movs    r1, r1, lsr #1
        bcs     %F1
        add     r0, r0, #1
        b       %B0
1
        b       _irq_entry
2
        ldmfd   sp!, {r0-r3, ip, lr}
        subs    pc, lr, #4
        LTORG


        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -