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

📄 boot.s

📁 sl811hs 的驱动
💻 S
字号:
 ;2003/4/11 
 ;today, I have finished boot from sdram, a notable progress. I am very excited.
 ;I name the version is V2.0
 ;the detail information refer to my notebook
 
   GET board.h   
   GET sreg.h  
    
 AREA boot,CODE,READONLY
     
    IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
    IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
    IMPORT |Image$$ZI$$Base| ; Base & limit of area
    IMPORT |Image$$ZI$$Limit| ; to zero initialise
    
    IMPORT |Image$$RO$$Base|      ;===============test
    IMPORT |Image$$RW$$Limit|
 
 ENTRY
 
 B Reset_Handler              ;address=0x0000
 B SystemUndefinedHandler     ;Undefined_Handler                  0x0004
 B SystemSwiHandler           ;SWI_Handler                        0x0008
 B SystemPrefetchHandler      ;Prefetch_Handler                   0x000C
 B SystemAbortHandler         ;Abort_Handler                      0x0010
 NOP                          ;        0x0014   reserved
 B SystemIrqHandler           ;IRQ_Handler                        0x0018
 B SystemFiqHandler           ;FIQ_Handler                        0x001C
 
Reset_Handler
 ;==============================================
 ;        SDRAM & FLASH CONFIGRATION
 ;==============================================

    LDR r0, =SYSCFG
    LDR r1, =dSYSCFG
    STR r1, [r0]
    
    LDR r0, =SystemInitData
    LDMIA r0, {r1-r12}
    LDR r0, =EXTDBWTH
    STMIA r0, {r1-r12}
    
 ;==============================================
 ;   transfer the codes from flash to sdram
 ;==============================================
 
     LDR r0, =|Image$$RO$$Base|
     LDR r1, =|Image$$RO$$Limit|
     LDR r2, =DRAM_BASE
     
     SUB r1, r1, r0
     ADD r1, r1, #4
     
CODE_LOOP
     LDR r3, [r0], #4
     STR r3, [r2], #4
     SUBS r1, r1, #4
     BNE  CODE_LOOP
     
 
 ;===============================================
 ;   change base address of rom and sdram
 ;===============================================
    
    LDR r0, =SystemInitData_S
    LDMIA r0, {r1-r12}
    LDR r0, =EXTDBWTH
    STMIA r0, {r1-r12}

 ;===========================================
 ;       initialize stack
 ;===========================================

 ;after reseted, 4510 has been in SVC mode.
    
INITIALIZE_STACK
    
    MRS r0, cpsr                       ;now, 4510 is in SVC mode
    BIC r0, r0, #LOCKOUT | MODE_MASK   ;LOCKOUT|MODE_MASK=1101,1111,~=0010,0000
    ORR r2, r0, #USR_MODE              ;save[31..8] & T bit. 
    
    ORR r1, r0, #LOCKOUT | FIQ_MODE    ;change mode & mask irq &frq
    MSR cpsr_cxsf, r1                       
    MSR spsr_cxsf, r2                       ;save user mode
    LDR sp, =FIQ_STACK
    
    ORR r1, r0, #LOCKOUT | IRQ_MODE
    MSR cpsr_cxsf, r1
    MSR spsr_cxsf, r2
    LDR sp, =IRQ_STACK
    
    ORR r1, r0, #LOCKOUT | ABT_MODE
    MSR cpsr_cxsf, r1
    MSR spsr_cxsf, r2
    LDR sp, =ABT_STACK
    
    ORR r1, r0, #LOCKOUT | UDF_MODE
    MSR cpsr_cxsf, r1
    MSR spsr_cxsf, r2
    LDR sp, =UDF_STACK
    
    ORR r1, r0, #LOCKOUT | SVC_MODE
    MSR cpsr_cxsf, r1
    MSR spsr_cxsf, r2
    LDR sp, =SVC_STACK                ; Change CPSR to SVC mode
    
    ;the stack for user is init in later.
    
;================================================
;    INITIALISE MEMORY REQUIRED BY C CODE
;================================================
    LDR r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
    LDR r1, =|Image$$RW$$Base| ;  RAM copy
    LDR r3, =|Image$$ZI$$Base| ; Zero init base => top of initialised data
    
    CMP r0, r1 ; Check that they are different
    BEQ %1
0   CMP r1, r3 ; Copy init data
    LDRCC r2, [r0], #4
    STRCC r2, [r1], #4
    BCC %0
1   LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
    MOV r2, #0
2   CMP r3, r1 ; Zero init
    STRCC r2, [r3], #4          ;if r3<r1, so init these cells to be 0.
    BCC %2


;================================================
;  change to user mode & set up user mode stack
;================================================
    MRS r0, cpsr
    BIC r0, r0, #LOCKOUT | MODE_MASK
    ORR r1, r0, #USR_MODE
    MSR cpsr_cxsf, r1
    LDR sp, =USR_STACK
    
;================================================
;               enter c program
;================================================
   
    IMPORT C_entry
    BL C_entry
    
;note:
;interupt init is charge of user code.
;in user code, the first process is set interrupt(irq,fiq),
;clear pend bits,set priority, start apropriate interrupt. 


;=============================================
;    EXCEPTION_VENDOR_FUNCTION
;============================================= 
 
SystemUndefinedHandler
    
    IMPORT ISR_UndefHandler       ;ISR_UndefHandler is c code in isr.c
    STMFD sp!, {r0-r12}
    B ISR_UndefHandler
    LDMFD sp!, {r0-r12, pc}^

    
SystemSwiHandler
    STMFD sp!, {r0-r12,lr}
    LDR r0, [lr, #-4]
    BIC r0, r0, #0xff000000
    CMP r0, #0xff
    BEQ MakeSVC
    LDMFD sp!, {r0-r12, pc}^
MakeSVC
    MRS r1, spsr
    BIC r1, r1, #MODE_MASK
    ORR r2, r1, #SVC_MODE
    MSR spsr_cxsf, r2
    LDMFD sp!, {r0-r12, pc}^

    
SystemPrefetchHandler
    IMPORT ISR_PrefetchHandler      ;ISR_PrefetchHandler is c code in isr.c
    STMFD sp!, {r0-r12, lr}
    B ISR_PrefetchHandler
    LDMFD sp!, {r0-r12, lr}
    ;ADD sp, sp, #4
    SUBS pc, lr, #4

    
SystemAbortHandler
    IMPORT ISR_AbortHandler         ;ISR_AbortHandler is c code in isr.c
    STMFD sp!, {r0-r12, lr}
    B ISR_AbortHandler
    LDMFD sp!, {r0-r12, lr}
    ;ADD sp, sp, #4
    SUBS pc, lr, #8


SystemReserv
    SUBS pc, lr, #4

    
SystemIrqHandler
    IMPORT ISR_IrqHandler
    STMFD sp!, {r0-r12,lr}
    BL ISR_IrqHandler    
    LDMFD sp!, {r0-r12,lr}
    SUBS pc, lr, #4


SystemFiqHandler
    IMPORT ISR_FiqHandler   
    STMFD sp!, {r0-r7, lr}
    BL ISR_FiqHandler
    LDMFD sp!, {r0-r7, lr}
    SUBS pc, lr, #4
    
    
;**********************************************************************
 AREA ROMDATA,DATA,READONLY 
;******************SDARM SYSTEM INITIALIZE DATA************************
SystemInitData
    DCD  dEXTDBWTH
    DCD  dROMCON0
    DCD  dROMCON1
    DCD  dROMCON2
    DCD  dROMCON3
    DCD  dROMCON4
    DCD  dROMCON5
    DCD  dDRAMCON0
    DCD  dDRAMCON1
    DCD  dDRAMCON2
    DCD  dDRAMCON3
    DCD  dREFEXTCON

SystemInitData_S
    DCD  dEXTDBWTH
    DCD  dROMCON0_S
    DCD  dROMCON1_S
    DCD  dROMCON2_S
    DCD  dROMCON3_S
    DCD  dROMCON4_S
    DCD  dROMCON5_S
    DCD  dDRAMCON0_S
    DCD  dDRAMCON1_S
    DCD  dDRAMCON2_S
    DCD  dDRAMCON3_S
    DCD  dREFEXTCON

;**********************************************************************
; AREA RAMDATA, DATA, READWRITE
 
;*********************************************************************
 AREA SYS_STACK, DATA, NOINIT
 
 ;note:determine the stack address when linking
      
             %  USR_STACK_SIZE
USR_STACK
             %  UDF_STACK_SIZE
UDF_STACK
             %  ABT_STACK_SIZE
ABT_STACK
             %  IRQ_STACK_SIZE
IRQ_STACK
             %  FIQ_STACK_SIZE
FIQ_STACK
             %  SVC_STACK_SIZE
SVC_STACK

                     END

⌨️ 快捷键说明

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