?? star.asm
字號:
*
* Go setup Memory and board specific bits prior to relocation.
*
mov ip, lr ; perserve link reg across call
bl platformsetup ; go setup pll,mux,memory
mov lr, ip ; restore link
mov pc, lr ; back to my caller
*************************************************************************
*
* Interrupt handling
*
*************************************************************************
*
* IRQ stack frame.
*
S_FRAME_SIZE .SET 72
S_OLD_R0 .SET 68
S_PSR .SET 64
S_PC .SET 60
S_LR .SET 56
S_SP .SET 52
S_IP .SET 48
S_FP .SET 44
S_R10 .SET 40
S_R9 .SET 36
S_R8 .SET 32
S_R7 .SET 28
S_R6 .SET 24
S_R5 .SET 20
S_R4 .SET 16
S_R3 .SET 12
S_R2 .SET 8
S_R1 .SET 4
S_R0 .SET 0
MODE_SVC .SET 0x13
I_BIT .SET 0x80
CFG_MALLOC_LEN .SET (0x20000 + 128*1024)
CONFIG_STACKSIZE .SET (128*1024)
CFG_GBL_DATA_SIZE .SET 128
*
* use bad_save_user_regs for abort/prefetch/undef/swi ...
* use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
*
bad_save_user_regs .macro
sub sp, sp, #S_FRAME_SIZE ; carve out a frame on current user stack
stmia sp, {r0 - r12} ; Save user registers (now in svc mode) r0-r12
ldr r2, _armboot_start
sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
sub r2, r2, #(CFG_GBL_DATA_SIZE+8) ; set base 2 words into abort stack
ldmia r2, {r2 - r3} ; get values for "aborted" pc and cpsr (into parm regs)
add r0, sp, #S_FRAME_SIZE ; grab pointer to old stack
add r5, sp, #S_SP
mov r1, lr
stmia r5, {r0 - r3} ; save sp_SVC, lr_SVC, pc, cpsr
mov r0, sp ; save current stack into r0 (param register)
.endm
irq_save_user_regs .macro
sub sp, sp, #S_FRAME_SIZE
stmia sp, {r0 - r12} ; Calling r0-r12
add r8, sp, #S_PC ; !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good.
stmdb r8, {sp, lr}^ ; Calling SP, LR
str lr, [r8, #0] ; Save calling PC
mrs r6, spsr
str r6, [r8, #4] ; Save CPSR
str r0, [r8, #8] ; Save OLD_R0
mov r0, sp
.endm
irq_restore_user_regs .macro
ldmia sp, {r0 - lr}^ ; Calling r0 - lr
mov r0, r0
ldr lr, [sp, #S_PC] ; Get PC
add sp, sp, #S_FRAME_SIZE
subs pc, lr, #4 ; return & move spsr_svc into cpsr
.endm
get_bad_stack .macro
ldr r13, _armboot_start ; setup our mode stack
sub r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
sub r13, r13, #(CFG_GBL_DATA_SIZE+8) ; reserved a couple spots in abort stack
str lr, [r13] ; save caller lr in position 0 of saved stack
mrs lr, spsr ; get the spsr
str lr, [r13, #4] ; save spsr in position 1 of saved stack
mov r13, #MODE_SVC ; prepare SVC-Mode
;msr spsr_c, r13
msr spsr, r13 ; switch modes, make sure moves will execute
mov lr, pc ; capture return pc
movs pc, lr ; jump to next instruction & switch modes.
.endm
get_irq_stack .macro ; setup IRQ stack
ldr sp, IRQ_STACK_START
.endm
get_fiq_stack .macro ; setup FIQ stack
ldr sp, FIQ_STACK_START
.endm
*
* exception handlers
*
.align 8
undefined_instruction:
get_bad_stack
bad_save_user_regs
;bl do_undefined_instruction ;;;該程序在C代碼中
.align 8
software_interrupt:
get_bad_stack
bad_save_user_regs
;bl do_software_interrupt ;;;該程序在C代碼中
.align 8
prefetch_abort:
get_bad_stack
bad_save_user_regs
;bl do_prefetch_abort ;;;該程序在C代碼中
.align 8
data_abort:
get_bad_stack
bad_save_user_regs
;bl do_data_abort ;;;該程序在C代碼中
.align 8
not_used:
get_bad_stack
bad_save_user_regs
;bl do_not_used ;;;該程序在C代碼中"
.if $$isdefed ("CONFIG_USE_I")
.align 8
irq:
get_irq_stack
irq_save_user_regs
;bl do_irq ;;;該程序在C代碼中
irq_restore_user_regs
.align 8
fiq:
get_fiq_stack
* someone ought to write a more effiction fiq_save_user_regs*
irq_save_user_regs
;bl do_fiq ;;;該程序在C代碼中
irq_restore_user_regs
.else
.align 8
irq:
get_bad_stack
bad_save_user_regs
;bl do_irq ;;;該程序在C代碼中
.align 8
fiq:
get_bad_stack
bad_save_user_regs
;bl do_fiq ;;;該程序在C代碼中
.endif
.align 8
.global reset_cpu
reset_cpu:
ldr r1, rstctl1 ; get clkm1 reset ctl
mov r3, #0x3 ; dsp_en + arm_rst = global reset
strh r3, [r1] ; force reset
mov r0, r0
_loop_forever:
b _loop_forever
;***************************************************************************
;* PROCESS INITIALIZATION TABLE.
;*
;* THE TABLE CONSISTS OF A SEQUENCE OF RECORDS OF THE FOLLOWING FORMAT:
;*
;* .word <length of data (bytes)>
;* .word <address of variable to initialize>
;* .word <data>
;*
;* THE INITIALIZATION TABLE IS TERMINATED WITH A ZERO LENGTH RECORD.
;*
;***************************************************************************
tbl_addr: .set R0
var_addr: .set R1
length: .set R2
data: .set R3
auto_init:
B rec_chk
;*------------------------------------------------------
;* PROCESS AN INITIALIZATION RECORD
;*------------------------------------------------------
record: LDR var_addr, [tbl_addr], #4 ;
;*------------------------------------------------------
;* COPY THE INITIALIZATION DATA
;*------------------------------------------------------
TST var_addr, #3 ; SEE IF DEST IS ALIGNED
BNE _bcopy ; IF NOT, COPY BYTES
SUBS length, length, #4 ; IF length <= 3, ALSO
BMI _bcont ; COPY BYTES
_wcopy: LDR data, [tbl_addr], #4 ;
STR data, [var_addr], #4 ; COPY A WORD OF DATA
SUBS length, length, #4 ;
BPL _wcopy ;
_bcont: ADDS length, length, #4 ;
BEQ _cont ;
_bcopy: LDRB data, [tbl_addr], #1 ;
STRB data, [var_addr], #1 ; COPY A BYTE OF DATA
SUBS length, length, #1 ;
BNE _bcopy ;
_cont: TST tbl_addr, #0x3 ; MAKE SURE THE ADDRESS
BICNE tbl_addr, tbl_addr, #0x3 ; IS WORD ALIGNED
ADDNE tbl_addr, tbl_addr, #4 ;
rec_chk:LDR length, [tbl_addr], #4 ; PROCESS NEXT
CMP length, #0 ; RECORD IF LENGTH IS
BNE record ; NONZERO
MOV PC, LR
__stack:.usect ".stack", 0, 4
; .ltorg
rstctl1 .word 0xfffece10
WDTIM_MODE .word 0xfffec808
REG_IHL1_MIR .word 0xfffecb04
REG_IHL2_MIR .word 0xfffe0004
CK_DPLL1 .word 0xfffecf00
********** 測試程序的數據 **********
SRAM_SIZE .WORD 0X8000
SRAM_START_POINT .WORD 0X0
SDRAM_SIZE .WORD 0X100000 ;暫時用1M
SDRAM_START_POINT .WORD 0X10000000
FLASH_START_POINT .WORD 0X0
FLASH_SIZE .WORD 0X100000 ;暫時用1M
TEST_CONST .WORD 0X55555555
******************************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -