include/bsp/irq-generic.h

Go to the documentation of this file.
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 */

Generated on Mon May 19 15:42:10 2008 for RTEMS by  doxygen 1.5.3