Skip to content

Instantly share code, notes, and snippets.

@pamaury
Created February 15, 2014 21:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pamaury/9025537 to your computer and use it in GitHub Desktop.
Save pamaury/9025537 to your computer and use it in GitHub Desktop.
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