diff options
Diffstat (limited to 'cpukit/include/rtems/irq-extension.h')
-rw-r--r-- | cpukit/include/rtems/irq-extension.h | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/cpukit/include/rtems/irq-extension.h b/cpukit/include/rtems/irq-extension.h new file mode 100644 index 0000000000..ad6f0b209c --- /dev/null +++ b/cpukit/include/rtems/irq-extension.h @@ -0,0 +1,270 @@ +/** + * @file + * + * @ingroup rtems_interrupt_extension + * + * @brief Header file for the Interrupt Manager Extension. + */ + +/* + * Based on concepts of Pavel Pisa, Till Straumann and Eric Valette. + * + * Copyright (c) 2008 + * Embedded Brains GmbH + * Obere Lagerstr. 30 + * D-82178 Puchheim + * Germany + * rtems@embedded-brains.de + * + * The license and distribution terms for this file may be found in the file + * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE. + */ + +#ifndef RTEMS_IRQ_EXTENSION_H +#define RTEMS_IRQ_EXTENSION_H + +#include <rtems.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup rtems_interrupt_extension Interrupt Manager Extension + * + * @ingroup ClassicINTR + * + * In addition to the Classic API interrupt handler with a handle are + * supported. You can also install multiple shared handler for one interrupt + * vector. + * + * @{ + */ + +/** + * @brief Makes the interrupt handler unique. Prevents other handler from + * using the same interrupt vector. + */ +#define RTEMS_INTERRUPT_UNIQUE ((rtems_option) 0x00000001) + +/** + * @brief Allows that this interrupt handler may share a common interrupt + * vector with other handler. + */ +#define RTEMS_INTERRUPT_SHARED ((rtems_option) 0x00000000) + +/** + * @brief Returns true if the interrupt handler unique option is set. + */ +#define RTEMS_INTERRUPT_IS_UNIQUE( options) \ + ((options) & RTEMS_INTERRUPT_UNIQUE) + +/** + * @brief Returns true if the interrupt handler shared option is set. + */ +#define RTEMS_INTERRUPT_IS_SHARED( options) \ + (!RTEMS_INTERRUPT_IS_UNIQUE( options)) + +/** + * @brief Interrupt handler routine type. + */ +typedef void (*rtems_interrupt_handler)(void *); + +/** + * @brief Installs the interrupt handler routine @a handler for the interrupt + * vector with number @a vector. + * + * You can set one of the mutually exclusive options + * + * - @ref RTEMS_INTERRUPT_UNIQUE + * - @ref RTEMS_INTERRUPT_SHARED + * + * with the @a options parameter for the interrupt handler. + * + * The handler routine shall be called with argument @a arg when dispatched. + * The order in which the shared interrupt handlers are dispatched for one + * vector is BSP dependent. + * + * If the option @ref RTEMS_INTERRUPT_UNIQUE is set then it shall be ensured + * that this handler will be the only one for this vector. + * + * You can provide an informative description @a info. This may be used for + * system debugging and status tools. The string has to be persistent during + * the handler life time. + * + * This function may block. + * + * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. + * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt + * context this shall be returned. + * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be + * returned. + * @retval RTEMS_INVALID_ID If the vector number is out of range this shall be + * returned. + * @retval RTEMS_INVALID_NUMBER If an option is not applicable this shall be + * returned. + * @retval RTEMS_RESOURCE_IN_USE If the vector is already occupied with a + * unique handler this shall be returned. If a unique handler should be + * installed and there is already a handler installed this shall be returned. + * @retval RTEMS_TOO_MANY If a handler with this argument is already installed + * for the vector this shall be returned. + * @retval RTEMS_IO_ERROR Reserved for board support package specific error + * conditions. + */ +rtems_status_code rtems_interrupt_handler_install( + rtems_vector_number vector, + const char *info, + rtems_option options, + rtems_interrupt_handler handler, + void *arg +); + +/** + * @brief Removes the interrupt handler routine @a handler with argument @a arg + * for the interrupt vector with number @a vector. + * + * This function may block. + * + * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. + * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt + * context this shall be returned. + * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be + * returned. + * @retval RTEMS_INVALID_ID If the vector number is out of range this shall be + * returned. + * @retval RTEMS_UNSATISFIED If the handler with its argument is not installed + * for the vector this shall be returned. + * @retval RTEMS_IO_ERROR Reserved for board support package specific error + * conditions. + */ +rtems_status_code rtems_interrupt_handler_remove( + rtems_vector_number vector, + rtems_interrupt_handler handler, + void *arg +); + +/** + * @brief Interrupt handler iteration routine type. + * + * @see rtems_interrupt_handler_iterate() + */ +typedef void (*rtems_interrupt_per_handler_routine)( + void *, const char *, rtems_option, rtems_interrupt_handler, void * +); + +/** + * @brief Iterates over all installed interrupt handler of the interrupt vector + * with number @a vector. + * + * For each installed handler of the vector the function @a routine will be + * called with the supplied argument @a arg and the handler information, + * options, routine and argument. + * + * This function is intended for system information and diagnostics. + * + * This function may block. Never install or remove an interrupt handler + * within the iteration routine. This may result in a deadlock. + * + * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. + * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt + * context this shall be returned. + * @retval RTEMS_INVALID_ID If the vector number is out of range this shall be + * returned. + * @retval RTEMS_IO_ERROR Reserved for board support package specific error + * conditions. + */ +rtems_status_code rtems_interrupt_handler_iterate( + rtems_vector_number vector, + rtems_interrupt_per_handler_routine routine, + void *arg +); + +/** + * @brief Initializes an interrupt server task. + * + * The task will have the priority @a priority, the stack size @a stack_size, + * the modes @a modes and the attributes @a attributes. The identifier of the + * server task will be returned in @a server. Interrupt handlers can be + * installed on the server with rtems_interrupt_server_handler_install() and + * removed with rtems_interrupt_server_handler_remove() using this identifier. + * In case of an interrupt the request will be forwarded to the server. The + * handlers are executed within the server context. If one handler blocks on + * something this may delay the processing of other handlers. + * + * The server identifier pointer @a server may be @a NULL to initialize the + * default server. + * + * This function may block. + * + * @see rtems_task_create(). + * + * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. + * @retval RTEMS_INCORRECT_STATE If the default server is already initialized + * this shall be returned. + * @retval RTEMS_IO_ERROR Reserved for board support package specific error + * conditions. + */ +rtems_status_code rtems_interrupt_server_initialize( + rtems_task_priority priority, + size_t stack_size, + rtems_mode modes, + rtems_attribute attributes, + rtems_id *server +); + +/** + * @brief Installs the interrupt handler routine @a handler for the interrupt + * vector with number @a vector on the server @a server. + * + * The handler routine will be executed on the corresponding interrupt server + * task. A server identifier @a server of @c RTEMS_ID_NONE may be used to + * install the handler on the default server. + * + * This function may block. + * + * @see rtems_interrupt_handler_install(). + * + * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. + * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not + * initialized this shall be returned. + * @retval * For other errors see rtems_interrupt_handler_install(). + */ +rtems_status_code rtems_interrupt_server_handler_install( + rtems_id server, + rtems_vector_number vector, + const char *info, + rtems_option options, + rtems_interrupt_handler handler, + void *arg +); + +/** + * @brief Removes the interrupt handler routine @a handler with argument @a arg + * for the interrupt vector with number @a vector from the server @a server. + * + * A server identifier @a server of @c RTEMS_ID_NONE may be used to remove the + * handler from the default server. + * + * This function may block. + * + * @see rtems_interrupt_handler_remove(). + * + * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. + * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not + * initialized this shall be returned. + * @retval * For other errors see rtems_interrupt_handler_remove(). + */ +rtems_status_code rtems_interrupt_server_handler_remove( + rtems_id server, + rtems_vector_number vector, + rtems_interrupt_handler handler, + void *arg +); + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* RTEMS_IRQ_EXTENSION_H */ |