zephyr/boards/posix/native_posix/board_irq.h

88 lines
2.3 KiB
C

/*
* Copyright (c) 2013-2014 Wind River Systems, Inc.
* Copyright (c) 2017 Oticon A/S
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef BOARDS_POSIX_NATIVE_POSIX_BOARD_IRQ_H
#define BOARDS_POSIX_NATIVE_POSIX_BOARD_IRQ_H
#include <zephyr/sw_isr_table.h>
#include "zephyr/types.h"
#ifdef __cplusplus
extern "C" {
#endif
void posix_isr_declare(unsigned int irq_p, int flags, void isr_p(const void *),
const void *isr_param_p);
void posix_irq_priority_set(unsigned int irq, unsigned int prio,
uint32_t flags);
/**
* Configure a static interrupt.
*
* @param irq_p IRQ line number
* @param priority_p Interrupt priority
* @param isr_p Interrupt service routine
* @param isr_param_p ISR parameter
* @param flags_p IRQ options
*/
#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
{ \
posix_isr_declare(irq_p, 0, isr_p, isr_param_p); \
posix_irq_priority_set(irq_p, priority_p, flags_p); \
}
/**
* Configure a 'direct' static interrupt.
*
* See include/irq.h for details.
*/
#define ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
{ \
posix_isr_declare(irq_p, ISR_FLAG_DIRECT, \
(void (*)(const void *))isr_p, NULL); \
posix_irq_priority_set(irq_p, priority_p, flags_p); \
}
/**
* POSIX Architecture (board) specific ISR_DIRECT_DECLARE(),
* See include/irq.h for more information.
*
* The return of "name##_body(void)" is the indication of the interrupt
* (maybe) having caused a kernel decision to context switch
*
* Note that this convention is changed relative to the ARM and x86 archs
*
* All pre/post irq work of the interrupt is handled in the board
* posix_irq_handler() both for direct and normal interrupts together
*/
#define ARCH_ISR_DIRECT_DECLARE(name) \
static inline int name##_body(void); \
int name(void) \
{ \
int check_reschedule; \
check_reschedule = name##_body(); \
return check_reschedule; \
} \
static inline int name##_body(void)
#define ARCH_ISR_DIRECT_HEADER() do { } while (false)
#define ARCH_ISR_DIRECT_FOOTER(a) do { } while (false)
#ifdef CONFIG_PM
extern void posix_irq_check_idle_exit(void);
#define ARCH_ISR_DIRECT_PM() posix_irq_check_idle_exit()
#else
#define ARCH_ISR_DIRECT_PM() do { } while (false)
#endif
#ifdef __cplusplus
}
#endif
#endif /* BOARDS_POSIX_NATIVE_POSIX_BOARD_IRQ_H */