;**********************************************************************
;系统调用实验(QQ2440, MINI2440,TQ2440)
;**********************************************************************
GPBCONEQU0x56000010
GPBDATEQU0x56000014
SYS_STACK_BASE EQU0x33000000
EXPORT SWI_LED
AREA SWI_LED ,CODE,READONLY
ENTRY
;**********************************************************************
;设置中断向量,除Reset和HandleSWI外,其它异常都没有使用(如果不幸发生了,
;将导致死机)
;**********************************************************************
; 0x00:复位Reset异常
bReset
; 0x04:未定义异常(未处理)
HandleUndef
bHandleUndef
; 0x08:软件中断异常,跳往软件中断处理函数HandleSWI
bHandleSWI
; 0x0c:指令预取异常(未处理)
HandlePrefetchAbt
bHandlePrefetchAbt
; 0x10:数据访问中止异常(未处理)
HandleDataAbt
bHandleDataAbt
; 0x14:未使用异常(未处理)
HandleNotUsed
bHandleNotUsed
; 0x18:一般中断异常(未处理)
HandleIRQ
bHandleIRQ
; 0x1c:快速中断异常(未处理)
HandleFIQ
bHandleFIQ
Reset;复位异常处理入口
;关闭看门狗
ldr r0, = 0x53000000
mov r1, #0
str r1, [r0]
bl initmem
ldrsp,=0x32000000;设置管理模式栈指针
; LED灯初始化
ldr r0, =GPBCON; LED的GPIO接口配置寄存器
ldr r1, =0x00015400; GPIO配置数据
str r1, [r0];设置GPIO
ldr r0, =GPBDAT; Led数据寄存器
ldr r1, =0x1e0;熄灭所有Led
str r1, [r0]
msrcpsr_c,#0xdf
ldrsp, =SYS_STACK_BASE
msrcpsr_c,#0x50;开启系统中断,进入用户模式,该指令执行完
;就进入用户空间,执行用户程序xmain
ldrlr,=halt_loop;设置管理模式下返回地址
IMPORT xmain
ldrpc,=xmain;跳入主函数main里执行
halt_loop
b halt_loop
;***********************************************************************
;软中断处理
;***********************************************************************
IMPORT do_led_on
IMPORT do_led_off
HandleSWI
STMFDSP!, {R0-R12,LR};保存程序执行现场
LDRR4, [LR, #-4]; LR - 4为指令" swi xxx"的地址,指令低24位软件中断号
BICR4, R4, #0xFF000000;取得ARM指令24位立即数
CMPR4, #1;判断24位立即数的值,如果为1,调用do_led_on系统调用
LDREQLR, =swi_return;软中断处理返回地址
LDREQPC, = do_led_on;软中断号1对应系统调用处理
CMPR4, #2;判断24位立即数的值,如果为2,调用do_led_off系统调用
LDREQLR, =swi_return;软中断处理返回地址
LDREQPC, = do_led_off;软中断号2对应系统调用处理
MOVNER0, #-1;没有该软中断号对应函数,出错返回-1
swi_return
LDMIASP!, {R0-R12, PC}^;中断返回, ^表示将spsr的值复制到cpsr
initmem
ldr r0, =0x48000000;内存控制寄存器起始地址
ldr r1, =0x48000034;内存控制寄存器结束地址
adr r2, memdata ;加载寄存器设置数据区首地址
initmemloop
ldr r3, [r2], #4
str r3, [r0], #4
teq r0, r1
bne initmemloop;循环设置每一个寄存器
mov pc, lr
memdata
DCD0x22000000 ;BWSCON
DCD0x00000700;BANKCON0
DCD0x00000700;BANKCON1
DCD0x00000700;BANKCON2
DCD0x00000700;BANKCON3
DCD0x00000700;BANKCON4
DCD0x00000700;BANKCON5
DCD0x00018005;BANKCON6
DCD0x00018005;BANKCON7
DCD0x008e07a3;REFRESH
DCD0x000000b1;BANKSIZE
DCD0x00000030;MRSRB6
DCD0x00000030;MRSRB7
END;代码结束