annotate packages/hal/common/current/src/drv_api.c @ 66:bf00f99aec69 ecos-sw-2000-02-02

Merge from eCos master repository on 2000-02-02-19:16:44-GMT
author jlarmour
date Wed, 02 Feb 2000 19:57:02 +0000
parents c38311975d4f
children 6ed91473a1cd
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
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 6
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 static volatile cyg_int32 isr_disable_counter; // ISR disable counter
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 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
66
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 static volatile cyg_interrupt *dsr_list; // List of pending DSRs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 cyg_interrupt *chain_list[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 #endif
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 // DSR handling functions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 // 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
78 // call_dsrs() calls the DSRs.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 static void post_dsr( cyg_interrupt *intr )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 CYG_INTERRUPT_STATE old_intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 HAL_DISABLE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 if( intr->dsr_count++ == 0 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 intr->next_dsr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 dsr_list = intr;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 CYG_REPORT_RETURN();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 static void call_dsrs(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 while( dsr_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 volatile cyg_interrupt *intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 cyg_int32 count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 CYG_INTERRUPT_STATE old_intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 HAL_DISABLE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 intr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 dsr_list = intr->next_dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 count = intr->dsr_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 intr->dsr_count = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 intr->dsr( intr->vector, count, (CYG_ADDRWORD)intr->data );
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 CYG_REPORT_RETURN();
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 //--------------------------------------------------------------------------
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
126 // 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
127
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
128 externC void
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
129 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
130 {
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
131 call_dsrs();
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
132 }
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 //--------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 // 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
137 // DSRs will be called if necessary.
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 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 interrupt_end(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 cyg_uint32 isr_ret,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 cyg_interrupt *intr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 HAL_SavedRegisters *regs
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 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 // Only do this if we are in a non-chained configuration.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 // If we are chained, then chain_isr will do the DSR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 // posting.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 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
155
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 if( dsr_disable_counter == 0 ) call_dsrs();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 }
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 // ISR for handling chained interrupts.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 cyg_uint32 chain_isr(cyg_vector_t vector, CYG_ADDRWORD data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 cyg_interrupt *p = *(cyg_interrupt **)data;
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 while( p != NULL )
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 if( p->vector == vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 register cyg_uint32 isr_ret = p->isr(vector, p->data);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 if( isr_ret & CYG_ISR_CALL_DSR ) post_dsr(p);
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 if( isr_ret & CYG_ISR_HANDLED ) break;
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 p = p->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 CYG_REPORT_RETURN();
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 return 0;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194
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 // 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
197 // times it has been called.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 externC void cyg_drv_isr_lock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 CYG_INTERRUPT_STATE dummy;
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 HAL_DISABLE_INTERRUPTS(dummy);
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 CYG_ASSERT( isr_disable_counter >= 0 , "Disable counter negative");
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 isr_disable_counter++;
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_REPORT_RETURN();
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
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 // 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
216 // goes zero.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 externC void cyg_drv_isr_unlock()
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_FUNCTION();
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 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
223
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 isr_disable_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 if ( isr_disable_counter == 0 )
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 HAL_ENABLE_INTERRUPTS();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233
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 // Lock DSR lock. Simply increment the counter.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 externC void cyg_drv_dsr_lock()
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 CYG_REPORT_FUNCTION();
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 dsr_disable_counter++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 CYG_REPORT_RETURN();
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
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 // 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
248 // DSRs and then zero the counter.
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 externC void cyg_drv_dsr_unlock()
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 CYG_REPORT_FUNCTION();
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 do
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 if( dsr_disable_counter == 1 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 call_dsrs();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 dsr_disable_counter = 0;
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 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 // Check that no DSRs have been posted between calling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 // call_dsrs() and zeroing dsr_disable_counter. If so,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 // loop back and call them.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 if( dsr_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 dsr_disable_counter = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 continue;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 } while(1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 CYG_FAIL( "Should not be executed" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 }
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 // Initialize a mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 externC void cyg_drv_mutex_init( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 mutex->lock = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297
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 // Destroy a mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 externC void cyg_drv_mutex_destroy( cyg_drv_mutex_t *mutex )
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 CYG_REPORT_FUNCTION();
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 mutex->lock = -1;
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_REPORT_RETURN();
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
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 // 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
312 // destroyed mutex and if not, set it locked.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314 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
315 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318 CYG_ASSERT( mutex->lock == 0 , "Trying to lock locked mutex");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320 mutex->lock = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
323
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
325 }
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 // Attempt to claim a mutex, and return if it cannot be.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
329
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
330 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
331 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332 cyg_bool_t result = true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 CYG_REPORT_FUNCTION();
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 if( mutex->lock == 1 ) result = false;
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_RETURN();
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 return result;
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
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 // 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
345 // this.
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 externC void cyg_drv_mutex_unlock( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349 CYG_REPORT_FUNCTION();
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 CYG_ASSERT( mutex->lock == 1 , "Trying to unlock unlocked 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 mutex->lock = 0;
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 CYG_REPORT_RETURN();
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
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 // Release all threads waiting for the mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360 // This is really for threads, so we do nothing here.
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 externC void cyg_drv_mutex_release( cyg_drv_mutex_t *mutex )
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 CYG_REPORT_FUNCTION();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
367
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
368 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
369 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
370
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 // Initialized a condition variable.
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 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
376 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
377 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
378
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
379 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
380 cond->mutex = mutex;
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
383 }
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 // Destroy a condition variable.
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 externC void cyg_drv_cond_destroy( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393 cond->wait = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394 cond->mutex = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
396 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 }
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 // 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
401 // 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
402 // 0. Note that the semantics of condition variables means that the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
403 // 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
404 // when the signal is sent.
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 externC void cyg_drv_cond_wait( cyg_drv_cond_t *cond )
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
409
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
410 CYG_ASSERT( cond->mutex != NULL, "Uninitialized condition variable");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
411 CYG_ASSERT( cond->mutex->lock, "Mutex not locked");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
412
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
413 cyg_drv_dsr_lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
414
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
415 cond->wait = 1;
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 while( cond->wait == 1 )
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 // While looping we call call_dsrs() to service any DSRs that
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
420 // 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
421 // 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
422 // lock claimed, then a race condition could occur and keep us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
423 // stuck here forever.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
425 call_dsrs();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
428 cyg_drv_dsr_unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
429
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
434 // 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
435 // 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
436 // thread.
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 externC void cyg_drv_cond_signal( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
439 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
441
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
443
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
444 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
446
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
447
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
449 // 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
450 // there can only be one waiter.
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 externC void cyg_drv_cond_broadcast( cyg_drv_cond_t *cond )
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
455
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
456 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 }
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
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 // Create an interrupt object.
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 externC void cyg_drv_interrupt_create(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467 cyg_priority_t priority,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468 cyg_addrword_t data,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469 cyg_ISR_t *isr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 cyg_DSR_t *dsr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 cyg_handle_t *handle,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 cyg_interrupt *intr
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 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
475 CYG_REPORT_FUNCTION();
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 intr->vector = vector;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
478 intr->priority = priority;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
479 intr->isr = isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
480 intr->dsr = dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
481 intr->data = data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
482 intr->next_dsr = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
483 intr->dsr_count = 0;
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
486
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
487 intr->next = NULL;
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 #endif
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 *handle = (cyg_handle_t)intr;
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_REPORT_RETURN();
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
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 // 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
498 // the vector.
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 externC void cyg_drv_interrupt_delete( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
501 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
502 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
503
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
504 cyg_drv_interrupt_detach( interrupt );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
505
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
506 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
507 }
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 //--------------------------------------------------------------------------
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 externC void cyg_drv_interrupt_attach( cyg_handle_t interrupt )
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_interrupt *intr = (cyg_interrupt *)interrupt;
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_REPORT_FUNCTION();
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 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
519 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
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 HAL_INTERRUPT_SET_LEVEL( intr->vector, intr->priority );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
522
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
523 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 CYG_ASSERT( intr->next == NULL , "cyg_interrupt already on a list");
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 cyg_uint32 index;
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 HAL_TRANSLATE_VECTOR( intr->vector, index );
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 if( chain_list[index] == NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
532 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
533 // First Interrupt on this chain, just assign it and register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
534 // the chain_isr with the HAL.
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 chain_list[index] = intr;
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 HAL_INTERRUPT_ATTACH( intr->vector, chain_isr, &chain_list[index], NULL );
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 else
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 // There are already interrupts chained, add this one into the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
543 // chain in priority order.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
544
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
545 Cyg_Interrupt **p = &chain_list[index];
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 while( *p != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
548 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
549 cyg_interrupt *n = *p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
550
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
551 if( n->priority < intr->priority ) break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
552
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
553 p = &n->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
554 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
555 next = *p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
556 *p = intr;
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 #else
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 HAL_INTERRUPT_ATTACH( intr->vector, intr->isr, intr->data, intr );
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 #endif
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_RETURN();
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
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
570 // Detach an interrupt from its vector.
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 externC void cyg_drv_interrupt_detach( cyg_handle_t interrupt )
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_interrupt *intr = (cyg_interrupt *)interrupt;
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 CYG_REPORT_FUNCTION();
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_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
579 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
580
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
581 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
582
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
583 // Remove the interrupt object from the vector chain.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
584
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
585 cyg_uint32 index;
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 HAL_TRANSLATE_VECTOR( vector, index );
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 cyg_interrupt **p = &chain_list[index];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
590
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
591 while( *p != NULL )
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 cyg_interrupt *n = *p;
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( n == intr )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
596 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
597 *p = intr->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
598 break;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
601 p = &n->next;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
602 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
603
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
604 // If this was the last one, detach the vector.
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 if( chain_list[index] == NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
607 HAL_INTERRUPT_DETACH( intr->vector, chain_isr );
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 #else
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 HAL_INTERRUPT_DETACH( intr->vector, intr->isr );
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 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
614
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
615 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
616 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
620 // Mask delivery of an interrupt at the interrupt controller.
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 externC void cyg_drv_interrupt_mask( cyg_vector_t vector )
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_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
625 CYG_REPORT_FUNCARG1("vector=%d", vector);
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 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
628 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
629
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
630 HAL_INTERRUPT_MASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
631
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
632 CYG_REPORT_RETURN();
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
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 // Unmask delivery of an interrupt at the interrupt controller.
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 externC void cyg_drv_interrupt_unmask( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
639 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
640 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
641
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
642 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
643 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid 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 HAL_INTERRUPT_UNMASK( vector );
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_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
648 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
649
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
650 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
651 // Acknowledge an interrupt at the controller to allow another interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
652 // to be delivered.
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 externC void cyg_drv_interrupt_acknowledge( cyg_vector_t 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_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
657
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
658 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
659 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
660
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
661 HAL_INTERRUPT_ACKNOWLEDGE( vector );
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 // CYG_REPORT_RETURN();
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
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 // Configure interrupt detection parameters.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
668
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
669 externC void cyg_drv_interrupt_configure(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
670 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
671 cyg_bool_t level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
672 cyg_bool_t up
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
676 CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
677 up);
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 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
680 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
681
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
682 HAL_INTERRUPT_CONFIGURE( vector, level, up );
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_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
685 }
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
688 // Configure interrupt priority level.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
689
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
690 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
691 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
692 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
693 CYG_REPORT_FUNCARG2("vector = %d, level = %d", vector, level);
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 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
696 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
697
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
698 HAL_INTERRUPT_SET_LEVEL( vector, level );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
699
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
700 CYG_REPORT_RETURN();
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
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 // 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
706 // hardware exception being raised.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
707
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
708 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
709 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
710 CYG_FAIL(" !!! Exception !!! ");
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 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
715
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 // EOF drv_api.c