comparison packages/hal/sh/sh3/current/src/var_misc.c @ 134:d2f49caf9e38 ecos-sw-2000-11-03

Merge from eCos master repository on 2000-11-03-09:00:49-GMT
author jlarmour
date Fri, 03 Nov 2000 21:17:40 +0000
parents
children a9ac27ec7abc
comparison
equal deleted inserted replaced
133:98d71f4d8243 134:d2f49caf9e38
1 //==========================================================================
2 //
3 // var_misc.c
4 //
5 // HAL miscellaneous functions
6 //
7 //==========================================================================
8 //####COPYRIGHTBEGIN####
9 //
10 // -------------------------------------------
11 // The contents of this file are subject to the Red Hat eCos Public License
12 // Version 1.1 (the "License"); you may not use this file except in
13 // compliance with the License. You may obtain a copy of the License at
14 // http://www.redhat.com/
15 //
16 // Software distributed under the License is distributed on an "AS IS"
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
18 // License for the specific language governing rights and limitations under
19 // the License.
20 //
21 // The Original Code is eCos - Embedded Configurable Operating System,
22 // released September 30, 1998.
23 //
24 // The Initial Developer of the Original Code is Red Hat.
25 // Portions created by Red Hat are
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
27 // All Rights Reserved.
28 // -------------------------------------------
29 //
30 //####COPYRIGHTEND####
31 //==========================================================================
32 //#####DESCRIPTIONBEGIN####
33 //
34 // Author(s): jskov
35 // Contributors: jskov, jlarmour, nickg
36 // Date: 1999-04-03
37 // Purpose: HAL miscellaneous functions
38 // Description: This file contains miscellaneous functions provided by the
39 // HAL.
40 //
41 //####DESCRIPTIONEND####
42 //
43 //===========================================================================
44
45 #include <pkgconf/hal.h>
46
47 #include <cyg/infra/cyg_type.h>
48 #include <cyg/infra/cyg_trac.h> // tracing macros
49 #include <cyg/infra/cyg_ass.h> // assertion macros
50 #include <cyg/infra/diag.h> // diag_printf
51
52 #include <cyg/hal/hal_arch.h> // HAL header
53 #include <cyg/hal/hal_cache.h> // HAL cache
54 #include <cyg/hal/hal_intr.h> // HAL interrupts/exceptions
55
56 //---------------------------------------------------------------------------
57 // Initial cache enabling
58
59 #ifdef CYGHWR_HAL_SH_CACHE_MODE_P0_WRITE_BACK
60 # define CACHE_MODE_P0 0
61 #else
62 # define CACHE_MODE_P0 CYGARC_REG_CCR_WT
63 #endif
64
65 #ifdef CYGHWR_HAL_SH_CACHE_MODE_P1_WRITE_BACK
66 # define CACHE_MODE_P1 CYGARC_REG_CCR_CB
67 #else
68 # define CACHE_MODE_P1 0
69 #endif
70
71 externC void
72 cyg_var_enable_caches(void)
73 {
74 // Initialize cache.
75 HAL_UCACHE_INVALIDATE_ALL();
76
77 // Set cache modes
78 HAL_UCACHE_WRITE_MODE_SH(CACHE_MODE_P0|CACHE_MODE_P1);
79
80 #ifdef CYGHWR_HAL_SH_CACHE_ENABLE
81 // Enable cache.
82 HAL_UCACHE_ENABLE();
83 #endif
84 }
85
86 //---------------------------------------------------------------------------
87 void
88 hal_variant_init(void)
89 {
90 }
91
92 //---------------------------------------------------------------------------
93 // Interrupt function support
94
95 #ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING
96 externC cyg_uint8 cyg_hal_ILVL_table[];
97 #define HAL_UPDATE_ILVL_TABLE(_vector_, _level_) \
98 /* Update the ILVL table, so it is easy for the interrupt entry */ \
99 /* code to find out the level of a given interrupt source. */ \
100 cyg_hal_ILVL_table[(_vector_)] = (_level_)
101 #else
102 #define HAL_UPDATE_ILVL_TABLE(_vector_, _level_)
103 #endif
104
105 void
106 hal_interrupt_set_level(int vector, int level)
107 {
108 cyg_uint16 iprX;
109
110 CYG_ASSERT((0 <= (level) && 15 >= (level)), "Illegal level");
111 CYG_ASSERT((CYGNUM_HAL_ISR_MIN <= (vector)
112 && CYGNUM_HAL_ISR_MAX >= (vector)), "Illegal vector");
113
114 HAL_UPDATE_ILVL_TABLE(vector, level);
115
116 switch( (vector) ) {
117 case CYGNUM_HAL_INTERRUPT_NMI:
118 /* fall through */
119 case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14:
120 /* Cannot change levels */
121 break;
122
123 /* IPRA */
124 case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0:
125 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX);
126 iprX &= ~CYGARC_REG_IPRA_TMU0_MASK;
127 iprX |= (level)*CYGARC_REG_IPRA_TMU0_PRI1;
128 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX);
129 break;
130 case CYGNUM_HAL_INTERRUPT_TMU1_TUNI1:
131 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX);
132 iprX &= ~CYGARC_REG_IPRA_TMU1_MASK;
133 iprX |= (level)*CYGARC_REG_IPRA_TMU1_PRI1;
134 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX);
135 break;
136 case CYGNUM_HAL_INTERRUPT_TMU2_TUNI2:
137 case CYGNUM_HAL_INTERRUPT_TMU2_TICPI2:
138 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX);
139 iprX &= ~CYGARC_REG_IPRA_TMU2_MASK;
140 iprX |= (level)*CYGARC_REG_IPRA_TMU2_PRI1;
141 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX);
142 break;
143 case CYGNUM_HAL_INTERRUPT_RTC_ATI:
144 case CYGNUM_HAL_INTERRUPT_RTC_PRI:
145 case CYGNUM_HAL_INTERRUPT_RTC_CUI:
146 HAL_READ_UINT16(CYGARC_REG_IPRA, iprX);
147 iprX &= ~CYGARC_REG_IPRA_RTC_MASK;
148 iprX |= (level)*CYGARC_REG_IPRA_RTC_PRI1;
149 HAL_WRITE_UINT16(CYGARC_REG_IPRA, iprX);
150 break;
151
152 /* IPRB */
153 case CYGNUM_HAL_INTERRUPT_SCI_ERI:
154 case CYGNUM_HAL_INTERRUPT_SCI_RXI:
155 case CYGNUM_HAL_INTERRUPT_SCI_TXI:
156 case CYGNUM_HAL_INTERRUPT_SCI_TEI:
157 HAL_READ_UINT16(CYGARC_REG_IPRB, iprX);
158 iprX &= ~CYGARC_REG_IPRB_SCI_MASK;
159 iprX |= (level)*CYGARC_REG_IPRB_SCI_PRI1;
160 HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX);
161 break;
162 case CYGNUM_HAL_INTERRUPT_WDT_ITI:
163 HAL_READ_UINT16(CYGARC_REG_IPRB, iprX);
164 iprX &= ~CYGARC_REG_IPRB_WDT_MASK;
165 iprX |= (level)*CYGARC_REG_IPRB_WDT_PRI1;
166 HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX);
167 break;
168 case CYGNUM_HAL_INTERRUPT_REF_RCMI:
169 case CYGNUM_HAL_INTERRUPT_REF_ROVI:
170 HAL_READ_UINT16(CYGARC_REG_IPRB, iprX);
171 iprX &= ~CYGARC_REG_IPRB_REF_MASK;
172 iprX |= (level)*CYGARC_REG_IPRB_REF_PRI1;
173 HAL_WRITE_UINT16(CYGARC_REG_IPRB, iprX);
174 break;
175
176 #if (CYGARC_SH_MOD_INTC >= 2)
177 #ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL
178 /* IPRC */
179 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0:
180 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX);
181 iprX &= ~CYGARC_REG_IPRC_IRQ0_MASK;
182 iprX |= (level)*CYGARC_REG_IPRC_IRQ0_PRI1;
183 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX);
184 break;
185 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1:
186 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX);
187 iprX &= ~CYGARC_REG_IPRC_IRQ1_MASK;
188 iprX |= (level)*CYGARC_REG_IPRC_IRQ1_PRI1;
189 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX);
190 break;
191 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2:
192 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX);
193 iprX &= ~CYGARC_REG_IPRC_IRQ2_MASK;
194 iprX |= (level)*CYGARC_REG_IPRC_IRQ2_PRI1;
195 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX);
196 break;
197 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3:
198 HAL_READ_UINT16(CYGARC_REG_IPRC, iprX);
199 iprX &= ~CYGARC_REG_IPRC_IRQ3_MASK;
200 iprX |= (level)*CYGARC_REG_IPRC_IRQ3_PRI1;
201 HAL_WRITE_UINT16(CYGARC_REG_IPRC, iprX);
202 break;
203 #endif
204 /* IPRD */
205 case CYGNUM_HAL_INTERRUPT_PINT_PINT07:
206 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX);
207 iprX &= ~CYGARC_REG_IPRD_PINT07_MASK;
208 iprX |= (level)*CYGARC_REG_IPRD_PINT07_PRI1;
209 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX);
210 break;
211 case CYGNUM_HAL_INTERRUPT_PINT_PINT8F:
212 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX);
213 iprX &= ~CYGARC_REG_IPRD_PINT8F_MASK;
214 iprX |= (level)*CYGARC_REG_IPRD_PINT8F_PRI1;
215 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX);
216 break;
217 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5:
218 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX);
219 iprX &= ~CYGARC_REG_IPRD_IRQ5_MASK;
220 iprX |= (level)*CYGARC_REG_IPRD_IRQ5_PRI1;
221 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX);
222 break;
223 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4:
224 HAL_READ_UINT16(CYGARC_REG_IPRD, iprX);
225 iprX &= ~CYGARC_REG_IPRD_IRQ4_MASK;
226 iprX |= (level)*CYGARC_REG_IPRD_IRQ4_PRI1;
227 HAL_WRITE_UINT16(CYGARC_REG_IPRD, iprX);
228 break;
229
230 /* IPRE */
231 case CYGNUM_HAL_INTERRUPT_DMAC_DEI0:
232 case CYGNUM_HAL_INTERRUPT_DMAC_DEI1:
233 case CYGNUM_HAL_INTERRUPT_DMAC_DEI2:
234 case CYGNUM_HAL_INTERRUPT_DMAC_DEI3:
235 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX);
236 iprX &= ~CYGARC_REG_IPRE_DMAC_MASK;
237 iprX |= (level)*CYGARC_REG_IPRE_DMAC_PRI1;
238 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX);
239 break;
240 case CYGNUM_HAL_INTERRUPT_IRDA_ERI1:
241 case CYGNUM_HAL_INTERRUPT_IRDA_RXI1:
242 case CYGNUM_HAL_INTERRUPT_IRDA_BRI1:
243 case CYGNUM_HAL_INTERRUPT_IRDA_TXI1:
244 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX);
245 iprX &= ~CYGARC_REG_IPRE_IRDA_MASK;
246 iprX |= (level)*CYGARC_REG_IPRE_IRDA_PRI1;
247 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX);
248 break;
249 case CYGNUM_HAL_INTERRUPT_SCIF_ERI2:
250 case CYGNUM_HAL_INTERRUPT_SCIF_RXI2:
251 case CYGNUM_HAL_INTERRUPT_SCIF_BRI2:
252 case CYGNUM_HAL_INTERRUPT_SCIF_TXI2:
253 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX);
254 iprX &= ~CYGARC_REG_IPRE_SCIF_MASK;
255 iprX |= (level)*CYGARC_REG_IPRE_SCIF_PRI1;
256 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX);
257 break;
258 case CYGNUM_HAL_INTERRUPT_ADC_ADI:
259 HAL_READ_UINT16(CYGARC_REG_IPRE, iprX);
260 iprX &= ~CYGARC_REG_IPRE_ADC_MASK;
261 iprX |= (level)*CYGARC_REG_IPRE_ADC_PRI1;
262 HAL_WRITE_UINT16(CYGARC_REG_IPRE, iprX);
263 break;
264 #endif // (CYGARC_SH_MOD_INTC >= 2)
265
266 #if (CYGARC_SH_MOD_INTC >= 3)
267 /* IPRF */
268 case CYGNUM_HAL_INTERRUPT_LCDC_LCDI:
269 HAL_READ_UINT16(CYGARC_REG_IPRF, iprX);
270 iprX &= ~CYGARC_REG_IPRF_LCDI_MASK;
271 iprX |= (level)*CYGARC_REG_IPRF_LCDI_PRI1;
272 HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX);
273 break;
274 case CYGNUM_HAL_INTERRUPT_PCC_PCC0:
275 HAL_READ_UINT16(CYGARC_REG_IPRF, iprX);
276 iprX &= ~CYGARC_REG_IPRF_PCC0_MASK;
277 iprX |= (level)*CYGARC_REG_IPRF_PCC0_PRI1;
278 HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX);
279 break;
280 case CYGNUM_HAL_INTERRUPT_PCC_PCC1:
281 HAL_READ_UINT16(CYGARC_REG_IPRF, iprX);
282 iprX &= ~CYGARC_REG_IPRF_PCC1_MASK;
283 iprX |= (level)*CYGARC_REG_IPRF_PCC1_PRI1;
284 HAL_WRITE_UINT16(CYGARC_REG_IPRF, iprX);
285 break;
286 #endif // (CYGARC_SH_MOD_INTC >= 3)
287
288 case CYGNUM_HAL_INTERRUPT_RESERVED_1E0:
289 case CYGNUM_HAL_INTERRUPT_RESERVED_3E0:
290 /* Do nothing for these reserved vectors. */
291 break;
292
293 default:
294 CYG_FAIL("Unknown interrupt vector");
295 break;
296 }
297 }
298
299 void
300 hal_interrupt_mask(int vector)
301 {
302 switch( (vector) ) {
303 case CYGNUM_HAL_INTERRUPT_NMI:
304 /* fall through */
305 case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14:
306 /* Can only be masked by fiddling Imask in SR. */
307 break;
308 case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX:
309 HAL_INTERRUPT_SET_LEVEL((vector), 0);
310 break;
311 case CYGNUM_HAL_INTERRUPT_RESERVED_1E0:
312 case CYGNUM_HAL_INTERRUPT_RESERVED_3E0:
313 /* Do nothing for these reserved vectors. */
314 break;
315 default:
316 CYG_FAIL("Unknown interrupt vector");
317 break;
318 }
319 }
320
321 void
322 hal_interrupt_unmask(int vector)
323 {
324 switch( (vector) ) {
325 case CYGNUM_HAL_INTERRUPT_NMI:
326 /* fall through */
327 case CYGNUM_HAL_INTERRUPT_LVL0...CYGNUM_HAL_INTERRUPT_LVL14:
328 /* Can only be unmasked by fiddling Imask in SR. */
329 break;
330 case CYGNUM_HAL_INTERRUPT_TMU0_TUNI0...CYGNUM_HAL_ISR_MAX:
331 HAL_INTERRUPT_SET_LEVEL((vector), 1);
332 break;
333 case CYGNUM_HAL_INTERRUPT_RESERVED_1E0:
334 case CYGNUM_HAL_INTERRUPT_RESERVED_3E0:
335 /* Do nothing for these reserved vectors. */
336 break;
337 default:
338 CYG_FAIL("Unknown interrupt vector");
339 break;
340 }
341 }
342
343 void
344 hal_interrupt_acknowledge(int vector)
345 {
346 #if (CYGARC_SH_MOD_INTC >= 2)
347 if ( (vector) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0
348 && (vector) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) {
349
350 cyg_uint8 irr0;
351
352 HAL_READ_UINT8(CYGARC_REG_IRR0, irr0);
353 switch ( vector ) {
354 #ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL
355 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0:
356 irr0 &= ~CYGARC_REG_IRR0_IRQ0;
357 break;
358 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1:
359 irr0 &= ~CYGARC_REG_IRR0_IRQ1;
360 break;
361 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2:
362 irr0 &= ~CYGARC_REG_IRR0_IRQ2;
363 break;
364 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3:
365 irr0 &= ~CYGARC_REG_IRR0_IRQ3;
366 break;
367 #endif
368 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4:
369 irr0 &= ~CYGARC_REG_IRR0_IRQ4;
370 break;
371 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5:
372 irr0 &= ~CYGARC_REG_IRR0_IRQ5;
373 break;
374 default:
375 CYG_FAIL("Unhandled interrupt vector");
376 }
377 HAL_WRITE_UINT8(CYGARC_REG_IRR0, irr0);
378 }
379 #endif
380 }
381
382 // Note: The PINTs can be masked and configured individually, even
383 // though there are only two vectors. Maybe add some fake vectors just
384 // for masking/configuring?
385 void
386 hal_interrupt_configure(int vector, int level, int up)
387 {
388 #if (CYGARC_SH_MOD_INTC >= 2)
389 if ( (vector) >= CYGNUM_HAL_INTERRUPT_IRQ_IRQ0
390 && (vector) <= CYGNUM_HAL_INTERRUPT_IRQ_IRQ5) {
391
392 cyg_uint16 icr1, ss, mask;
393 ss = 0;
394 mask = CYGARC_REG_ICR1_SENSE_UP|CYGARC_REG_ICR1_SENSE_LEVEL;
395 if (up) ss |= CYGARC_REG_ICR1_SENSE_UP;
396 if (level) ss |= CYGARC_REG_ICR1_SENSE_LEVEL;
397 CYG_ASSERT(!(up && level), "Cannot trigger on high level!");
398
399 switch( (vector) ) {
400 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ5:
401 ss <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift;
402 mask <<= CYGARC_REG_ICR1_SENSE_IRQ5_shift;
403 break;
404 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ4:
405 ss <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift;
406 mask <<= CYGARC_REG_ICR1_SENSE_IRQ4_shift;
407 break;
408 #ifndef CYGHWR_HAL_SH_IRQ_USE_IRQLVL
409 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ3:
410 ss <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift;
411 mask <<= CYGARC_REG_ICR1_SENSE_IRQ3_shift;
412 break;
413 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ2:
414 ss <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift;
415 mask <<= CYGARC_REG_ICR1_SENSE_IRQ2_shift;
416 break;
417 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ1:
418 ss <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift;
419 mask <<= CYGARC_REG_ICR1_SENSE_IRQ1_shift;
420 break;
421 case CYGNUM_HAL_INTERRUPT_IRQ_IRQ0:
422 ss <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift;
423 mask <<= CYGARC_REG_ICR1_SENSE_IRQ0_shift;
424 break;
425 #endif
426 default:
427 CYG_FAIL("Unhandled interrupt vector");
428 }
429
430 HAL_READ_UINT16(CYGARC_REG_ICR1, icr1);
431 icr1 &= ~mask;
432 icr1 |= ss;
433 HAL_WRITE_UINT16(CYGARC_REG_ICR1, icr1);
434 }
435 #endif
436 }
437
438 //---------------------------------------------------------------------------
439 // End of hal_misc.c