📄 irq.s
字号:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @
@ Interrupt Handlers for ARM @
@ @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Author: Arthur Chang
@ Last Revision: 4/30/2006 Initial Revision
.equ ARM_MODE_USR, 0x10
.equ ARM_MODE_FIQ, 0x11
.equ ARM_MODE_IRQ, 0x12
.equ ARM_MODE_SVC, 0x13
.equ ARM_MODE_ABT, 0x17
.equ ARM_MODE_UND, 0x1B
.equ ARM_MODE_SYS, 0x1F
.equ I_BIT, 0x80
.equ F_BIT, 0x40
.equ AIC_IVR, 0xfffff100
.equ AIC_EOICR, 0xfffff130
.text
.arm
.align 0
.global IRQ_Handler
IRQ_Handler:
SUB PC, LR, #4 @Correct Prefetch
STMFD SP!, {R0-R12, LR} @save the registers
MRS R4, SPSR @save value of SPSR_IRQ
LDR R1, =AIC_IVR @read AIC_IVR, clearing interrupt
LDR R0, [R1]
@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SYS MODE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
MOV R4, #ARM_MODE_SYS
MSR CPSR_c, R4
STMFD SP!, {R12, LR} @save the registers in SYS
LDR R1, =0xfffff108
LDR R2, [R1, R0, LSL #2]
LDR R2, =0xFFFFF0E4
MOV LR, PC
BX R2 @branch specific interrupt handler
LDMFD SP!, {R12, LR} @restore register values
@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SYS MODE END @@@@@@@@@@@@@@@@@@@@@@@@@
MOV R7, #ARM_MODE_IRQ
MSR CPSR_c, R7 @change back to IRQ Mode
MSR SPSR_cf, R4 @restore value of SPSR_IRQ
LDR R1, =AIC_EOICR @any value can be written to indicate
STR R0, [R1] @ end of interrupt
LDMFD SP!, {R0-R12, PC}^ @restore registers in IRQ mode.
.global IRQ_Enable
IRQ_Enable:
MRS R0, CPSR @Read in the CPSR value
BIC R0, R0, #I_BIT @clears the I_Bit, enabling interupt
MSR CPSR_c, R0 @writes the value back
BX LR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -