/* * Copyright (c) 2015 Intel corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file * @brief Public interface for configuring interrupts */ #ifndef _IRQ_H_ #define _IRQ_H_ /* Pull in the arch-specific implementations */ #include #ifndef _ASMLANGUAGE #include #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_ */