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

📄 vectors.s

📁 一个小型的嵌入式操作系统内核,可用于多种硬件平台
💻 S
📖 第 1 页 / 共 2 页
字号:
    ldr     r0,=BDIDES0 
    ldr     r1,=0x40000000     ;BDIDESn 复位值应为 0x40000000 
    str     r1,[r0]
    ldr     r0,=BDIDES1
    ldr     r1,=0x40000000     ;BDIDESn 复位值应为 0x40000000 
    str     r1,[r0]

    ;设置存储器控制寄存器,存储器的配置数据都存储在SMRDATA为起始地址的数据表中,
    ;下面的代码可以一次将预先配置好的初始化数据存入与存储器控制器相关的13个寄存
    ;器,这些寄存器则是以0x01c80000为起始地址的13个连续的32位寄存器
    ldr     r0,=SMRDATA
    ldmia   r0,{r1-r13}
    ldr     r0,=0x01c80000    ; BWSCON存储控制寄存器地址
    stmia   r0,{r1-r13}

    BL      relocate
    BL      initStack
    BL      start_kernel
    
undefined_instruction
    B   undefined_instruction



;**************************************************************************************************
; Software Interrupt Handler
;**************************************************************************************************
software_interrupt
        ldr     sp, =StackSvc                   ; Initialize SP in SVC mode
        STMFD   SP!, {R0-R7}                   ; PUSH WORKING REGISTERS ONTO IRQ STACK
        MOV     R0, SP                         ; Save   IRQ stack pointer
        MOV     R1, LR                         ; Save PC for return address to task
        MRS     R2, SPSR                       ; Copy SPSR (i.e. interrupted task's CPSR) to R2

        MSR     CPSR_c, #(NO_INT | SYS32_MODE) 
                                               ; SAVE TASK'S CONTEXT ONTO TASK'S STACK
        STMFD   SP!, {R1}                      ;    Push task's Return PC
        STMFD   SP!, {LR}                      ;    Push task's LR
        STMFD   SP!, {R8-R12}                  ;    Push task's R12-R8
        MOV     R12,   R0
        LDMFD   R12!, {R3-R10}                 ;    Move task's R0-R7 from IRQ stack to SVC stack
        STMFD   SP!, {R3-R10}
        STMFD   SP!, {R2}                      ;    Push task's CPSR (i.e. SVC's SPSR)

        MSR     CPSR_c, #(NO_INT | SVC32_MODE) 
        LDR     R8, [R1,#-4]                ; get SWI ID in ARM status
        BIC     R8, R8, #0xFF000000        
        
        LDMFD   SP!, {R0-R7}                    ; Restore registers R0-R7, which are parameters from user mode
        
        MSR     CPSR_c, #SYS32_MODE             ; Enter SYS32 mode and enable interrupt
        ldr     lr,=swi_exit
        ldr     R9,=syscall_table
        ldr     pc,[R9,R8,LSL#2]
swi_exit        
        mov     r1,sp

        str     r0,[r1,#+4]                 ;Save the return value to stack to replace the previous
                                            ;value of r0 with the return value.
        b       comm_exit

;**************************************************************************************************
; Prefetch Abort Exception handler
;**************************************************************************************************
prefetch_abort
    B   prefetch_abort

;**************************************************************************************************
; Data Abort Exception handler
;**************************************************************************************************
data_abort
    B   data_abort

;**************************************************************************************************
; Prefetch Abort Exception handler
;**************************************************************************************************
not_used
    B   not_used
    
;**************************************************************************************************
; IRQ handler ( Vectored Interrupt Enabled )
;**************************************************************************************************
irq
    B   irq

;**************************************************************************************************
; FIQ handler 
;**************************************************************************************************
fiq
    B   fiq

;**************************************************************************************************
; Timer 0 handler
;**************************************************************************************************
handle_TIMER0
        SAVE_IRQ_CONTEXT
        MSR     CPSR_c, #(NO_INT |SYS32_MODE)       ; Disable interrupt
        ldr     lr,=comm_exit                       ; Set the return address
        ldr     pc, =tm_isr                         ; Call the ISR


;**************************************************************************************************
; Default ISR Handler
;**************************************************************************************************
handle_default
        SAVE_IRQ_CONTEXT
        MSR     CPSR_c, #(NO_INT |SYS32_MODE)       ; Disable interrupt
        ldr     lr,=comm_exit                       ; Set the return address
        ldr     pc, =default_isr                    ; Call Default ISR


;**************************************************************************************************
; Commonly Used Code to Exit Interrupt 
;**************************************************************************************************
comm_exit
        RESTORE_IRQ_CONTEXT







;**************************************************************************************************
; Relocate code from ROM to RAM, including RO, RW,etc 
;**************************************************************************************************
relocate
    mov r7, lr

    ldr r0, KERNEL_RW_DATA_rom_start
    ldr r1, KERNEL_RW_DATA_ram_start
    ldr r2, KERNEL_RW_DATA_ram_end
    bl  copy_mem

    mov pc,r7  
    
;**************************************************************************************************
;* Description: copy memory
;* Parameters:   R0      source memory start address
;                R1      destination memory start address
;                R2      destination memory end address
;**************************************************************************************************
copy_mem
    ldmia    r0!, {r3-r6}
    stmia    r1!, {r3-r6}
    cmp    r1, r2
    ble    copy_mem    
    mov pc,lr    
    
;**************************************************************************************************
; initialize stack in different mode
;**************************************************************************************************
initStack    
        MOV     R0, LR

;set SVC mode stack
        MSR     CPSR_c, #0xd3
        LDR     SP, =StackSvc
;set IRQ mode stack
        MSR     CPSR_c, #0xd2
        LDR     SP, =StackIrq
;set FIRQ mode stack
        MSR     CPSR_c, #0xd1
        LDR     SP, =StackFiq
;set Abort mode stack
        MSR     CPSR_c, #0xd7
        LDR     SP, =StackAbt
;set Undefined mode stack
        MSR     CPSR_c, #0xdb
        LDR     SP, =StackUnd
;set SYS mode stack
        MSR     CPSR_c, #0x5f
        LDR     SP, =StackUsr
        MOV     PC, R0

;****************************************************
;*	The function for entering power down mode		*
;****************************************************
;void EnterPWDN(int CLKCON);
EnterPWDN
    mov	    r2,r0               ;r0=CLKCON
    ldr	    r0,=REFRESH		
    ldr	    r3,[r0]
    mov	    r1, r3
    orr	    r1, r1, #0x400000   ;self-refresh enable
    str	    r1, [r0]

    nop     ;Wait until self-refresh is issued. May not be needed.
    nop     ;If the other bus master holds the bus, ...
    nop	    ; mov r0, r0
    nop
    nop
    nop
    nop

;enter POWERDN mode
    ldr	    r0,=CLKCON
    str	    r2,[r0]

;wait until enter SL_IDLE,STOP mode and until wake-up
    mov	    r0,#0xff
0   subs    r0,r0,#1
    bne	    %B0

;exit from DRAM/SDRAM self refresh mode.
    ldr	    r0,=REFRESH
    str	    r3,[r0]
    mov	    pc,lr


;**************************************************************************************************
; address used in relocation
;**************************************************************************************************
    IMPORT  |Load$$KERNEL_CODE$$Base|
    IMPORT  |Image$$KERNEL_CODE$$Base|
    IMPORT  |Image$$KERNEL_CODE$$Limit|
    IMPORT  |Load$$KERNEL_RW_DATA$$Base|
    IMPORT  |Image$$KERNEL_RW_DATA$$Base|
    IMPORT  |Image$$KERNEL_RW_DATA$$Limit|
    IMPORT  |Image$$KERNEL_UNIT_DATA$$ZI$$Limit|
    EXPORT  free_ram_start_addr

; Kernel code start address in Flash
KERNEL_CODE_rom_start           DCD     |Load$$KERNEL_CODE$$Base|

; Kernel code start address in RAM
KERNEL_CODE_ram_start           DCD     |Image$$KERNEL_CODE$$Base|

; Kernel code end address in RAM
KERNEL_CODE_ram_end             DCD     |Image$$KERNEL_CODE$$Limit|

; Kernel data start address in Flash
KERNEL_RW_DATA_rom_start        DCD     |Load$$KERNEL_RW_DATA$$Base|

; Kernel data start address in RAM
KERNEL_RW_DATA_ram_start        DCD     |Image$$KERNEL_RW_DATA$$Base|

; Kernel data end address in RAM
KERNEL_RW_DATA_ram_end          DCD     |Image$$KERNEL_RW_DATA$$Limit|

free_ram_start_addr             DCD     |Image$$KERNEL_UNIT_DATA$$ZI$$Limit|

    LTORG
SMRDATA DATA
;**************************************************************************************************
; Memory configuration has to be optimized for best performance  
; The following parameter is not optimized.    
; Memory access cycle parameter strategy:
; 1) Even FP-DRAM, EDO setting has more late fetch point by half-clock
; 2) The memory settings,here, are made the safe parameters even at 66Mhz.
; 3) FP-DRAM Parameters:tRCD=3 for tRAC, tcas=2 for pad delay, tcp=2 for bus load.
; 4) DRAM refresh rate is for 40Mhz. 
;**************************************************************************************************
    ;bank0	16bit BOOT ROM SST39VF160/SST39VF320
    ;bank1	8bit Nand Flash K9F2808U0A/K9F5608U0A
    ;bank2	16bit USB1.1 PDIUSBD12
    ;bank3	RTL8019
    ;bank4	No Uesed
    ;bank5	No Uesed
    ;bank6	16bit SDRAM
    ;bank7	16bit SDRAM
    IF BUSWIDTH = 16
        ;DCD 0x11111111	;Bank0=OM[1:0], Bank0~Bank7=16bit
        DCD 0x11111001	;Bank0=OM[1:0]  16bit BootRomSST39VF160/SST39VF320) :0x0
;             |||||||-	 Bank1=8bit Nand Flash
;             |||||---	 Bank2=8bit PDIUSBD12
;             ||||----	 Bank3=16bit RTL8019
;             |||-----	 Bank4~5=16bit No Uesd
;             --------	 Bank6~7=16bit SDRAM
    ELSE ;BUSWIDTH = 32
	DCD 0x22222220	;Bank0=OM[1:0], Bank1~Bank7=32bit
    ENDIF
	DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))	;GCS0
	DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))	;GCS1 
	DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))	;GCS2
	DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))	;GCS3
	DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))	;GCS4
	DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))	;GCS5
    IF BDRAMTYPE = "DRAM" 
        DCD ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN))	;GCS6 check the MT value in parameter.a
	DCD ((B7_MT<<15)+(B7_Trcd<<4)+(B7_Tcas<<3)+(B7_Tcp<<2)+(B7_CAN))	;GCS7
    ELSE ;"SDRAM"
	DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))	;GCS6
	DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))	;GCS7
    ENDIF
	DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)	;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019
	DCD 0x10			;SCLK power down mode, BANKSIZE 32M/32M
	DCD 0x20			;MRSR6 CL=2clk
	DCD 0x20			;MRSR7

	ALIGN



    END
    

⌨️ 快捷键说明

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