00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00020 #ifndef __IRQ_H__
00021 #define __IRQ_H__
00022
00023
00024
00025 #define __irq
00026 #define __fiq
00027
00028
00029
00030
00031
00032
00033
00034 #define NESTED_INTERRUPT 0
00035
00036 #define I_Bit 0x80
00037 #define F_Bit 0x40
00038
00039 #define SYS32Mode 0x1f
00040 #define IRQ32Mode 0x12
00041 #define FIQ32Mode 0x11
00042
00043 #define WDT_INT 0
00044 #define SWI_INT 1
00045 #define ARM_CORE0_INT 2
00046 #define ARM_CORE1_INT 3
00047 #define TIMER0_INT 4
00048 #define TIMER1_INT 5
00049 #define UART0_INT 6
00050 #define UART1_INT 7
00051 #define PWM0_INT 8
00052 #define I2C0_INT 9
00053 #define SPI0_INT 10
00054 #define SPI1_INT 11
00055 #define PLL_INT 12
00056 #define RTC_INT 13
00057 #define EINT0_INT 14
00058 #define EINT1_INT 15
00059 #define EINT2_INT 16
00060 #define EINT3_INT 17
00061 #define ADC0_INT 18
00062 #define I2C1_INT 19
00063 #define BOD_INT 20
00064 #define ADC1_INT 21
00065 #define USB_INT 22
00066
00067 #define IRQ_SLOT_EN 0x20
00068 #define VIC_SIZE 16
00069
00070 #define VECT_ADDR_INDEX 0x100
00071 #define VECT_CNTL_INDEX 0x200
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #if 0
00084 #if NESTED_INTERRUPT
00085 #define IENABLE __asm { MRS LR, SPSR } \
00086 __asm { STMFD SP!, {LR} } \
00087 __asm { MSR CPSR_c, #SYS32Mode } \
00088 __asm { STMFD SP!, {LR} }
00089 #else
00090 #define IENABLE ;
00091 #endif
00092
00093 #if NESTED_INTERRUPT
00094 #define IDISABLE __asm { LDMFD SP!, {LR} } \
00095 __asm { MSR CPSR_c, #(IRQ32Mode|I_Bit) } \
00096 __asm { LDMFD SP!, {LR} } \
00097 __asm { MSR SPSR_cxsf, LR }
00098 #else
00099 #define IDISABLE ;
00100 #endif
00101 #endif
00102
00103
00104 #if NESTED_INTERRUPT
00105 #warning "Macros not tested successfully with arm-elf-gcc
00106 #define IENABLE asm volatile( \
00107 "MRS LR, SPSR \n" \
00108 "STMFD SP!, {LR} \n" \
00109 "MSR CPSR_c, #0x1F \n" \
00110 "STMFD SP!, {LR} " )
00111 #else
00112 #define IENABLE ;
00113 #endif
00114
00115
00116 #if NESTED_INTERRUPT
00117 #define IDISABLE asm volatile( \
00118 "LDMFD SP!, {LR} \n" \
00119 "MSR CPSR_c, #0x92 \n" \
00120 "LDMFD SP!, {LR} \n" \
00121 "MSR SPSR_cxsf, LR \n" )
00122 #else
00123 #define IDISABLE ;
00124 #endif
00125
00126
00127 void irq_vic_init(void);
00128 bool_t irq_install(uint32_t number, void *p_handler);
00129 bool_t irq_uninstall(uint32_t number);
00130
00131
00132 #endif // __IRQ_H__