source: SVN/cambria/redboot/packages/hal/common/current/include/hal_arbiter.h @ 1

Last change on this file since 1 was 1, checked in by Tim Harvey, 2 years ago

restored latest version of files from server backup

Signed-off-by: Tim Harvey <tharvey@…>

File size: 4.8 KB
Line 
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
91typedef cyg_uint32 cyg_ISR(cyg_uint32 vector, CYG_ADDRWORD data);
92
93extern void cyg_interrupt_post_dsr( CYG_ADDRWORD intr_obj );
94
95#ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
96
97static inline cyg_uint32
98hal_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.
121static inline cyg_uint32
122hal_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
Note: See TracBrowser for help on using the repository browser.