| /* |
| * Copyright (c) 2015 Intel corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * @file |
| * @brief Public interface for configuring interrupts |
| */ |
| #ifndef _IRQ_H_ |
| #define _IRQ_H_ |
| |
| /* Pull in the arch-specific implementations */ |
| #include <arch/cpu.h> |
| |
| #ifndef _ASMLANGUAGE |
| #include <toolchain/gcc.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @defgroup isr_apis Interrupt Service Routine APIs |
| * @ingroup kernel_apis |
| * @{ |
| */ |
| |
| /** |
| * @brief Initialize an interrupt handler. |
| * |
| * This routine initializes an interrupt handler for an IRQ. The IRQ must be |
| * subsequently enabled before the interrupt handler begins servicing |
| * interrupts. |
| * |
| * @warning |
| * Although this routine is invoked at run-time, all of its arguments must be |
| * computable by the compiler at build time. |
| * |
| * @param irq_p IRQ line number. |
| * @param priority_p Interrupt priority. |
| * @param isr_p Address of interrupt service routine. |
| * @param isr_param_p Parameter passed to interrupt service routine. |
| * @param flags_p Architecture-specific IRQ configuration flags.. |
| * |
| * @return Interrupt vector assigned to this interrupt. |
| */ |
| #define IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \ |
| _ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) |
| |
| /** |
| * @brief Lock interrupts. |
| * |
| * This routine disables all interrupts on the CPU. It returns an unsigned |
| * integer "lock-out key", which is an architecture-dependent indicator of |
| * whether interrupts were locked prior to the call. The lock-out key must be |
| * passed to irq_unlock() to re-enable interrupts. |
| * |
| * This routine can be called recursively, as long as the caller keeps track |
| * of each lock-out key that is generated. Interrupts are re-enabled by |
| * passing each of the keys to irq_unlock() in the reverse order they were |
| * acquired. (That is, each call to irq_lock() must be balanced by |
| * a corresponding call to irq_unlock().) |
| * |
| * @note |
| * This routine can be called by ISRs or by threads. If it is called by a |
| * thread, the interrupt lock is thread-specific; this means that interrupts |
| * remain disabled only while the thread is running. If the thread performs an |
| * operation that allows another thread to run (for example, giving a semaphore |
| * or sleeping for N milliseconds), the interrupt lock no longer applies and |
| * interrupts may be re-enabled while other processing occurs. When the thread |
| * once again becomes the current thread, the kernel re-establishes its |
| * interrupt lock; this ensures the thread won't be interrupted until it has |
| * explicitly released the interrupt lock it established. |
| * |
| * @warning |
| * The lock-out key should never be used to manually re-enable interrupts |
| * or to inspect or manipulate the contents of the CPU's interrupt bits. |
| * |
| * @return Lock-out key. |
| */ |
| #define irq_lock() _arch_irq_lock() |
| |
| /** |
| * @brief Unlock interrupts. |
| * |
| * This routine reverses the effect of a previous call to irq_lock() using |
| * the associated lock-out key. The caller must call the routine once for |
| * each time it called irq_lock(), supplying the keys in the reverse order |
| * they were acquired, before interrupts are enabled. |
| * |
| * @note Can be called by ISRs. |
| * |
| * @param key Lock-out key generated by irq_lock(). |
| * |
| * @return N/A |
| */ |
| #define irq_unlock(key) _arch_irq_unlock(key) |
| |
| /** |
| * @brief Enable an IRQ. |
| * |
| * This routine enables interrupts from source @a irq. |
| * |
| * @param irq IRQ line. |
| * |
| * @return N/A |
| */ |
| #define irq_enable(irq) _arch_irq_enable(irq) |
| |
| /** |
| * @brief Disable an IRQ. |
| * |
| * This routine disables interrupts from source @a irq. |
| * |
| * @param irq IRQ line. |
| * |
| * @return N/A |
| */ |
| #define irq_disable(irq) _arch_irq_disable(irq) |
| |
| /** |
| * @brief Get IRQ enable state. |
| * |
| * This routine indicates if interrupts from source @a irq are enabled. |
| * |
| * @param irq IRQ line. |
| * |
| * @return interrupt enable state, true or false |
| */ |
| #define irq_is_enabled(irq) _arch_irq_is_enabled(irq) |
| |
| /** |
| * @} |
| */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* ASMLANGUAGE */ |
| #endif /* _IRQ_H_ */ |