00001 00009 /* 00010 * Copyright (c) 2008 00011 * Embedded Brains GmbH 00012 * Obere Lagerstr. 30 00013 * D-82178 Puchheim 00014 * Germany 00015 * rtems@embedded-brains.de 00016 * 00017 * The license and distribution terms for this file may be found in the file 00018 * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE. 00019 */ 00020 00030 #ifndef LIBBSP_SHARED_IRQ_GENERIC_H 00031 #define LIBBSP_SHARED_IRQ_GENERIC_H 00032 00033 #include <bsp/irq-config.h> 00034 00035 #include <rtems.h> 00036 #include <rtems/irq.h> 00037 00038 #ifdef __cplusplus 00039 extern "C" { 00040 #endif /* __cplusplus */ 00041 00042 #if !defined( BSP_INTERRUPT_VECTOR_MIN) || !defined( BSP_INTERRUPT_VECTOR_MAX) || (BSP_INTERRUPT_VECTOR_MAX + 1) < BSP_INTERRUPT_VECTOR_MIN 00043 #error Invalid BSP_INTERRUPT_VECTOR_MIN or BSP_INTERRUPT_VECTOR_MAX. 00044 #endif /* !defined( BSP_INTERRUPT_VECTOR_MIN) ... */ 00045 00046 #define BSP_INTERRUPT_VECTOR_NUMBER (BSP_INTERRUPT_VECTOR_MAX - BSP_INTERRUPT_VECTOR_MIN + 1) 00047 00048 #ifndef BSP_INTERRUPT_HANDLER_TABLE_SIZE 00049 #define BSP_INTERRUPT_HANDLER_TABLE_SIZE BSP_INTERRUPT_VECTOR_NUMBER 00050 #endif /* BSP_INTERRUPT_HANDLER_TABLE_SIZE */ 00051 00052 #if defined( BSP_INTERRUPT_NO_HEAP_USAGE) && !defined( BSP_INTERRUPT_USE_INDEX_TABLE) 00053 #error If you define BSP_INTERRUPT_NO_HEAP_USAGE, you have to define BSP_INTERRUPT_USE_INDEX_TABLE etc. as well. 00054 #endif /* defined( BSP_INTERRUPT_NO_HEAP_USAGE) ... */ 00055 00056 struct struct_bsp_interrupt_handler_entry { 00057 rtems_interrupt_handler handler; 00058 void *arg; 00059 struct struct_bsp_interrupt_handler_entry *next; 00060 }; 00061 00062 typedef struct struct_bsp_interrupt_handler_entry bsp_interrupt_handler_entry; 00063 00064 extern bsp_interrupt_handler_entry bsp_interrupt_handler_table []; 00065 00066 #ifdef BSP_INTERRUPT_USE_INDEX_TABLE 00067 extern bsp_interrupt_handler_index_type bsp_interrupt_handler_index_table []; 00068 #endif /* BSP_INTERRUPT_USE_INDEX_TABLE */ 00069 00070 static inline rtems_vector_number bsp_interrupt_handler_index( rtems_vector_number vector) 00071 { 00072 #ifdef BSP_INTERRUPT_USE_INDEX_TABLE 00073 return bsp_interrupt_handler_index_table [vector - BSP_INTERRUPT_VECTOR_MIN]; 00074 #else /* BSP_INTERRUPT_USE_INDEX_TABLE */ 00075 return vector - BSP_INTERRUPT_VECTOR_MIN; 00076 #endif /* BSP_INTERRUPT_USE_INDEX_TABLE */ 00077 } 00078 00079 void bsp_interrupt_handler_empty(); 00080 00081 static inline int bsp_interrupt_is_empty_handler_entry( bsp_interrupt_handler_entry *e) 00082 { 00083 return e->handler == bsp_interrupt_handler_empty; 00084 } 00085 00136 static inline int bsp_interrupt_is_valid_vector( rtems_vector_number vector) 00137 { 00138 return (rtems_vector_number) BSP_INTERRUPT_VECTOR_MIN <= vector 00139 && vector <= (rtems_vector_number) BSP_INTERRUPT_VECTOR_MAX; 00140 } 00141 00151 void bsp_interrupt_handler_default( rtems_vector_number vector); 00152 00161 rtems_status_code bsp_interrupt_initialize(); 00162 00178 rtems_status_code bsp_interrupt_facility_initialize(); 00179 00194 rtems_status_code bsp_interrupt_vector_enable( rtems_vector_number vector); 00195 00210 rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number vector); 00211 00222 static inline void bsp_interrupt_handler_dispatch( rtems_vector_number vector) 00223 { 00224 if (bsp_interrupt_is_valid_vector( vector)) { 00225 bsp_interrupt_handler_entry *head = &bsp_interrupt_handler_table [bsp_interrupt_handler_index( vector)]; 00226 bsp_interrupt_handler_entry *current = head; 00227 00228 do { 00229 current->handler( current->arg); 00230 current = current->next; 00231 } while (current != NULL); 00232 00233 if (bsp_interrupt_is_empty_handler_entry( head)) { 00234 bsp_interrupt_handler_default( vector); 00235 } 00236 } else { 00237 bsp_interrupt_handler_default( vector); 00238 } 00239 } 00240 00243 #ifdef __cplusplus 00244 } 00245 #endif /* __cplusplus */ 00246 00247 #endif /* LIBBSP_SHARED_IRQ_GENERIC_H */