00001
00038 #ifndef ARCH_INTC_H_INCLUDED
00039 #define ARCH_INTC_H_INCLUDED
00040
00041 #include <compiler.h>
00042
00048 #define intc_priv_entry_sym(id) intc_priv_entry_irq##id
00049 #define intc_priv_data_sym(id) intc_priv_data_irq##id
00050
00051
00052 #if defined(__GNUC__) || defined(__DOXYGEN__)
00053
00054 #define INTC_DEFINE_HANDLER(id, handler, level) \
00055 extern void *intc_priv_data_sym(id); \
00056 extern void __attribute__((__signal__)) \
00057 intc_priv_entry_sym(id)(void); \
00058 void intc_priv_entry_sym(id)(void) \
00059 { \
00060 handler(intc_priv_data_sym(id)); \
00061 } \
00062 void *intc_priv_data_sym(id)
00063
00064 #elif defined(__ICCAVR__)
00065
00066 #define IAR_VECTOR(x) (4 * (x - 1))
00067 #define INTC_DEFINE_HANDLER(id, handler, level) \
00068 extern void *intc_priv_data_sym(id); \
00069 COMPILER_PRAGMA(vector=IAR_VECTOR(id)) \
00070 __interrupt void intc_priv_entry_sym(id)(void) \
00071 { \
00072 handler(intc_priv_data_sym(id)); \
00073 } \
00074 void *intc_priv_data_sym(id)
00075
00076 #endif
00077
00078 #define intc_set_irq_data(id, data) \
00079 do { \
00080 extern void *intc_priv_data_sym(id); \
00081 intc_priv_data_sym(id) = (data); \
00082 } while (0)
00083
00084 #define intc_get_irq_data(id, pdata) \
00085 do { \
00086 extern void *intc_priv_data_sym(id); \
00087 *(pdata) = intc_priv_data_sym(id); \
00088 } while (0)
00089
00090 #define intc_setup_handler(id, level, data) \
00091 do { \
00092 intc_set_irq_data(id, data); \
00093 } while (0)
00094
00095 #define intc_remove_handler(id) \
00096 do { \
00097 extern void *intc_priv_data_sym(id); \
00098 intc_priv_data_sym(id) = 0; \
00099 } while (0)
00100
00102
00103 #endif