summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/irq-extension.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/include/rtems/irq-extension.h')
-rw-r--r--cpukit/include/rtems/irq-extension.h270
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 */