154 lines
4.4 KiB
C
154 lines
4.4 KiB
C
/*
|
|
* 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 <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_ */
|