comparison packages/hal/mips/vrc4373/current/include/plf_intr.h @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents
children 25e238959bae
comparison
equal deleted inserted replaced
75:41bf073c0c32 76:435cced73e2f
1 #ifndef CYGONCE_HAL_PLF_INTR_H
2 #define CYGONCE_HAL_PLF_INTR_H
3
4 //==========================================================================
5 //
6 // plf_intr.h
7 //
8 // VRC4373 Interrupt and clock support
9 //
10 //==========================================================================
11 //####COPYRIGHTBEGIN####
12 //
13 // -------------------------------------------
14 // The contents of this file are subject to the Red Hat eCos Public License
15 // Version 1.1 (the "License"); you may not use this file except in
16 // compliance with the License. You may obtain a copy of the License at
17 // http://www.redhat.com/
18 //
19 // Software distributed under the License is distributed on an "AS IS"
20 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
21 // License for the specific language governing rights and limitations under
22 // the License.
23 //
24 // The Original Code is eCos - Embedded Configurable Operating System,
25 // released September 30, 1998.
26 //
27 // The Initial Developer of the Original Code is Red Hat.
28 // Portions created by Red Hat are
29 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
30 // All Rights Reserved.
31 // -------------------------------------------
32 //
33 //####COPYRIGHTEND####
34 //==========================================================================
35 //#####DESCRIPTIONBEGIN####
36 //
37 // Author(s): nickg
38 // Contributors: nickg, jskov,
39 // gthomas, jlarmour
40 // Date: 1999-02-16
41 // Purpose: Define Interrupt support
42 // Description: The macros defined here provide the HAL APIs for handling
43 // interrupts and the clock for the VRC4373 board.
44 //
45 // Usage:
46 // #include <cyg/hal/plf_intr.h>
47 // ...
48 //
49 //
50 //####DESCRIPTIONEND####
51 //
52 //==========================================================================
53
54 #include <pkgconf/hal.h>
55
56 #include <cyg/infra/cyg_type.h>
57
58 //--------------------------------------------------------------------------
59 // Interrupt controller stuff.
60
61 // The first 6 correspond to the interrupt lines in the status/cause regs
62 #define CYGNUM_HAL_INTERRUPT_VRC4373 0
63 #define CYGNUM_HAL_INTERRUPT_IPL0 1
64 #define CYGNUM_HAL_INTERRUPT_IPL1 2
65 #define CYGNUM_HAL_INTERRUPT_IPL2 3
66 #define CYGNUM_HAL_INTERRUPT_POWER 4
67 #define CYGNUM_HAL_INTERRUPT_COMPARE 5
68 // The next 32 correspond to the interrupt lines in the 4372 interrupt
69 // controller. These are decoded from the controller when an interrupt
70 // on any of the IPL[0:2] lines in signalled.
71 #define CYGNUM_HAL_INTERRUPT_REALTIME_A 6
72 #define CYGNUM_HAL_INTERRUPT_REALTIME_B 7
73 #define CYGNUM_HAL_INTERRUPT_DUART 8
74 #define CYGNUM_HAL_INTERRUPT_TIMER 9
75 #define CYGNUM_HAL_INTERRUPT_PARALLEL 10
76 #define CYGNUM_HAL_INTERRUPT_PCI_INTA 11
77 #define CYGNUM_HAL_INTERRUPT_PCI_INTB 12
78 #define CYGNUM_HAL_INTERRUPT_PCI_INTC 13
79 #define CYGNUM_HAL_INTERRUPT_PCI_INTD 14
80 #define CYGNUM_HAL_INTERRUPT_INT_9 15
81 #define CYGNUM_HAL_INTERRUPT_INT_10 16
82 #define CYGNUM_HAL_INTERRUPT_INT_11 17
83 #define CYGNUM_HAL_INTERRUPT_INT_12 18
84 #define CYGNUM_HAL_INTERRUPT_INT_13 19
85 #define CYGNUM_HAL_INTERRUPT_DMA_0 20
86 #define CYGNUM_HAL_INTERRUPT_DMA_1 21
87 #define CYGNUM_HAL_INTERRUPT_DMA_2 22
88 #define CYGNUM_HAL_INTERRUPT_DMA_3 23
89 #define CYGNUM_HAL_INTERRUPT_TICK_0 24
90 #define CYGNUM_HAL_INTERRUPT_TICK_1 25
91 #define CYGNUM_HAL_INTERRUPT_UNUSED_20 26
92 #define CYGNUM_HAL_INTERRUPT_UNUSED_21 27
93 #define CYGNUM_HAL_INTERRUPT_IO_TIMEOUT 28
94 #define CYGNUM_HAL_INTERRUPT_PCI_PERR 29
95 #define CYGNUM_HAL_INTERRUPT_PCI_SERR 30
96 #define CYGNUM_HAL_INTERRUPT_PCI_SIG_TA 31
97 #define CYGNUM_HAL_INTERRUPT_PCI_REC_TA 32
98 #define CYGNUM_HAL_INTERRUPT_PCI_SIG_MA 33
99 #define CYGNUM_HAL_INTERRUPT_PCI_ADD 34
100 #define CYGNUM_HAL_INTERRUPT_PCI_RET_ERR 35
101 #define CYGNUM_HAL_INTERRUPT_UNUSED_30 36
102 #define CYGNUM_HAL_INTERRUPT_UNUSED_31 37
103
104 // Min/Max ISR numbers and how many there are
105 #define CYGNUM_HAL_ISR_MIN 0
106 #define CYGNUM_HAL_ISR_MAX 37
107 #define CYGNUM_HAL_ISR_COUNT 38
108
109 // The vector used by the Real time clock. The default here is to use
110 // interrupt 5, which is connected to the counter/comparator registers
111 // in many MIPS variants.
112
113 #ifndef CYGNUM_HAL_INTERRUPT_RTC
114 #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_COMPARE
115 #endif
116
117 #define CYGHWR_HAL_INTERRUPT_VECTORS_DEFINED
118
119 //--------------------------------------------------------------------------
120 // controller access code
121
122 #define CYGHWR_HAL_MIPS_VRC4373_BASE 0xbc000000
123 #define CYGHWR_HAL_MIPS_VRC4373_INTC_POL (CYGHWR_HAL_MIPS_VRC4373_BASE+0x200)
124 #define CYGHWR_HAL_MIPS_VRC4373_INTC_TRIG (CYGHWR_HAL_MIPS_VRC4373_BASE+0x204)
125 #define CYGHWR_HAL_MIPS_VRC4373_INTC_PINS (CYGHWR_HAL_MIPS_VRC4373_BASE+0x208)
126 #define CYGHWR_HAL_MIPS_VRC4373_INTC_MASK0 (CYGHWR_HAL_MIPS_VRC4373_BASE+0x20c)
127 #define CYGHWR_HAL_MIPS_VRC4373_INTC_STAT0 (CYGHWR_HAL_MIPS_VRC4373_BASE+0x210)
128 #define CYGHWR_HAL_MIPS_VRC4373_INTC_MASK1 (CYGHWR_HAL_MIPS_VRC4373_BASE+0x214)
129 #define CYGHWR_HAL_MIPS_VRC4373_INTC_STAT1 (CYGHWR_HAL_MIPS_VRC4373_BASE+0x218)
130 #define CYGHWR_HAL_MIPS_VRC4373_INTC_MASK2 (CYGHWR_HAL_MIPS_VRC4373_BASE+0x21c)
131 #define CYGHWR_HAL_MIPS_VRC4373_INTC_STAT2 (CYGHWR_HAL_MIPS_VRC4373_BASE+0x220)
132
133 #define CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF 8
134
135 // Array which stores the configured priority levels for the configured
136 // interrupts.
137 externC volatile CYG_BYTE cyg_hal_interrupt_level[CYGNUM_HAL_ISR_COUNT];
138
139 #define HAL_INTERRUPT_MASK( _vector_ ) \
140 CYG_MACRO_START \
141 if( _vector_ <= CYGNUM_HAL_INTERRUPT_COMPARE ) \
142 { \
143 asm volatile ( \
144 "mfc0 $3,$12\n" \
145 "la $2,0x00000400\n" \
146 "sllv $2,$2,%0\n" \
147 "nor $2,$2,$0\n" \
148 "and $3,$3,$2\n" \
149 "mtc0 $3,$12\n" \
150 "nop; nop; nop\n" \
151 : \
152 : "r"(_vector_) \
153 : "$2", "$3" \
154 ); \
155 } \
156 else \
157 { \
158 CYG_WORD32 _mask_; \
159 CYG_BYTE _shift_; \
160 HAL_IO_REGISTER _maskreg_ = CYGHWR_HAL_MIPS_VRC4373_INTC_MASK0 + \
161 cyg_hal_interrupt_level[_vector_] * \
162 CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF; \
163 HAL_READ_UINT32( _maskreg_, _mask_ ); \
164 _shift_ = _vector_-CYGNUM_HAL_INTERRUPT_REALTIME_A; \
165 _mask_ &= ~(1<<_shift_); \
166 HAL_WRITE_UINT32( _maskreg_, _mask_ ); \
167 } \
168 CYG_MACRO_END
169
170 #define HAL_INTERRUPT_UNMASK( _vector_ ) \
171 CYG_MACRO_START \
172 if( _vector_ <= CYGNUM_HAL_INTERRUPT_COMPARE ) \
173 { \
174 asm volatile ( \
175 "mfc0 $3,$12\n" \
176 "la $2,0x00000400\n" \
177 "sllv $2,$2,%0\n" \
178 "or $3,$3,$2\n" \
179 "mtc0 $3,$12\n" \
180 "nop; nop; nop\n" \
181 : \
182 : "r"(_vector_) \
183 : "$2", "$3" \
184 ); \
185 } \
186 else \
187 { \
188 CYG_WORD32 _mask_; \
189 CYG_BYTE _shift_; \
190 HAL_IO_REGISTER _maskreg_ = CYGHWR_HAL_MIPS_VRC4373_INTC_MASK0 + \
191 cyg_hal_interrupt_level[_vector_] * \
192 CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF; \
193 HAL_READ_UINT32( _maskreg_, _mask_ ); \
194 _shift_ = _vector_-CYGNUM_HAL_INTERRUPT_REALTIME_A; \
195 _mask_ |= 1<<_shift_; \
196 HAL_WRITE_UINT32( _maskreg_, _mask_ ); \
197 } \
198 CYG_MACRO_END
199
200 #define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \
201 CYG_MACRO_START \
202 CYG_WORD32 _srvector_ = _vector_; \
203 if( _vector_ > CYGNUM_HAL_INTERRUPT_COMPARE ) \
204 { \
205 CYG_WORD32 _stat_; \
206 CYG_BYTE _shift_; \
207 HAL_IO_REGISTER _statreg_ = CYGHWR_HAL_MIPS_VRC4373_INTC_STAT0 +\
208 cyg_hal_interrupt_level[_vector_] * \
209 CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF; \
210 HAL_READ_UINT32( _statreg_, _stat_ ); \
211 _shift_ = _vector_-CYGNUM_HAL_INTERRUPT_REALTIME_A; \
212 _stat_ &= ~(1<<_shift_); \
213 HAL_WRITE_UINT32( _statreg_, _stat_ ); \
214 _srvector_ = cyg_hal_interrupt_level[_vector_] + \
215 CYGNUM_HAL_INTERRUPT_IPL0; \
216 } \
217 asm volatile ( \
218 "mfc0 $3,$13\n" \
219 "la $2,0x00000400\n" \
220 "sllv $2,$2,%0\n" \
221 "nor $2,$2,$0\n" \
222 "and $3,$3,$2\n" \
223 "mtc0 $3,$13\n" \
224 "nop; nop; nop\n" \
225 : \
226 : "r"(_srvector_) \
227 : "$2", "$3" \
228 ); \
229 CYG_MACRO_END
230
231 #define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \
232 CYG_MACRO_START \
233 if( (_vector_ >= CYGNUM_HAL_INTERRUPT_REALTIME_A) && \
234 (_vector_ <= CYGNUM_HAL_INTERRUPT_INT_13)) \
235 { \
236 CYG_WORD32 mask = 1<<(_vector_-CYGNUM_HAL_INTERRUPT_REALTIME_A); \
237 CYG_WORD32 pol; \
238 CYG_WORD32 trig; \
239 HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_POL, pol ); \
240 HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_TRIG, trig ); \
241 if( _level_ ) \
242 { \
243 pol &= ~mask; \
244 if( _up_ ) trig |= mask; \
245 else trig &= ~mask; \
246 } \
247 else \
248 { \
249 pol |= mask; \
250 if( !(_up_) ) trig |= mask; \
251 else trig &= ~mask; \
252 } \
253 HAL_WRITE_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_POL, pol ); \
254 HAL_WRITE_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_TRIG, trig ); \
255 } \
256 CYG_MACRO_END
257
258 #define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \
259 CYG_MACRO_START \
260 if( _vector_ > CYGNUM_HAL_INTERRUPT_COMPARE ) \
261 { \
262 cyg_uint32 _ilevel_ = _level_; \
263 while( _ilevel_ > 2 ) _ilevel_ -= 2; \
264 cyg_hal_interrupt_level[_vector_] = _ilevel_; \
265 } \
266 CYG_MACRO_END
267
268 #define CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED
269
270 //--------------------------------------------------------------------------
271 // Control-C support.
272
273 #if defined(CYGDBG_HAL_MIPS_DEBUG_GDB_CTRLC_SUPPORT)
274
275 # define CYGHWR_HAL_GDB_PORT_VECTOR CYGNUM_HAL_INTERRUPT_DUART
276
277 externC cyg_uint32 hal_ctrlc_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data);
278
279 #define HAL_CTRLC_ISR hal_ctrlc_isr
280
281 #endif
282
283 //--------------------------------------------------------------------------
284 #endif // ifndef CYGONCE_HAL_PLF_INTR_H
285 // End of plf_intr.h