annotate packages/hal/common/current/src/drv_api.c @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
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 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 1158
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
2
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 //#####DESCRIPTIONBEGIN####
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 // Author(s): Nick Garnett
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 // Date: 1999-02-24
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 // Purpose: Driver API for non-kernel configurations
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 // Description: These functions are used to support drivers when the kernel
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 // is not present.
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 //
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 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 #ifndef CYGPKG_KERNEL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 #include <cyg/infra/cyg_trac.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 #include <cyg/infra/cyg_ass.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 #include <cyg/hal/drv_api.h>
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 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 #include <cyg/hal/hal_intr.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 // Statics
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 130
diff changeset
71 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
72
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
73 static CYG_INTERRUPT_STATE isr_disable_state;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
74
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 151
diff changeset
75 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
76 CYGBLD_ATTRIB_ASM_ALIAS( cyg_scheduler_sched_lock );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
78 static cyg_interrupt* volatile dsr_list; // List of pending DSRs
2
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 *chain_list[CYGNUM_HAL_ISR_COUNT];
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 #endif
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 // DSR handling functions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 // 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
89 // call_dsrs() calls the DSRs.
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 static void post_dsr( cyg_interrupt *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 CYG_INTERRUPT_STATE old_intr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 CYG_REPORT_FUNCTION();
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 HAL_DISABLE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
99 if( intr->dsr_count++ == 0 )
2
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 intr->next_dsr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 dsr_list = intr;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 CYG_REPORT_RETURN();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 static void call_dsrs(void)
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 while( dsr_list != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 115
diff changeset
116 cyg_interrupt *intr;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 cyg_int32 count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 CYG_INTERRUPT_STATE old_intr;
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 HAL_DISABLE_INTERRUPTS(old_intr);
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 intr = dsr_list;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 dsr_list = intr->next_dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 count = intr->dsr_count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 intr->dsr_count = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 HAL_RESTORE_INTERRUPTS(old_intr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 intr->dsr( intr->vector, count, (CYG_ADDRWORD)intr->data );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 //--------------------------------------------------------------------------
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
137 // 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
138
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
139 externC void
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
140 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
141 {
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
142 call_dsrs();
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
143 }
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
144
1158
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
145 //--------------------------------------------------------------------------
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
146 // This is called from springboard ISRs in some HALs.
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
147
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
148 externC void
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
149 cyg_interrupt_post_dsr(CYG_ADDRWORD data)
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
150 {
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
151 cyg_interrupt * intr = (cyg_interrupt *)data;
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
152 post_dsr(intr);
10a36d0fd6f3 * src/drv_api.c: Added definition of cyg_interrupt_post_dsr() for
nickg
parents: 210
diff changeset
153 }
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
154
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
155 //--------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 // 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
157 // DSRs will be called if necessary.
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 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 interrupt_end(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 cyg_uint32 isr_ret,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 cyg_interrupt *intr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 HAL_SavedRegisters *regs
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 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 CYG_REPORT_FUNCTION();
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 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 // Only do this if we are in a non-chained configuration.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 // If we are chained, then chain_isr will do the DSR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 // posting.
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 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
175
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 #endif
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 if( dsr_disable_counter == 0 ) call_dsrs();
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 CYG_REPORT_RETURN();
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
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 // ISR for handling chained interrupts.
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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_uint32 chain_isr(cyg_vector_t vector, CYG_ADDRWORD data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 {
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
190 cyg_interrupt *p = *(cyg_interrupt **)data;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
191 register cyg_uint32 isr_ret = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
192 register cyg_uint32 isr_chain_ret = 0;
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
193
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 CYG_REPORT_FUNCTION();
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 while( p != NULL )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 if( p->vector == vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 {
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
200 isr_ret = p->isr(vector, p->data);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
201
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
202 isr_chain_ret |= isr_ret;
2
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 if( isr_ret & CYG_ISR_CALL_DSR ) post_dsr(p);
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 if( isr_ret & CYG_ISR_HANDLED ) break;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 p = p->next;
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
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
212 #ifdef HAL_DEFAULT_ISR
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
213 if( (isr_chain_ret & (CYG_ISR_CALL_DSR|CYG_ISR_HANDLED)) == 0 )
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
214 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
215 // If we finished the loop for some reason other than that an
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
216 // ISR has handled the interrupt, call any default ISR to either
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
217 // report the spurious interrupt, or do some other HAL level processing
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
218 // such as GDB interrupt detection etc.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
219
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
220 HAL_DEFAULT_ISR( vector, 0 );
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
221 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
222 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
223
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 161
diff changeset
226 return isr_ret & CYG_ISR_CALL_DSR;
2
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 #endif
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 // 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
233 // times it has been called.
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 externC void cyg_drv_isr_lock()
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
239 if( isr_disable_counter == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
240 HAL_DISABLE_INTERRUPTS(isr_disable_state);
2
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 CYG_ASSERT( isr_disable_counter >= 0 , "Disable counter negative");
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 isr_disable_counter++;
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 CYG_REPORT_RETURN();
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
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 // 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
251 // goes zero.
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 externC void cyg_drv_isr_unlock()
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 CYG_REPORT_FUNCTION();
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 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
258
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 isr_disable_counter--;
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 if ( isr_disable_counter == 0 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 {
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
263 HAL_RESTORE_INTERRUPTS(isr_disable_state);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 // Lock DSR lock. Simply increment the counter.
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 externC void cyg_drv_dsr_lock()
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 CYG_REPORT_FUNCTION();
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 dsr_disable_counter++;
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
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 // 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
283 // DSRs and then zero the counter.
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 externC void cyg_drv_dsr_unlock()
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 CYG_REPORT_FUNCTION();
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 do
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 if( dsr_disable_counter == 1 )
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 call_dsrs();
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 HAL_REORDER_BARRIER();
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 dsr_disable_counter = 0;
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 HAL_REORDER_BARRIER();
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 // Check that no DSRs have been posted between calling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 // call_dsrs() and zeroing dsr_disable_counter. If so,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304 // loop back and call them.
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 if( dsr_list != NULL )
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 dsr_disable_counter = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 continue;
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 CYG_REPORT_RETURN();
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 return;
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 } while(1);
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_FAIL( "Should not be executed" );
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
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 // Initialize a mutex.
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 externC void cyg_drv_mutex_init( cyg_drv_mutex_t *mutex )
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 CYG_REPORT_FUNCTION();
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 mutex->lock = 0;
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 // Destroy a mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336 externC void cyg_drv_mutex_destroy( cyg_drv_mutex_t *mutex )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340 mutex->lock = -1;
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 CYG_REPORT_RETURN();
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346 // 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
347 // destroyed mutex and if not, set it locked.
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 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
350 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353 CYG_ASSERT( mutex->lock == 0 , "Trying to lock locked mutex");
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 mutex->lock = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
356
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
357 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
359 return true;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
361
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
362 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
363 // Attempt to claim a mutex, and return if it cannot be.
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 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
366 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
367 cyg_bool_t result = true;
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_FUNCTION();
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 if( mutex->lock == 1 ) result = false;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
372
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
373 mutex->lock = 1;
2
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 CYG_REPORT_RETURN();
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 return result;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
380 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
381 // 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
382 // this.
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 externC void cyg_drv_mutex_unlock( cyg_drv_mutex_t *mutex )
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 CYG_REPORT_FUNCTION();
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 CYG_ASSERT( mutex->lock == 1 , "Trying to unlock unlocked mutex");
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 mutex->lock = 0;
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_RETURN();
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
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 // Release all threads waiting for the mutex.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 // This is really for threads, so we do nothing here.
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 externC void cyg_drv_mutex_release( cyg_drv_mutex_t *mutex )
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 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
402
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
403
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
404
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
405 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
406 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
407
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
408
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
409 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
410 // Initialized a condition variable.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
411
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
412 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
413 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
414 CYG_REPORT_FUNCTION();
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 = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
417 cond->mutex = mutex;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
418
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
419 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
420 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
421
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
422
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
423 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424 // Destroy a condition variable.
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 externC void cyg_drv_cond_destroy( cyg_drv_cond_t *cond )
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_REPORT_FUNCTION();
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 cond->wait = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431 cond->mutex = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
432
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
433 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
434 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
435
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
436 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
437 // 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
438 // 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
439 // 0. Note that the semantics of condition variables means that the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440 // 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
441 // when the signal is sent.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
443 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
444 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445 CYG_REPORT_FUNCTION();
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_ASSERT( cond->mutex != NULL, "Uninitialized condition variable");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448 CYG_ASSERT( cond->mutex->lock, "Mutex not locked");
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 cyg_drv_dsr_lock();
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 cond->wait = 1;
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 while( cond->wait == 1 )
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 // While looping we call call_dsrs() to service any DSRs that
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457 // 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
458 // 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
459 // lock claimed, then a race condition could occur and keep us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460 // stuck here forever.
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 call_dsrs();
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 cyg_drv_dsr_unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
467 CYG_REPORT_RETURN();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
468
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
469 return true;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
473 // 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
474 // 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
475 // thread.
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 externC void cyg_drv_cond_signal( cyg_drv_cond_t *cond )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
478 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
479 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
480
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
481 cond->wait = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
482
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
483 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
484 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
485
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
486
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 // 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
489 // there can only be one waiter.
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 externC void cyg_drv_cond_broadcast( cyg_drv_cond_t *cond )
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_FUNCTION();
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 cond->wait = 0;
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 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
498 }
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
499
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
500 //--------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
501 // Spinlock support.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
502 // Since we can only support a single CPU in this version of the API, we only
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
503 // set and clear the lock variable to keep track of what's happening.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
504
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
505 void cyg_drv_spinlock_init(
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
506 cyg_drv_spinlock_t *lock, /* spinlock to initialize */
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
507 cyg_bool_t locked /* init locked or unlocked */
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
508 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
509 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
510 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
511
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
512 lock->lock = locked;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
513
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
514 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
515 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
516
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
517 void cyg_drv_spinlock_destroy( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
518 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
519 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
520
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
521 lock->lock = -1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
522
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
523 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
524 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
525
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
526 void cyg_drv_spinlock_spin( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
527 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
528 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
529
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
530 CYG_ASSERT( lock->lock == 0 , "Trying to lock locked spinlock");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
531
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
532 lock->lock = 1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
533
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
534 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
535 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
536
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
537 void cyg_drv_spinlock_clear( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
538 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
539 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
540
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
541 CYG_ASSERT( lock->lock == 1 , "Trying to clear cleared spinlock");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
542
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
543 lock->lock = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
544
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
545 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
546 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
547
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
548 cyg_bool_t cyg_drv_spinlock_try( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
549 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
550 cyg_bool_t result = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
551
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
552 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
553
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
554 if( lock->lock == 1 ) result = false;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
555
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
556 lock->lock = 1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
557
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
558 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
559
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
560 return result;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
561 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
562
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
563 cyg_bool_t cyg_drv_spinlock_test( cyg_drv_spinlock_t *lock )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
564 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
565 cyg_bool_t result = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
566
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
567 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
568
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
569 if( lock->lock == 1 ) result = false;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
570
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
571 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
572
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
573 return result;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
574 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
575
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
576 void cyg_drv_spinlock_spin_intsave( cyg_drv_spinlock_t *lock,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
577 cyg_addrword_t *istate )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
578 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
579 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
580
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
581 HAL_DISABLE_INTERRUPTS( *istate );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
582
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
583 lock->lock = 1;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
584
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
585 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
586 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
587
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
588
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
589 void cyg_drv_spinlock_clear_intsave( cyg_drv_spinlock_t *lock,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
590 cyg_addrword_t istate )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
591 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
592 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
593
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
594 lock->lock = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
595
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
596 HAL_RESTORE_INTERRUPTS( istate );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
597
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
598 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
599 }
2
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 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
602 // Create an interrupt object.
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 externC void cyg_drv_interrupt_create(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
605 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
606 cyg_priority_t priority,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
607 cyg_addrword_t data,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
608 cyg_ISR_t *isr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
609 cyg_DSR_t *dsr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
610 cyg_handle_t *handle,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
611 cyg_interrupt *intr
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 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
614 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
615
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
616 intr->vector = vector;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617 intr->priority = priority;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
618 intr->isr = isr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
619 intr->dsr = dsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
620 intr->data = data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
621 intr->next_dsr = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
622 intr->dsr_count = 0;
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 intr->next = NULL;
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 #endif
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 *handle = (cyg_handle_t)intr;
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 // 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
637 // the 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 externC void cyg_drv_interrupt_delete( cyg_handle_t interrupt )
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_FUNCTION();
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 cyg_drv_interrupt_detach( interrupt );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
644
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
645 CYG_REPORT_RETURN();
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
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 externC void cyg_drv_interrupt_attach( cyg_handle_t interrupt )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
652 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
653 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
654
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
655 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
656
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
657 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
658 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
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 HAL_INTERRUPT_SET_LEVEL( intr->vector, intr->priority );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
661
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
662 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
663
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
664 CYG_ASSERT( intr->next == NULL , "cyg_interrupt already on a list");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
665
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
666 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
667 cyg_uint32 index;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
668
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
669 HAL_TRANSLATE_VECTOR( intr->vector, index );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
670
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
671 if( chain_list[index] == NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
672 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
673 // 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
674 // register the chain_isr with the HAL.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
675
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
676 chain_list[index] = intr;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
677
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
678 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
679 &chain_list[index], NULL );
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
680 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
681 else
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
682 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
683 // 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
684 // the chain in priority order.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
685
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
686 cyg_interrupt **p = &chain_list[index];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
687
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
688 while( *p != NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
689 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
690 cyg_interrupt *n = *p;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
691
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
692 if( n->priority < intr->priority ) break;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
693
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
694 p = &n->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
695 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
696 intr->next = *p;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
697 *p = intr;
2
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 }
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 #else
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 HAL_INTERRUPT_ATTACH( intr->vector, intr->isr, intr->data, intr );
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 #endif
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 CYG_REPORT_RETURN();
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
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 // Detach an interrupt from its vector.
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 externC void cyg_drv_interrupt_detach( cyg_handle_t interrupt )
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 cyg_interrupt *intr = (cyg_interrupt *)interrupt;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
717
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
718 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
719
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
720 CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
721 CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
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 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN
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 // Remove the interrupt object from the vector chain.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
726
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
727 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
728 cyg_uint32 index;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
729 cyg_interrupt **p;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
730
156
b939e9cada46 Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents: 151
diff changeset
731 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
732
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
733 p = &chain_list[index];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
734
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
735 while( *p != NULL )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
736 {
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
737 cyg_interrupt *n = *p;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
738
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
739 if( n == intr )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
740 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
741 *p = intr->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
742 break;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
743 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
744
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
745 p = &n->next;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
746 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
747
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
748 // If this was the last one, detach the vector.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
749
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
750 if( chain_list[index] == NULL )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 149
diff changeset
751 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
752 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
753
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
754 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
755
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
756 HAL_INTERRUPT_DETACH( intr->vector, intr->isr );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
757
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
758 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
759
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
760 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
761 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
762
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
763
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
764 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
765 // Mask delivery of an interrupt at the interrupt controller.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
766 // (Interrupt safe)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
767
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
768 externC void cyg_drv_interrupt_mask( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
769 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
770 CYG_INTERRUPT_STATE old_ints;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
771
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
772 CYG_REPORT_FUNCTION();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
773 CYG_REPORT_FUNCARG1("vector=%d", vector);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
774
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
775 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
776 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
777
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
778 HAL_DISABLE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
779 HAL_INTERRUPT_MASK( vector );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
780 HAL_RESTORE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
781
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
782 CYG_REPORT_RETURN();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
783 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
784
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
785 //--------------------------------------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
786 // Mask delivery of an interrupt at the interrupt controller.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
787 // (Not interrupt safe)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
788
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
789 externC void cyg_drv_interrupt_mask_intunsafe( cyg_vector_t vector )
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
790 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
791 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
792 CYG_REPORT_FUNCARG1("vector=%d", vector);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
793
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
794 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
795 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
796
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
797 HAL_INTERRUPT_MASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
798
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
799 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
800 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
801
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
802 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
803 // Unmask delivery of an interrupt at the interrupt controller.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
804 // (Interrupt safe)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
805
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
806 externC void cyg_drv_interrupt_unmask( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
807 {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
808 CYG_INTERRUPT_STATE old_ints;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
809
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
810 CYG_REPORT_FUNCTION();
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
811 CYG_REPORT_FUNCARG1("vector=%d", vector);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
812
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
813 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
814 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
815
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
816 HAL_DISABLE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
817 HAL_INTERRUPT_UNMASK( vector );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
818 HAL_RESTORE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
819
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
820 CYG_REPORT_RETURN();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
821 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
822
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
823 //--------------------------------------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
824 // Unmask delivery of an interrupt at the interrupt controller.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
825 // (Not interrupt safe)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
826
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
827 externC void cyg_drv_interrupt_unmask_intunsafe( cyg_vector_t vector )
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
828 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
829 CYG_REPORT_FUNCTION();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
830 CYG_REPORT_FUNCARG1("vector=%d", vector);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
831
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
832 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
833 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
834
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
835 HAL_INTERRUPT_UNMASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
836
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
837 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
838 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
839
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
840 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
841 // Acknowledge an interrupt at the controller to allow another interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
842 // to be delivered.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
843
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
844 externC void cyg_drv_interrupt_acknowledge( cyg_vector_t vector )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
845 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
846 // CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
847
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
848 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
849 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
850
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
851 HAL_INTERRUPT_ACKNOWLEDGE( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
852
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
853 // CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
854 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
855
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
856 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
857 // Configure interrupt detection parameters.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
858
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
859 externC void cyg_drv_interrupt_configure(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
860 cyg_vector_t vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
861 cyg_bool_t level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
862 cyg_bool_t up
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
863 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
864 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
865 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
866 CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
867 up);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
868
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
869 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
870 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
871
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
872 HAL_INTERRUPT_CONFIGURE( vector, level, up );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
873
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
874 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
875 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
876
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
877 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
878 // Configure interrupt priority level.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
879
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
880 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
881 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
882 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
883 CYG_REPORT_FUNCARG2("vector = %d, level = %d", vector, level);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
884
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
885 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
886 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
887
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
888 HAL_INTERRUPT_SET_LEVEL( vector, level );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
889
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
890 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
891 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
892
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
893 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
894 // CPU interrupt routing
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
895
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
896 externC void cyg_drv_interrupt_set_cpu( cyg_vector_t vector, cyg_cpu_t cpu )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
897 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
898 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
899 CYG_REPORT_FUNCARG2("vector = %d, cpu = %d", vector, cpu);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
900
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
901 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
902 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
903
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
904 #ifdef CYGPKG_HAL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
905 HAL_INTERRUPT_SET_CPU( vector, cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
906 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
907
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
908 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
909 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
910
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
911 externC cyg_cpu_t cyg_drv_interrupt_get_cpu( cyg_vector_t vector )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
912 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
913 cyg_cpu_t cpu = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
914
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
915 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
916 CYG_REPORT_FUNCARG1("vector = %d", vector);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
917
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
918 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
919 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
920
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
921 #ifdef CYGPKG_HAL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
922 HAL_INTERRUPT_GET_CPU( vector, cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
923 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
924
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
925 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
926
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
927 return cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
928 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
929
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
930 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
931 // 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
932 // hardware exception being raised.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
933
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
934 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
935 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
936 CYG_FAIL(" !!! Exception !!! ");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
937 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
938
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
939
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
940 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
941
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
942 //--------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
943 // EOF drv_api.c