annotate packages/hal/common/current/src/drv_api.c @ 161:ac086aa3217e

Merge from eCos master repository on 2001-06-08-21:11:51-BST
author jlarmour
date Sun, 10 Jun 2001 19:35:23 +0000
parents b939e9cada46
children 38892b97b685
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####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
25 // Portions created by Red Hat are
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 156
diff changeset
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc.
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
29 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Author(s): Nick Garnett
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Date: 1999-02-24
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Purpose: Driver API for non-kernel configurations
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // Description: These functions are used to support drivers when the kernel
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 // is not present.
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 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 //####DESCRIPTIONEND####
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 #ifndef CYGPKG_KERNEL
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 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 #include <cyg/infra/cyg_trac.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 #include <cyg/infra/cyg_ass.h>
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 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 #include <cyg/hal/drv_api.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 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 #include <cyg/hal/hal_intr.h>
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 // Statics
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 130
diff changeset
63 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
64
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 151
diff changeset
65 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
66 CYGBLD_ATTRIB_ASM_ALIAS( cyg_scheduler_sched_lock );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
68 static cyg_interrupt* volatile dsr_list; // List of pending DSRs
2
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 cyg_interrupt *chain_list[CYGNUM_HAL_ISR_COUNT];
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 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 // DSR handling functions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 // 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
79 // call_dsrs() calls the DSRs.
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 static void post_dsr( cyg_interrupt *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_INTERRUPT_STATE old_intr;
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 CYG_REPORT_FUNCTION();
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 HAL_DISABLE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
89 if( intr->dsr_count++ == 0 )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 intr->next_dsr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 dsr_list = 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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 HAL_RESTORE_INTERRUPTS(old_intr);
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 }
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 static void call_dsrs(void)
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 CYG_REPORT_FUNCTION();
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 while( dsr_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
106 cyg_interrupt *intr;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 cyg_int32 count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 CYG_INTERRUPT_STATE 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 HAL_DISABLE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 intr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 dsr_list = intr->next_dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 count = intr->dsr_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 intr->dsr_count = 0;
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 HAL_RESTORE_INTERRUPTS(old_intr);
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 intr->dsr( intr->vector, count, (CYG_ADDRWORD)intr->data );
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 CYG_REPORT_RETURN();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 //--------------------------------------------------------------------------
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
127 // 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
128
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
129 externC void
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
130 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
131 {
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
132 call_dsrs();
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
133 }
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
134
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
135
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
136 //--------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 // 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
138 // DSRs will be called if necessary.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 interrupt_end(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 cyg_uint32 isr_ret,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 cyg_interrupt *intr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 HAL_SavedRegisters *regs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 )
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 CYG_REPORT_FUNCTION();
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 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 // Only do this if we are in a non-chained configuration.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 // If we are chained, then chain_isr will do the DSR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 // posting.
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 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
156
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 #endif
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 if( dsr_disable_counter == 0 ) call_dsrs();
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_REPORT_RETURN();
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
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 // ISR for handling chained interrupts.
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 cyg_uint32 chain_isr(cyg_vector_t vector, CYG_ADDRWORD data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 {
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
171 cyg_interrupt *p = *(cyg_interrupt **)data;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
172
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 CYG_REPORT_FUNCTION();
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 while( p != NULL )
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 if( p->vector == vector )
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 register cyg_uint32 isr_ret = p->isr(vector, p->data);
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 if( isr_ret & CYG_ISR_CALL_DSR ) post_dsr(p);
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 if( isr_ret & CYG_ISR_HANDLED ) break;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 p = p->next;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191 return 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 }
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 #endif
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 // 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
198 // times it has been called.
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 externC void cyg_drv_isr_lock()
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 CYG_INTERRUPT_STATE dummy;
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 HAL_DISABLE_INTERRUPTS(dummy);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 CYG_ASSERT( isr_disable_counter >= 0 , "Disable counter negative");
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 isr_disable_counter++;
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 // 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
217 // goes zero.
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 externC void cyg_drv_isr_unlock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 CYG_REPORT_FUNCTION();
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 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
224
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 isr_disable_counter--;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 if ( isr_disable_counter == 0 )
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 HAL_ENABLE_INTERRUPTS();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 }
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 // Lock DSR lock. Simply increment the counter.
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 externC void cyg_drv_dsr_lock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 dsr_disable_counter++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 // 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
249 // DSRs and then zero the counter.
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 externC void cyg_drv_dsr_unlock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 do
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 if( dsr_disable_counter == 1 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 }
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 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 dsr_disable_counter = 0;
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 HAL_REORDER_BARRIER();
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 // Check that no DSRs have been posted between calling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 // call_dsrs() and zeroing dsr_disable_counter. If so,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 // loop back and call them.
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 if( dsr_list != NULL )
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 dsr_disable_counter = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 continue;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 CYG_REPORT_RETURN();
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 return;
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 } while(1);
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_FAIL( "Should not be executed" );
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 // Initialize 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_init( 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 = 0;
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 // Destroy a mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 externC void cyg_drv_mutex_destroy( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306 mutex->lock = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312 // 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
313 // destroyed mutex and if not, set it locked.
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 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
316 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 CYG_REPORT_FUNCTION();
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_ASSERT( mutex->lock == 0 , "Trying to lock locked 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 mutex->lock = 1;
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_RETURN();
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 return true;
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
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 // Attempt to claim a mutex, and return if it cannot be.
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 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
332 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333 cyg_bool_t result = true;
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 CYG_REPORT_FUNCTION();
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 if( mutex->lock == 1 ) result = false;
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_RETURN();
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 return result;
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
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 // 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
346 // this.
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 externC void cyg_drv_mutex_unlock( cyg_drv_mutex_t *mutex )
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 CYG_REPORT_FUNCTION();
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_ASSERT( mutex->lock == 1 , "Trying to unlock unlocked mutex");
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 mutex->lock = 0;
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 CYG_REPORT_RETURN();
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
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 // Release all threads waiting for the mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
361 // This is really for threads, so we do nothing here.
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 externC void cyg_drv_mutex_release( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
364 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
365 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
366
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369 CYG_REPORT_RETURN();
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
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 // Initialized a condition variable.
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 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
377 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
378 CYG_REPORT_FUNCTION();
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 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
381 cond->mutex = mutex;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
382
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 CYG_REPORT_RETURN();
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
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 // Destroy a condition variable.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
389
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390 externC void cyg_drv_cond_destroy( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394 cond->wait = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395 cond->mutex = NULL;
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_RETURN();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
401 // 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
402 // 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
403 // 0. Note that the semantics of condition variables means that the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
404 // 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
405 // when the signal is sent.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
406
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
407 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
408 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
409 CYG_REPORT_FUNCTION();
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 CYG_ASSERT( cond->mutex != NULL, "Uninitialized condition variable");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
412 CYG_ASSERT( cond->mutex->lock, "Mutex not locked");
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 cyg_drv_dsr_lock();
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 cond->wait = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
417
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
418 while( cond->wait == 1 )
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 // While looping we call call_dsrs() to service any DSRs that
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
421 // 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
422 // 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
423 // lock claimed, then a race condition could occur and keep us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424 // stuck here forever.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
425
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
426 call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427 }
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_drv_dsr_unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
431 CYG_REPORT_RETURN();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
432
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
433 return true;
2
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 // 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
438 // 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
439 // thread.
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_signal( 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 // 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
453 // there can only be one waiter.
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 externC void cyg_drv_cond_broadcast( cyg_drv_cond_t *cond )
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461 CYG_REPORT_RETURN();
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
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 // Create an interrupt object.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468 externC void cyg_drv_interrupt_create(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 cyg_priority_t priority,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 cyg_addrword_t data,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 cyg_ISR_t *isr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
473 cyg_DSR_t *dsr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
474 cyg_handle_t *handle,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
475 cyg_interrupt *intr
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
476 )
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 CYG_REPORT_FUNCTION();
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 intr->vector = vector;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
481 intr->priority = priority;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
482 intr->isr = isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
483 intr->dsr = dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
484 intr->data = data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
485 intr->next_dsr = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
486 intr->dsr_count = 0;
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
489
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
490 intr->next = NULL;
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 #endif
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 *handle = (cyg_handle_t)intr;
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 CYG_REPORT_RETURN();
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 // 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
501 // the vector.
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 externC void cyg_drv_interrupt_delete( cyg_handle_t 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_drv_interrupt_detach( interrupt );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
508
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
509 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
510 }
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 //--------------------------------------------------------------------------
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
515 externC void cyg_drv_interrupt_attach( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
516 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
517 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
518
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
519 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
520
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
521 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
522 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
523
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
524 HAL_INTERRUPT_SET_LEVEL( intr->vector, intr->priority );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
525
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
526 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
527
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
528 CYG_ASSERT( intr->next == NULL , "cyg_interrupt already on a list");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
529
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
530 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
531 cyg_uint32 index;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
532
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
533 HAL_TRANSLATE_VECTOR( intr->vector, index );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
534
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
535 if( chain_list[index] == NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
536 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
537 // 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
538 // register the chain_isr with the HAL.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
539
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
540 chain_list[index] = intr;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
541
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
542 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
543 &chain_list[index], NULL );
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
544 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
545 else
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
546 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
547 // 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
548 // the chain in priority order.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
549
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
550 cyg_interrupt **p = &chain_list[index];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
551
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
552 while( *p != NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
553 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
554 cyg_interrupt *n = *p;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
555
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
556 if( n->priority < intr->priority ) break;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
557
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
558 p = &n->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
559 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
560 intr->next = *p;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
561 *p = intr;
2
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 }
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 #else
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 HAL_INTERRUPT_ATTACH( intr->vector, intr->isr, intr->data, intr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
568
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
569 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
570
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
571 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
572 }
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
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 // Detach an interrupt from its vector.
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 externC void cyg_drv_interrupt_detach( cyg_handle_t interrupt )
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 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
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_REPORT_FUNCTION();
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 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
585 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
586
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
587 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 // Remove the interrupt object from the vector chain.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
590
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
591 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
592 cyg_uint32 index;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
593 cyg_interrupt **p;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
594
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 151
diff changeset
595 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
596
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
597 p = &chain_list[index];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
598
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
599 while( *p != NULL )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
600 {
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
601 cyg_interrupt *n = *p;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
602
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
603 if( n == intr )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
604 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
605 *p = intr->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
606 break;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
607 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
608
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
609 p = &n->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
610 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
611
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
612 // If this was the last one, detach the vector.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
613
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
614 if( chain_list[index] == NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
615 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
616 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
618 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
619
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
620 HAL_INTERRUPT_DETACH( intr->vector, intr->isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
621
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
622 #endif
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
625 }
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
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 // Mask delivery of an interrupt at the interrupt controller.
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 externC void cyg_drv_interrupt_mask( cyg_vector_t vector )
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_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
634 CYG_REPORT_FUNCARG1("vector=%d", 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_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
637 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
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 HAL_INTERRUPT_MASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
640
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
641 CYG_REPORT_RETURN();
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
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 // Unmask delivery of an interrupt at the interrupt controller.
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 externC void cyg_drv_interrupt_unmask( cyg_vector_t vector )
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 CYG_REPORT_FUNCTION();
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 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
652 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
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 HAL_INTERRUPT_UNMASK( vector );
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_RETURN();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
659 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
660 // Acknowledge an interrupt at the controller to allow another interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
661 // to be delivered.
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 externC void cyg_drv_interrupt_acknowledge( cyg_vector_t vector )
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_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
666
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
667 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
668 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
669
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
670 HAL_INTERRUPT_ACKNOWLEDGE( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
671
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
672 // CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
673 }
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 // Configure interrupt detection parameters.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
677
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
678 externC void cyg_drv_interrupt_configure(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
679 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
680 cyg_bool_t level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
681 cyg_bool_t up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
682 )
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_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
685 CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
686 up);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
687
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
688 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
689 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
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 HAL_INTERRUPT_CONFIGURE( vector, level, up );
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
694 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
695
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 // Configure interrupt priority level.
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 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
700 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
701 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
702 CYG_REPORT_FUNCARG2("vector = %d, level = %d", vector, level);
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 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
705 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
706
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
707 HAL_INTERRUPT_SET_LEVEL( vector, level );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
708
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
709 CYG_REPORT_RETURN();
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 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
714 // 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
715 // hardware exception being raised.
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 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
718 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
719 CYG_FAIL(" !!! Exception !!! ");
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
722
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
723 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
724
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 // EOF drv_api.c