01 static void install_irq_handler( void (*isr)(void) )
02 {
/* ARM irq exception vector addr is 0x00000018 */
03 unsigned int * irq_vec_addr = ( unsigned int * ) 0x18;
/* this is isr entry address, could be another address like 0x3c, 0x58... */
04 unsigned int * isr_entry_addr = ( unsigned int * ) 0x38;
05 unsigned int instruction;
/* set the ISR entry at 0x38 */
06 *isr_entry_addr = (unsigned int)isr;
/* make an instruction: it is machine-code for "ldr pc, [pc, #(38-18-]" */
07 instruction = ((unsigned int) isr_entry_addr - (unsigned int)irq_vec_addr - 0x0 | 0xe59ff000;
/* set this instruction at 0x18 */
08 *irq_vec_addr = instruction;