annotate packages/hal/common/current/src/drv_api.c @ 1158:10a36d0fd6f3

* src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for use in those HALs that need it. * include/hal_arbiter.h (hal_call_isr): Removed ifdef on CYGFUN_HAL_COMMON_KERNEL_SUPPORT around test and call to cyg_interrupt_post_dsr().
author nickg
date Wed, 06 Aug 2003 17:32:30 +0000
parents d2c90368aeef
children 74dbf4c3f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // drv_api.c
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // Driver API for non-kernel configurations
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
12 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
14 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
20 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
22 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
25 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
27 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
28 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
30 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
32 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
34 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
37 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
38 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 // Author(s): Nick Garnett
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 // Date: 1999-02-24
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 // Purpose: Driver API for non-kernel configurations
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 // Description: These functions are used to support drivers when the kernel
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 // is not present.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 #ifndef CYGPKG_KERNEL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 #include <cyg/infra/cyg_trac.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 #include <cyg/infra/cyg_ass.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 #include <cyg/hal/drv_api.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 #include <cyg/hal/hal_intr.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 // Statics
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 130
diff changeset
72 static volatile cyg_int32 isr_disable_counter = 1; // ISR disable counter
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
74 static CYG_INTERRUPT_STATE isr_disable_state;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
75
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 151
diff changeset
76 volatile cyg_int32 dsr_disable_counter // DSR disable counter
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 151
diff changeset
77 CYGBLD_ATTRIB_ASM_ALIAS( cyg_scheduler_sched_lock );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
79 static cyg_interrupt* volatile dsr_list; // List of pending DSRs
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 cyg_interrupt *chain_list[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 // DSR handling functions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 // post_dsr() places a DSR on the list of DSRs to be called.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 // call_dsrs() calls the DSRs.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 static void post_dsr( cyg_interrupt *intr )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 CYG_INTERRUPT_STATE old_intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 HAL_DISABLE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
100 if( intr->dsr_count++ == 0 )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 intr->next_dsr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 dsr_list = intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 static void call_dsrs(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 while( dsr_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
117 cyg_interrupt *intr;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 cyg_int32 count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 CYG_INTERRUPT_STATE old_intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 HAL_DISABLE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 intr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 dsr_list = intr->next_dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 count = intr->dsr_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 intr->dsr_count = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 intr->dsr( intr->vector, count, (CYG_ADDRWORD)intr->data );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 //--------------------------------------------------------------------------
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
138 // This is referenced from the HAL, although it does not actually get called.
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
139
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
140 externC void
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
141 cyg_interrupt_call_pending_DSRs(void)
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
142 {
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
143 call_dsrs();
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
144 }
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
145
1158
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
146 //--------------------------------------------------------------------------
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
147 // This is called from springboard ISRs in some HALs.
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
148
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
149 externC void
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
150 cyg_interrupt_post_dsr(CYG_ADDRWORD data)
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
151 {
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
152 cyg_interrupt * intr = (cyg_interrupt *)data;
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
153 post_dsr(intr);
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
154 }
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
155
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
156 //--------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 // Interrupt end function called from HAL VSR to tidy up. This is where
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 // DSRs will be called if necessary.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 interrupt_end(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 cyg_uint32 isr_ret,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 cyg_interrupt *intr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 HAL_SavedRegisters *regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 // Only do this if we are in a non-chained configuration.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 // If we are chained, then chain_isr will do the DSR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 // posting.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 if( isr_ret & CYG_ISR_CALL_DSR && intr != NULL ) post_dsr(intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 if( dsr_disable_counter == 0 ) call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 // ISR for handling chained interrupts.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 cyg_uint32 chain_isr(cyg_vector_t vector, CYG_ADDRWORD data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 {
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
191 cyg_interrupt *p = *(cyg_interrupt **)data;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
192 register cyg_uint32 isr_ret = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
193 register cyg_uint32 isr_chain_ret = 0;
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
194
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 while( p != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 if( p->vector == vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 {
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
201 isr_ret = p->isr(vector, p->data);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
202
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
203 isr_chain_ret |= isr_ret;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 if( isr_ret & CYG_ISR_CALL_DSR ) post_dsr(p);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 if( isr_ret & CYG_ISR_HANDLED ) break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 p = p->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
213 #ifdef HAL_DEFAULT_ISR
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
214 if( (isr_chain_ret & (CYG_ISR_CALL_DSR|CYG_ISR_HANDLED)) == 0 )
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
215 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
216 // If we finished the loop for some reason other than that an
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
217 // ISR has handled the interrupt, call any default ISR to either
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
218 // report the spurious interrupt, or do some other HAL level processing
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
219 // such as GDB interrupt detection etc.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
220
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
221 HAL_DEFAULT_ISR( vector, 0 );
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
222 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
223 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
224
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
227 return isr_ret & CYG_ISR_CALL_DSR;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 // ISR lock. This disables interrupts and keeps a count of the number
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 // times it has been called.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 externC void cyg_drv_isr_lock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
240 if( isr_disable_counter == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
241 HAL_DISABLE_INTERRUPTS(isr_disable_state);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 CYG_ASSERT( isr_disable_counter >= 0 , "Disable counter negative");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 isr_disable_counter++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 // Unlock ISRs. This decrements the count and re-enables interrupts if it
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 // goes zero.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 externC void cyg_drv_isr_unlock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 CYG_ASSERT( isr_disable_counter > 0 , "Disable counter not greater than zero");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 isr_disable_counter--;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 if ( isr_disable_counter == 0 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 {
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
264 HAL_RESTORE_INTERRUPTS(isr_disable_state);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 // Lock DSR lock. Simply increment the counter.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 externC void cyg_drv_dsr_lock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 dsr_disable_counter++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 // Unlock DSR lock. If the counter is about to go zero, call any pending
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 // DSRs and then zero the counter.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 externC void cyg_drv_dsr_unlock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 do
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 if( dsr_disable_counter == 1 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294 call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 dsr_disable_counter = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 // Check that no DSRs have been posted between calling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 // call_dsrs() and zeroing dsr_disable_counter. If so,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 // loop back and call them.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307 if( dsr_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 dsr_disable_counter = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310 continue;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 } while(1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319 CYG_FAIL( "Should not be executed" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
323 // Initialize a mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
325 externC void cyg_drv_mutex_init( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
327 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
328
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
329 mutex->lock = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
330
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335 // Destroy a mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337 externC void cyg_drv_mutex_destroy( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
341 mutex->lock = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
342
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
343 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
347 // Lock a mutex. We check that we are not trying to lock a locked or
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 // destroyed mutex and if not, set it locked.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350 externC cyg_bool_t cyg_drv_mutex_lock( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354 CYG_ASSERT( mutex->lock == 0 , "Trying to lock locked mutex");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
355
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
356 mutex->lock = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
357
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
359
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
361 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
362
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
363 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
364 // Attempt to claim a mutex, and return if it cannot be.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
365
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
366 externC cyg_bool_t cyg_drv_mutex_trylock( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
367 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
368 cyg_bool_t result = true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
370 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
371
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
372 if( mutex->lock == 1 ) result = false;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
373
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
374 mutex->lock = 1;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
375
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
376 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
377
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
378 return result;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
379 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
380
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
381 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
382 // Unlock a mutex. We check that the mutex is actually locked before doing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 // this.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
384
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
385 externC void cyg_drv_mutex_unlock( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
386 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
387 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
388
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
389 CYG_ASSERT( mutex->lock == 1 , "Trying to unlock unlocked mutex");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391 mutex->lock = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
396 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 // Release all threads waiting for the mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
398 // This is really for threads, so we do nothing here.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
399
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400 externC void cyg_drv_mutex_release( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
401 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
402 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
403
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
404
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
405
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
406 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
407 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
408
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
409
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
410 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
411 // Initialized a condition variable.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
412
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
413 externC void cyg_drv_cond_init( cyg_drv_cond_t *cond, cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
414 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
415 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
416
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
417 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
418 cond->mutex = mutex;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
419
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
420 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
421 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
422
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
423
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
425 // Destroy a condition variable.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
426
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427 externC void cyg_drv_cond_destroy( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
428 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
429 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431 cond->wait = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
432 cond->mutex = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
433
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
434 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
435 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
436
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
437 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
438 // Wait for a condition variable to be signalled. We simply busy wait
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
439 // polling the condition variable's wait member until a DSR sets it to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440 // 0. Note that the semantics of condition variables means that the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
441 // wakeup only happens if there is a thread actually waiting on the CV
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442 // when the signal is sent.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
443
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
444 externC cyg_bool cyg_drv_cond_wait( cyg_drv_cond_t *cond )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
446 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
447
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448 CYG_ASSERT( cond->mutex != NULL, "Uninitialized condition variable");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
449 CYG_ASSERT( cond->mutex->lock, "Mutex not locked");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
450
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
451 cyg_drv_dsr_lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
452
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
453 cond->wait = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
454
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
455 while( cond->wait == 1 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
456 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457 // While looping we call call_dsrs() to service any DSRs that
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458 // get posted. One of these will make the call to cond_signal
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 // to break us out of this loop. If we do not have the DSR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460 // lock claimed, then a race condition could occur and keep us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461 // stuck here forever.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
462
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
463 call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
464 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
465
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466 cyg_drv_dsr_unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
468 CYG_REPORT_RETURN();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
469
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
470 return true;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
473 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
474 // Signal a condition variable. This sets the wait member to zero, which
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
475 // has no effect when there is no waiter, but will wake up any waiting
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
476 // thread.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
477
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
478 externC void cyg_drv_cond_signal( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
479 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
480 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
481
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
482 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
483
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
484 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
485 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
486
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
487
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
488 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
489 // Broadcast to condition variable. This is exactly the same a signal since
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
490 // there can only be one waiter.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
491
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
492 externC void cyg_drv_cond_broadcast( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
493 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
494 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
495
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
496 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
497
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
498 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
499 }
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
500
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
501 //--------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
502 // Spinlock support.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
503 // Since we can only support a single CPU in this version of the API, we only
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
504 // set and clear the lock variable to keep track of what's happening.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
505
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
506 void cyg_drv_spinlock_init(
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
507 cyg_drv_spinlock_t *lock, /* spinlock to initialize */
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
508 cyg_bool_t locked /* init locked or unlocked */
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
509 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
510 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
511 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
512
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
513 lock->lock = locked;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
514
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
515 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
516 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
517
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
518 void cyg_drv_spinlock_destroy( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
519 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
520 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
521
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
522 lock->lock = -1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
523
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
524 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
525 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
526
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
527 void cyg_drv_spinlock_spin( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
528 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
529 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
530
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
531 CYG_ASSERT( lock->lock == 0 , "Trying to lock locked spinlock");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
532
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
533 lock->lock = 1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
534
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
535 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
536 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
537
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
538 void cyg_drv_spinlock_clear( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
539 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
540 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
541
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
542 CYG_ASSERT( lock->lock == 1 , "Trying to clear cleared spinlock");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
543
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
544 lock->lock = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
545
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
546 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
547 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
548
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
549 cyg_bool_t cyg_drv_spinlock_try( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
550 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
551 cyg_bool_t result = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
552
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
553 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
554
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
555 if( lock->lock == 1 ) result = false;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
556
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
557 lock->lock = 1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
558
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
559 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
560
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
561 return result;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
562 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
563
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
564 cyg_bool_t cyg_drv_spinlock_test( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
565 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
566 cyg_bool_t result = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
567
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
568 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
569
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
570 if( lock->lock == 1 ) result = false;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
571
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
572 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
573
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
574 return result;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
575 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
576
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
577 void cyg_drv_spinlock_spin_intsave( cyg_drv_spinlock_t *lock,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
578 cyg_addrword_t *istate )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
579 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
580 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
581
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
582 HAL_DISABLE_INTERRUPTS( *istate );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
583
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
584 lock->lock = 1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
585
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
586 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
587 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
588
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
589
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
590 void cyg_drv_spinlock_clear_intsave( cyg_drv_spinlock_t *lock,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
591 cyg_addrword_t istate )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
592 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
593 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
594
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
595 lock->lock = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
596
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
597 HAL_RESTORE_INTERRUPTS( istate );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
598
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
599 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
600 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
601
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
602 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
603 // Create an interrupt object.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
604
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
605 externC void cyg_drv_interrupt_create(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
606 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
607 cyg_priority_t priority,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
608 cyg_addrword_t data,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
609 cyg_ISR_t *isr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
610 cyg_DSR_t *dsr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
611 cyg_handle_t *handle,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
612 cyg_interrupt *intr
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
613 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
614 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
615 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
616
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617 intr->vector = vector;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
618 intr->priority = priority;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
619 intr->isr = isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
620 intr->dsr = dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
621 intr->data = data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
622 intr->next_dsr = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
623 intr->dsr_count = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
624
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
625 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
626
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
627 intr->next = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
628
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
629 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
630
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
631 *handle = (cyg_handle_t)intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
632
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
633 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
634 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
635
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
636 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
637 // Delete an interrupt object. This merely ensures that it is detached from
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
638 // the vector.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
639
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
640 externC void cyg_drv_interrupt_delete( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
641 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
642 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
643
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
644 cyg_drv_interrupt_detach( interrupt );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
645
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
646 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
647 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
648
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
649 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
650 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
651
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
652 externC void cyg_drv_interrupt_attach( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
653 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
654 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
655
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
656 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
657
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
658 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
659 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
660
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
661 HAL_INTERRUPT_SET_LEVEL( intr->vector, intr->priority );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
662
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
663 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
664
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
665 CYG_ASSERT( intr->next == NULL , "cyg_interrupt already on a list");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
666
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
667 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
668 cyg_uint32 index;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
669
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
670 HAL_TRANSLATE_VECTOR( intr->vector, index );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
671
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
672 if( chain_list[index] == NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
673 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
674 // First Interrupt on this chain, just assign it and
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
675 // register the chain_isr with the HAL.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
676
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
677 chain_list[index] = intr;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
678
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
679 HAL_INTERRUPT_ATTACH( intr->vector, chain_isr,
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
680 &chain_list[index], NULL );
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
681 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
682 else
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
683 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
684 // There are already interrupts chained, add this one into
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
685 // the chain in priority order.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
686
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
687 cyg_interrupt **p = &chain_list[index];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
688
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
689 while( *p != NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
690 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
691 cyg_interrupt *n = *p;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
692
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
693 if( n->priority < intr->priority ) break;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
694
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
695 p = &n->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
696 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
697 intr->next = *p;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
698 *p = intr;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
699 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
700 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
701
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
702 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
703
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
704 HAL_INTERRUPT_ATTACH( intr->vector, intr->isr, intr->data, intr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
705
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
706 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
707
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
708 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
709 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
710
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
711
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
712 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
713 // Detach an interrupt from its vector.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
714
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
715 externC void cyg_drv_interrupt_detach( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
716 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
717 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
718
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
719 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
720
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
721 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
722 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
723
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
724 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
725
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
726 // Remove the interrupt object from the vector chain.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
727
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
728 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
729 cyg_uint32 index;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
730 cyg_interrupt **p;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
731
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 151
diff changeset
732 HAL_TRANSLATE_VECTOR( intr->vector, index );
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
733
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
734 p = &chain_list[index];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
735
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
736 while( *p != NULL )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
737 {
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
738 cyg_interrupt *n = *p;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
739
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
740 if( n == intr )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
741 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
742 *p = intr->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
743 break;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
744 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
745
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
746 p = &n->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
747 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
748
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
749 // If this was the last one, detach the vector.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
750
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
751 if( chain_list[index] == NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
752 HAL_INTERRUPT_DETACH( intr->vector, chain_isr );
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
753 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
754
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
755 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
756
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
757 HAL_INTERRUPT_DETACH( intr->vector, intr->isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
758
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
759 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
760
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
761 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
762 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
763
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
764
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
765 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
766 // Mask delivery of an interrupt at the interrupt controller.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
767 // (Interrupt safe)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
768
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
769 externC void cyg_drv_interrupt_mask( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
770 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
771 CYG_INTERRUPT_STATE old_ints;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
772
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
773 CYG_REPORT_FUNCTION();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
774 CYG_REPORT_FUNCARG1("vector=%d", vector);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
775
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
776 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
777 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
778
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
779 HAL_DISABLE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
780 HAL_INTERRUPT_MASK( vector );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
781 HAL_RESTORE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
782
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
783 CYG_REPORT_RETURN();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
784 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
785
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
786 //--------------------------------------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
787 // Mask delivery of an interrupt at the interrupt controller.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
788 // (Not interrupt safe)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
789
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
790 externC void cyg_drv_interrupt_mask_intunsafe( cyg_vector_t vector )
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
791 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
792 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
793 CYG_REPORT_FUNCARG1("vector=%d", vector);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
794
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
795 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
796 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
797
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
798 HAL_INTERRUPT_MASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
799
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
800 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
801 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
802
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
803 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
804 // Unmask delivery of an interrupt at the interrupt controller.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
805 // (Interrupt safe)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
806
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
807 externC void cyg_drv_interrupt_unmask( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
808 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
809 CYG_INTERRUPT_STATE old_ints;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
810
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
811 CYG_REPORT_FUNCTION();
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
812 CYG_REPORT_FUNCARG1("vector=%d", vector);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
813
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
814 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
815 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
816
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
817 HAL_DISABLE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
818 HAL_INTERRUPT_UNMASK( vector );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
819 HAL_RESTORE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
820
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
821 CYG_REPORT_RETURN();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
822 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
823
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
824 //--------------------------------------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
825 // Unmask delivery of an interrupt at the interrupt controller.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
826 // (Not interrupt safe)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
827
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
828 externC void cyg_drv_interrupt_unmask_intunsafe( cyg_vector_t vector )
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
829 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
830 CYG_REPORT_FUNCTION();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
831 CYG_REPORT_FUNCARG1("vector=%d", vector);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
832
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
833 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
834 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
835
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
836 HAL_INTERRUPT_UNMASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
837
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
838 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
839 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
840
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
841 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
842 // Acknowledge an interrupt at the controller to allow another interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
843 // to be delivered.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
844
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
845 externC void cyg_drv_interrupt_acknowledge( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
846 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
847 // CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
848
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
849 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
850 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
851
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
852 HAL_INTERRUPT_ACKNOWLEDGE( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
853
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
854 // CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
855 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
856
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
857 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
858 // Configure interrupt detection parameters.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
859
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
860 externC void cyg_drv_interrupt_configure(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
861 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
862 cyg_bool_t level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
863 cyg_bool_t up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
864 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
865 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
866 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
867 CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
868 up);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
869
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
870 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
871 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
872
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
873 HAL_INTERRUPT_CONFIGURE( vector, level, up );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
874
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
875 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
876 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
877
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
878 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
879 // Configure interrupt priority level.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
880
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
881 externC void cyg_drv_interrupt_level( cyg_vector_t vector, cyg_priority_t level )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
882 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
883 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
884 CYG_REPORT_FUNCARG2("vector = %d, level = %d", vector, level);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
885
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
886 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
887 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
888
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
889 HAL_INTERRUPT_SET_LEVEL( vector, level );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
890
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
891 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
892 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
893
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
894 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
895 // CPU interrupt routing
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
896
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
897 externC void cyg_drv_interrupt_set_cpu( cyg_vector_t vector, cyg_cpu_t cpu )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
898 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
899 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
900 CYG_REPORT_FUNCARG2("vector = %d, cpu = %d", vector, cpu);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
901
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
902 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
903 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
904
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
905 #ifdef CYGPKG_HAL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
906 HAL_INTERRUPT_SET_CPU( vector, cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
907 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
908
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
909 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
910 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
911
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
912 externC cyg_cpu_t cyg_drv_interrupt_get_cpu( cyg_vector_t vector )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
913 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
914 cyg_cpu_t cpu = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
915
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
916 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
917 CYG_REPORT_FUNCARG1("vector = %d", vector);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
918
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
919 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
920 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
921
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
922 #ifdef CYGPKG_HAL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
923 HAL_INTERRUPT_GET_CPU( vector, cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
924 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
925
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
926 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
927
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
928 return cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
929 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
930
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
931 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
932 // Exception delivery function called from the HAL as a result of a
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
933 // hardware exception being raised.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
934
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
935 externC void cyg_hal_deliver_exception( CYG_WORD code, CYG_ADDRWORD data )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
936 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
937 CYG_FAIL(" !!! Exception !!! ");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
938 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
939
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
940
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
941 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
942
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
943 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
944 // EOF drv_api.c