1 #ifndef CYGONCE_HAL_HAL_ARBITER_H
2 #define CYGONCE_HAL_HAL_ARBITER_H
4 //=============================================================================
8 // Functionality used by ISR arbiters
10 //=============================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
16 // eCos is free software; you can redistribute it and/or modify it under
17 // the terms of the GNU General Public License as published by the Free
18 // Software Foundation; either version 2 or (at your option) any later version.
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 // You should have received a copy of the GNU General Public License along
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
29 // As a special exception, if other files instantiate templates or use macros
30 // or inline functions from this file, or you compile this file and link it
31 // with other works to produce a work based on this file, this file does not
32 // by itself cause the resulting work to be covered by the GNU General Public
33 // License. However the source code for this file must still be made available
34 // in accordance with section (3) of the GNU General Public License.
36 // This exception does not invalidate any other reasons why a work based on
37 // this file might be covered by the GNU General Public License.
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40 // at http://sources.redhat.com/ecos/ecos-license/
41 // -------------------------------------------
42 //####ECOSGPLCOPYRIGHTEND####
43 //=============================================================================
44 //#####DESCRIPTIONBEGIN####
49 // Purpose: Functionality used by ISR arbiters
50 // Usage: #include <cyg/hal/hal_arbiter.h>
52 //####DESCRIPTIONEND####
54 //=============================================================================
56 #include <cyg/hal/hal_intr.h> // hal_interrupt_x tables
57 #include <cyg/hal/drv_api.h> // CYG_ISR_HANDLED
59 //=============================================================================
60 // Function used to call ISRs from ISR arbiters
61 // An arbiter is hooked on the shared interrupt vector and looks like this:
63 // cyg_uint32 _arbitration_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)
65 // cyg_uint32 isr_ret;
66 // // decode interrupt source and for each active source call the ISR
67 // if (source_A_active) {
68 // isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_SOURCE_A);
69 // #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
70 // if (isr_ret & CYG_ISR_HANDLED)
74 // if (source_B_active) {
75 // isr_ret = hal_call_isr (CYGNUM_HAL_INTERRUPT_SOURCE_B);
76 // #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
77 // if (isr_ret & CYG_ISR_HANDLED)
85 // Remember to attach and enable the arbiter source:
86 // HAL_INTERRUPT_ATTACH(CYGNUM_HAL_INTERRUPT_ARBITER, &_arbitration_isr, 0, 0);
87 // HAL_INTERRUPT_SET_LEVEL(CYGNUM_HAL_INTERRUPT_ARBITER, 1);
88 // HAL_INTERRUPT_UNMASK(CYGNUM_HAL_INTERRUPT_ARBITER);
91 typedef cyg_uint32 cyg_ISR(cyg_uint32 vector, CYG_ADDRWORD data);
93 extern void cyg_interrupt_post_dsr( CYG_ADDRWORD intr_obj );
95 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
97 static inline cyg_uint32
98 hal_call_isr (cyg_uint32 vector)
104 isr = (cyg_ISR*) hal_interrupt_handlers[vector];
105 data = hal_interrupt_data[vector];
107 isr_ret = (*isr) (vector, data);
109 if (isr_ret & CYG_ISR_CALL_DSR) {
110 cyg_interrupt_post_dsr (hal_interrupt_objects[vector]);
113 return isr_ret & ~CYG_ISR_CALL_DSR;
118 // In chained mode, assume vector 0 points to the chain
119 // handler. Simply call it with the vector number and let it find the
120 // ISR to call - it will also post DSRs as required.
121 static inline cyg_uint32
122 hal_call_isr (cyg_uint32 vector)
128 isr = (cyg_ISR*) hal_interrupt_handlers[0];
129 data = hal_interrupt_data[0];
131 isr_ret = (*isr) (vector, data);
138 //-----------------------------------------------------------------------------
139 #endif // CYGONCE_HAL_HAL_ARBITER_H
140 // End of hal_arbiter.h