mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
* shared/irq/i8259.c, shared/irq/irq.h, shared/irq/irq_supp.h, shared/irq/openpic_i8259_irq.c: BSP_disable_irq_at_pic(), openpic_disable_irq(), BSP_irq_disable_at_i8259s() now return 0/1 if irq was disabled/enabled prior to disabling. irq_supp.h now exports a inline helper routine for scanning a list of shared handlers; to be used by PIC drivers.
92 lines
2.4 KiB
C
92 lines
2.4 KiB
C
#ifndef IRQ_SHARED_IRQ_C_GLUE_H
|
|
#define IRQ_SHARED_IRQ_C_GLUE_H
|
|
/*
|
|
* This header describes the routines that are needed by the shared
|
|
* version of 'irq.c' (implementing the RTEMS irq API). They
|
|
* must be provided by the BSP.
|
|
*
|
|
* The license and distribution terms for this file may be
|
|
* found in found in the file LICENSE in this distribution or at
|
|
* http://www.rtems.com/license/LICENSE.
|
|
*
|
|
*/
|
|
|
|
#ifndef BSP_SHARED_HANDLER_SUPPORT
|
|
#define BSP_SHARED_HANDLER_SUPPORT 1
|
|
#endif
|
|
|
|
#include <rtems/irq.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* PIC-independent functions to enable/disable interrupt lines at
|
|
* the pic.
|
|
*
|
|
* NOTE: the routines must ignore requests for enabling/disabling
|
|
* interrupts that are outside of the range handled by the
|
|
* PIC(s).
|
|
*/
|
|
extern void BSP_enable_irq_at_pic (const rtems_irq_number irqLine);
|
|
/*
|
|
* RETURNS: nonzero (> 0 ) if irq was enabled originally, zero if irq
|
|
* was off and negative value if there was an error.
|
|
*/
|
|
extern int BSP_disable_irq_at_pic (const rtems_irq_number irqLine);
|
|
|
|
/*
|
|
* Initialize the PIC.
|
|
* Return nonzero on success, zero on failure (which will be treated
|
|
* as fatal by the manager).
|
|
*/
|
|
extern int BSP_setup_the_pic (rtems_irq_global_settings* config);
|
|
|
|
struct _BSP_Exception_frame;
|
|
|
|
/* IRQ dispatcher to be defined by the PIC driver; note that it MUST
|
|
* implement shared interrupts.
|
|
* Note that the exception frame passed to this handler is not very
|
|
* meaningful. Only the volatile registers and info are set up.
|
|
*/
|
|
void C_dispatch_irq_handler (struct _BSP_Exception_frame *frame, unsigned int excNum);
|
|
|
|
/*
|
|
* Snippet to be used by PIC drivers;
|
|
* enables interrupts, traverses list of
|
|
* shared handlers for a given interrupt
|
|
* and restores original irq level
|
|
*/
|
|
|
|
static inline void
|
|
bsp_irq_dispatch_list(rtems_irq_connect_data *tbl, unsigned irq, rtems_irq_hdl sentinel)
|
|
{
|
|
register uint32_t l_orig;
|
|
|
|
l_orig = _ISR_Get_level();
|
|
|
|
/* Enable all interrupts */
|
|
_ISR_Set_level(0);
|
|
|
|
/* rtems_hdl_tbl[irq].hdl(rtems_hdl_tbl[irq].handle); */
|
|
{
|
|
rtems_irq_connect_data* vchain;
|
|
for( vchain = &tbl[irq];
|
|
((int)vchain != -1 && vchain->hdl != sentinel);
|
|
vchain = (rtems_irq_connect_data*)vchain->next_handler )
|
|
{
|
|
vchain->hdl(vchain->handle);
|
|
}
|
|
}
|
|
|
|
/* Restore original level */
|
|
_ISR_Set_level(l_orig);
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|