annotate packages/hal/common/current/src/drv_api.c @ 2:443894e2e912 ecos-v1_2_1-release

Block commit of eCos version 1.2.1
author jlarmour
date Tue, 11 May 1999 12:24:34 +0000
parents
children d376b777e2ce
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 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998, 1999 Cygnus Solutions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 // All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 // Author(s): Nick Garnett
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Date: 1999-02-24
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Purpose: Driver API for non-kernel configurations
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Description: These functions are used to support drivers when the kernel
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // is not present.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //
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 //####DESCRIPTIONEND####
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 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #ifndef CYGPKG_KERNEL
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 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <cyg/infra/cyg_trac.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 #include <cyg/infra/cyg_ass.h>
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 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 #include <cyg/hal/drv_api.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 #include <cyg/hal/hal_intr.h>
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 // Statics
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 static volatile cyg_int32 isr_disable_counter; // ISR disable counter
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 volatile cyg_int32 dsr_disable_counter asm("cyg_scheduler_sched_lock"); // DSR disable counter
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 static volatile cyg_interrupt *dsr_list; // List of pending DSRs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 cyg_interrupt *chain_list[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 // DSR handling functions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 // 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
77 // call_dsrs() calls the DSRs.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 static void post_dsr( cyg_interrupt *intr )
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 CYG_INTERRUPT_STATE old_intr;
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_REPORT_FUNCTION();
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 HAL_DISABLE_INTERRUPTS(old_intr);
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 if( intr->dsr_count++ == 0 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 intr->next_dsr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 dsr_list = intr;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 }
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 static void call_dsrs(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 CYG_REPORT_FUNCTION();
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 while( dsr_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 volatile cyg_interrupt *intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 cyg_int32 count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 CYG_INTERRUPT_STATE 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 HAL_DISABLE_INTERRUPTS(old_intr);
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 intr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 dsr_list = intr->next_dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 count = intr->dsr_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 intr->dsr_count = 0;
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 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 intr->dsr( intr->vector, count, (CYG_ADDRWORD)intr->data );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 // 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
126 // DSRs will be called if necessary.
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 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 interrupt_end(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 cyg_uint32 isr_ret,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 cyg_interrupt *intr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 HAL_SavedRegisters *regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 )
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 CYG_REPORT_FUNCTION();
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 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 // Only do this if we are in a non-chained configuration.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 // If we are chained, then chain_isr will do the DSR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 // posting.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 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
144
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 if( dsr_disable_counter == 0 ) call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 // ISR for handling chained interrupts.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 cyg_uint32 chain_isr(cyg_vector_t vector, CYG_ADDRWORD data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 cyg_interrupt *p = *(cyg_interrupt **)data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 while( p != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 if( p->vector == vector )
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 register cyg_uint32 isr_ret = p->isr(vector, p->data);
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 if( isr_ret & CYG_ISR_CALL_DSR ) post_dsr(p);
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 if( isr_ret & CYG_ISR_HANDLED ) break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 p = p->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 }
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 CYG_REPORT_RETURN();
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 return 0;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 #endif
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 lock. This disables interrupts and keeps a count of the number
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 // times it has been called.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 externC void cyg_drv_isr_lock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 CYG_INTERRUPT_STATE dummy;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 HAL_DISABLE_INTERRUPTS(dummy);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 CYG_ASSERT( isr_disable_counter >= 0 , "Disable counter negative");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 isr_disable_counter++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 // 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
205 // goes zero.
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 externC void cyg_drv_isr_unlock()
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 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
212
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 isr_disable_counter--;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 if ( isr_disable_counter == 0 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 HAL_ENABLE_INTERRUPTS();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 // Lock DSR lock. Simply increment the counter.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 externC void cyg_drv_dsr_lock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 CYG_REPORT_FUNCTION();
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 dsr_disable_counter++;
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234
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 // 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
237 // DSRs and then zero the counter.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 externC void cyg_drv_dsr_unlock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 CYG_REPORT_FUNCTION();
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 do
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 if( dsr_disable_counter == 1 )
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 call_dsrs();
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 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 dsr_disable_counter = 0;
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 HAL_REORDER_BARRIER();
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 // Check that no DSRs have been posted between calling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 // call_dsrs() and zeroing dsr_disable_counter. If so,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 // loop back and call them.
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 if( dsr_list != NULL )
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 dsr_disable_counter = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 continue;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 }
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 return;
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 } while(1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 CYG_FAIL( "Should not be executed" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 // Initialize a mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 externC void cyg_drv_mutex_init( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 CYG_REPORT_FUNCTION();
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 mutex->lock = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 CYG_REPORT_RETURN();
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
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 // Destroy a mutex.
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 externC void cyg_drv_mutex_destroy( cyg_drv_mutex_t *mutex )
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 CYG_REPORT_FUNCTION();
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 mutex->lock = -1;
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300 // 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
301 // destroyed mutex and if not, set it locked.
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 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
304 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 CYG_REPORT_FUNCTION();
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 CYG_ASSERT( mutex->lock == 0 , "Trying to lock locked mutex");
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 mutex->lock = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 CYG_REPORT_RETURN();
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 return true;
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
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 // Attempt to claim a mutex, and return if it cannot be.
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 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
320 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321 cyg_bool_t result = true;
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 CYG_REPORT_FUNCTION();
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 if( mutex->lock == 1 ) result = false;
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_RETURN();
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 return result;
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
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 // 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
334 // this.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336 externC void cyg_drv_mutex_unlock( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340 CYG_ASSERT( mutex->lock == 1 , "Trying to unlock unlocked mutex");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
341
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
342 mutex->lock = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
343
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344 CYG_REPORT_RETURN();
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 // Release all threads waiting for the mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349 // This is really for threads, so we do nothing here.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351 externC void cyg_drv_mutex_release( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
357 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358 }
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
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 // Initialized a condition variable.
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 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
365 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
366 CYG_REPORT_FUNCTION();
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 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369 cond->mutex = mutex;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
370
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
371 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
372 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
373
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
374
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 // Destroy a condition variable.
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 externC void cyg_drv_cond_destroy( cyg_drv_cond_t *cond )
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 CYG_REPORT_FUNCTION();
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 cond->wait = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 cond->mutex = NULL;
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 CYG_REPORT_RETURN();
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
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 // 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
390 // 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
391 // 0. Note that the semantics of condition variables means that the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392 // 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
393 // when the signal is sent.
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 externC void cyg_drv_cond_wait( cyg_drv_cond_t *cond )
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
398
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
399 CYG_ASSERT( cond->mutex != NULL, "Uninitialized condition variable");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400 CYG_ASSERT( cond->mutex->lock, "Mutex not locked");
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_drv_dsr_lock();
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 cond->wait = 1;
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 while( cond->wait == 1 )
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 // While looping we call call_dsrs() to service any DSRs that
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
409 // 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
410 // 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
411 // lock claimed, then a race condition could occur and keep us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
412 // stuck here forever.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
413
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
414 call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
415 }
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 cyg_drv_dsr_unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
418
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
419 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
420 }
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 // 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
424 // 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
425 // thread.
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_signal( 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 = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
432
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
433 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
434 }
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 // 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
439 // there can only be one waiter.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
441 externC void cyg_drv_cond_broadcast( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
443 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
444
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
446
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
447 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
449
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
452 // Create an interrupt object.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
453
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
454 externC void cyg_drv_interrupt_create(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
455 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
456 cyg_priority_t priority,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457 cyg_addrword_t data,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458 cyg_ISR_t *isr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 cyg_DSR_t *dsr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460 cyg_handle_t *handle,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461 cyg_interrupt *intr
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 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
464 CYG_REPORT_FUNCTION();
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 intr->vector = vector;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467 intr->priority = priority;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468 intr->isr = isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469 intr->dsr = dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 intr->data = data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 intr->next_dsr = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 intr->dsr_count = 0;
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
475
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
476 intr->next = NULL;
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 #endif
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 *handle = (cyg_handle_t)intr;
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 CYG_REPORT_RETURN();
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
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 // 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
487 // the vector.
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 externC void cyg_drv_interrupt_delete( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
490 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
491 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
492
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
493 cyg_drv_interrupt_detach( interrupt );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
494
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
495 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
496 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
499 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
500
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
501 externC void cyg_drv_interrupt_attach( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
502 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
503 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
504
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
505 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
506
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
507 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
508 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
509
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
510 HAL_INTERRUPT_SET_LEVEL( intr->vector, intr->priority );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
511
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
512 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
513
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
514 CYG_ASSERT( intr->next == NULL , "cyg_interrupt already on a list");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
515
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
516 cyg_uint32 index;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
517
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
518 HAL_TRANSLATE_VECTOR( intr->vector, index );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
519
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
520 if( chain_list[index] == NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
521 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
522 // First Interrupt on this chain, just assign it and register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
523 // the chain_isr with the HAL.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
524
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
525 chain_list[index] = intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
526
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
527 HAL_INTERRUPT_ATTACH( intr->vector, chain_isr, &chain_list[index], NULL );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
528 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
529 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
530 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
531 // There are already interrupts chained, add this one into the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
532 // chain in priority order.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
533
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
534 Cyg_Interrupt **p = &chain_list[index];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
535
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
536 while( *p != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
537 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
538 cyg_interrupt *n = *p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
539
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
540 if( n->priority < intr->priority ) break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
541
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
542 p = &n->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
543 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
544 next = *p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
545 *p = intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
546 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
547
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
548 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
549
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
550 HAL_INTERRUPT_ATTACH( intr->vector, intr->isr, intr->data, intr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
551
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
552 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
553
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
554 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
555 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
556
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
557
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
558 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
559 // Detach an interrupt from its vector.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
560
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
561 externC void cyg_drv_interrupt_detach( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
562 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
563 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
564
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
565 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
566
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
567 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
568 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
569
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
570 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
571
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
572 // Remove the interrupt object from the vector chain.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
573
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
574 cyg_uint32 index;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
575
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
576 HAL_TRANSLATE_VECTOR( vector, index );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
577
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
578 cyg_interrupt **p = &chain_list[index];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
579
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
580 while( *p != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
581 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
582 cyg_interrupt *n = *p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
583
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
584 if( n == intr )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
585 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
586 *p = intr->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
587 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
588 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
589
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
590 p = &n->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
591 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
592
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
593 // If this was the last one, detach the vector.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
594
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
595 if( chain_list[index] == NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
596 HAL_INTERRUPT_DETACH( intr->vector, chain_isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
597
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
598 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
599
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
600 HAL_INTERRUPT_DETACH( intr->vector, intr->isr );
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 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
603
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
604 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
605 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
606
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
607
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
608 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
609 // Mask delivery of an interrupt at the interrupt controller.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
610
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
611 externC void cyg_drv_interrupt_mask( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
612 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
613 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
614 CYG_REPORT_FUNCARG1("vector=%d", vector);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
615
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
616 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
618
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
619 HAL_INTERRUPT_MASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
620
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
621 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
622 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
623
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 // Unmask delivery of an interrupt at the interrupt controller.
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 externC void cyg_drv_interrupt_unmask( cyg_vector_t vector )
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 CYG_REPORT_FUNCTION();
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 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
632 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
633
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
634 HAL_INTERRUPT_UNMASK( vector );
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
637 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
638
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 // Acknowledge an interrupt at the controller to allow another interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
641 // to be delivered.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
642
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
643 externC void cyg_drv_interrupt_acknowledge( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
644 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
645 // CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
646
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
647 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
648 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
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 HAL_INTERRUPT_ACKNOWLEDGE( vector );
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 // CYG_REPORT_RETURN();
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
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 // Configure interrupt detection parameters.
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 externC void cyg_drv_interrupt_configure(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
659 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
660 cyg_bool_t level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
661 cyg_bool_t up
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 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
664 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
665 CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
666 up);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
667
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
668 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
669 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
670
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
671 HAL_INTERRUPT_CONFIGURE( vector, level, up );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
672
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
673 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
674 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
675
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
676 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
677 // Configure interrupt priority level.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
678
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
679 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
680 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
681 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
682 CYG_REPORT_FUNCARG2("vector = %d, level = %d", vector, level);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
683
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
684 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
685 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
686
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
687 HAL_INTERRUPT_SET_LEVEL( vector, level );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
688
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
689 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
690 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
691
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
692
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
693 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
694 // 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
695 // hardware exception being raised.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
696
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
697 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
698 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
699 CYG_FAIL(" !!! Exception !!! ");
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
703 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
704
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 // EOF drv_api.c