Created
February 15, 2014 21:37
-
-
Save pamaury/9025537 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void irq_handler(void) | |
{ | |
/* save stuff */ | |
asm volatile( | |
"sub lr, lr, #4 \n" /* Create return address */ | |
"stmfd sp!, { r0-r6, r12, lr } \n" /* Save what gets clobbered */ | |
"ldr r0, =0x80000000 \n" /* Read HW_ICOLL_VECTOR */ | |
"ldr r0, [r0] \n" /* and notify as side-effect */ | |
"ldr r1, =0x8001c290 \n" /* Save pointer to instruction */ | |
"str lr, [r1] \n" /* in HW_DIGCTL_SCRATCH0 */ | |
"mrs r6, spsr \n" /* Save SPSR_irq */ | |
"msr cpsr_c, #0x13 \n" /* Switch to SVC mode, enable IRQ */ | |
"mov r4, lr \n" /* Save lr_SVC */ | |
"and r5, sp, #4 \n" /* Align SVC stack */ | |
"sub sp, sp, r5 \n" /* on 8-byte boundary */ | |
"blx _irq_handler \n" /* Process IRQ, returns ack level */ | |
"add sp, sp, r5 \n" /* Undo alignement */ | |
"mov lr, r4 \n" /* Restore lr_SVC */ | |
"msr cpsr_c, #0x92 \n" /* Mask IRQ, return to IRQ mode */ | |
"msr spsr_cxsf, r6 \n" /* Restore SPSR_irq */ | |
"mov r1, #1 \n" /* Compute ack level value */ | |
"lsl r0, r1, r0 \n" /* (1 << ack_lvl) */ | |
"ldr r1, =0x80000010 \n" /* Read HW_ICOLL_LEVELACK */ | |
"str r0, [r1] \n" /* and write it */ | |
"ldmfd sp!, { r0-r6, r12, pc }^ \n" /* Restore regs, and RFE */); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment