]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/hal/common/v2_0/include/hal_arbiter.h
Initial revision
[karo-tx-redboot.git] / packages / hal / common / v2_0 / include / hal_arbiter.h
1 #ifndef CYGONCE_HAL_HAL_ARBITER_H
2 #define CYGONCE_HAL_HAL_ARBITER_H
3
4 //=============================================================================
5 //
6 //      hal_arbiter.h
7 //
8 //      Functionality used by ISR arbiters
9 //
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.
15 //
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.
19 //
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
23 // for more details.
24 //
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.
28 //
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.
35 //
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.
38 //
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####
45 //
46 // Author(s):   jskov
47 // Contributors:jskov
48 // Date:        2001-06-29
49 // Purpose:     Functionality used by ISR arbiters
50 // Usage:       #include <cyg/hal/hal_arbiter.h>
51 //                           
52 //####DESCRIPTIONEND####
53 //
54 //=============================================================================
55
56 #include <cyg/hal/hal_intr.h>           // hal_interrupt_x tables
57 #include <cyg/hal/drv_api.h>            // CYG_ISR_HANDLED
58
59 //=============================================================================
60 // Function used to call ISRs from ISR arbiters
61 // An arbiter is hooked on the shared interrupt vector and looks like this:
62 //
63 //  cyg_uint32 _arbitration_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)
64 //  {
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)
71 //  #endif
72 //             return isr_ret;
73 //     }
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)
78 //  #endif
79 //             return isr_ret;
80 //     }
81 //  ...
82 //     return 0;
83 //  }
84 //
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);
89 //
90
91 typedef cyg_uint32 cyg_ISR(cyg_uint32 vector, CYG_ADDRWORD data);
92
93 extern void cyg_interrupt_post_dsr( CYG_ADDRWORD intr_obj );
94
95 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
96
97 static inline cyg_uint32
98 hal_call_isr (cyg_uint32 vector)
99 {
100     cyg_ISR *isr;
101     CYG_ADDRWORD data;
102     cyg_uint32 isr_ret;
103
104     isr = (cyg_ISR*) hal_interrupt_handlers[vector];
105     data = hal_interrupt_data[vector];
106
107     isr_ret = (*isr) (vector, data);
108
109     if (isr_ret & CYG_ISR_CALL_DSR) {
110         cyg_interrupt_post_dsr (hal_interrupt_objects[vector]);
111     }
112
113     return isr_ret & ~CYG_ISR_CALL_DSR;
114 }
115
116 #else
117
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)
123 {
124     cyg_ISR *isr;
125     CYG_ADDRWORD data;
126     cyg_uint32 isr_ret;
127
128     isr = (cyg_ISR*) hal_interrupt_handlers[0];
129     data = hal_interrupt_data[0];
130
131     isr_ret = (*isr) (vector, data);
132
133     return isr_ret;
134 }
135
136 #endif
137
138 //-----------------------------------------------------------------------------
139 #endif // CYGONCE_HAL_HAL_ARBITER_H
140 // End of hal_arbiter.h