comparison packages/hal/mn10300/arch/current/include/hal_intr.h @ 30:641b639be825 ecos-sw-1999-08-16

Merge from eCos master repository on 1999-08-16-22:01:37-BST
author jlarmour
date Mon, 16 Aug 1999 22:10:49 +0000
parents ece80412419a
children 3836136e7743
comparison
equal deleted inserted replaced
29:093762bd6ba9 30:641b639be825
44 // 44 //
45 //####DESCRIPTIONEND#### 45 //####DESCRIPTIONEND####
46 // 46 //
47 //========================================================================== 47 //==========================================================================
48 48
49 #include <pkgconf/hal.h>
50
49 #include <cyg/infra/cyg_type.h> 51 #include <cyg/infra/cyg_type.h>
50 52 #include <cyg/hal/hal_io.h>
51 #include <pkgconf/hal.h> 53
52 54 #include <cyg/hal/var_intr.h>
53 //--------------------------------------------------------------------------
54
55 // The MN10300 has a somewhat complex interrupt structure. Besides the
56 // reset and NMI vectors there are seven maskable interrupt vectors
57 // which must point to code in the 64k starting at 0x40000000. There
58 // are also 25 Interrupt control groups, each of which can have 4
59 // interrupt lines attached, for a theoretical total of 100 interrupts
60 // (!). Some of these are dedicated to specific devices, other to
61 // external pins, and others are not connected to anything, resulting
62 // in only 45 that can actually be delivered. Each control group may
63 // be assigned one of seven interrupt levels, and is delivered to the
64 // corresponding vector. Software can then use a register to determine
65 // the delivering group and detect from there which interrupt has been
66 // delivered.
67 //
68 // The approach we will adopt at present is for the code attached to
69 // each vector to save state and jump via a table to a VSR. The
70 // default VSR will fully decode the delivered interrupt into a table
71 // of isr/data/object entries. VSR replacement will operate on the
72 // first level indirection table rather than the hardware
73 // vectors. This is the fastest mechanism, however it needs 100*3*4 +
74 // 7*4 = 1228 bytes for the tables.
75 //
76
77 //--------------------------------------------------------------------------
78 // Interrupt vectors.
79
80 // The level-specific hardware vectors
81 // These correspond to VSRs and are the values to use for HAL_VSR_GET/SET
82 #define CYGNUM_HAL_VECTOR_0 0
83 #define CYGNUM_HAL_VECTOR_1 1
84 #define CYGNUM_HAL_VECTOR_2 2
85 #define CYGNUM_HAL_VECTOR_3 3
86 #define CYGNUM_HAL_VECTOR_4 4
87 #define CYGNUM_HAL_VECTOR_5 5
88 #define CYGNUM_HAL_VECTOR_6 6
89 #define CYGNUM_HAL_VECTOR_NMI 7
90 #define CYGNUM_HAL_VECTOR_TRAP 8
91
92 #define CYGNUM_HAL_VSR_MIN 0
93 #define CYGNUM_HAL_VSR_MAX 8
94 #define CYGNUM_HAL_VSR_COUNT 9
95
96 // Exception vectors. These are the values used when passed out to an
97 // external exception handler using cyg_hal_deliver_exception()
98
99 #define CYGNUM_HAL_EXCEPTION_NMI 0
100 #define CYGNUM_HAL_EXCEPTION_DATA_ACCESS \
101 CYGNUM_HAL_INTERRUPT_SYSTEM_ERROR
102 #define CYGNUM_HAL_EXCEPTION_TRAP 3
103
104 #define CYGNUM_HAL_EXCEPTION_MIN 0
105 #define CYGNUM_HAL_EXCEPTION_MAX 3
106 #define CYGNUM_HAL_EXCEPTION_COUNT 4
107
108
109 #if defined(CYG_HAL_MN10300_MN103000)
110
111 // The decoded interrupts
112
113 #define CYGNUM_HAL_INTERRUPT_NMIRQ 0
114 #define CYGNUM_HAL_INTERRUPT_WATCHDOG 1
115 #define CYGNUM_HAL_INTERRUPT_SYSTEM_ERROR 2
116 #define CYGNUM_HAL_INTERRUPT_RESERVED_3 3
117
118 #define CYGNUM_HAL_INTERRUPT_RESERVED_4 4
119 #define CYGNUM_HAL_INTERRUPT_RESERVED_5 5
120 #define CYGNUM_HAL_INTERRUPT_RESERVED_6 6
121 #define CYGNUM_HAL_INTERRUPT_RESERVED_7 7
122
123 #define CYGNUM_HAL_INTERRUPT_TIMER_0 8
124 #define CYGNUM_HAL_INTERRUPT_TIMER_1 9
125 #define CYGNUM_HAL_INTERRUPT_TIMER_2 10
126 #define CYGNUM_HAL_INTERRUPT_TIMER_3 11
127
128 #define CYGNUM_HAL_INTERRUPT_TIMER_4 12
129 #define CYGNUM_HAL_INTERRUPT_TIMER_5 13
130 #define CYGNUM_HAL_INTERRUPT_TIMER_6 14
131 #define CYGNUM_HAL_INTERRUPT_TIMER_7 15
132
133 #define CYGNUM_HAL_INTERRUPT_TIMER_8 16
134 #define CYGNUM_HAL_INTERRUPT_TIMER_8_COMPARE_A 17
135 #define CYGNUM_HAL_INTERRUPT_TIMER_8_COMPARE_B 18
136 #define CYGNUM_HAL_INTERRUPT_RESERVED_19 19
137
138 #define CYGNUM_HAL_INTERRUPT_TIMER_9 20
139 #define CYGNUM_HAL_INTERRUPT_TIMER_9_COMPARE_A 21
140 #define CYGNUM_HAL_INTERRUPT_TIMER_9_COMPARE_B 22
141 #define CYGNUM_HAL_INTERRUPT_RESERVED_23 23
142
143 #define CYGNUM_HAL_INTERRUPT_TIMER_10 24
144 #define CYGNUM_HAL_INTERRUPT_TIMER_10_COMPARE_A 25
145 #define CYGNUM_HAL_INTERRUPT_TIMER_10_COMPARE_B 26
146 #define CYGNUM_HAL_INTERRUPT_TIMER_10_COMPARE_C 27
147
148 #define CYGNUM_HAL_INTERRUPT_TIMER_11 28
149 #define CYGNUM_HAL_INTERRUPT_TIMER_11_COMPARE_A 29
150 #define CYGNUM_HAL_INTERRUPT_TIMER_11_COMPARE_B 30
151 #define CYGNUM_HAL_INTERRUPT_TIMER_11_COMPARE_C 31
152
153 #define CYGNUM_HAL_INTERRUPT_TIMER_12 32
154 #define CYGNUM_HAL_INTERRUPT_TIMER_12_COMPARE_A 33
155 #define CYGNUM_HAL_INTERRUPT_TIMER_12_COMPARE_B 34
156 #define CYGNUM_HAL_INTERRUPT_TIMER_12_COMPARE_C 35
157
158 #define CYGNUM_HAL_INTERRUPT_TIMER_11_COMPARE_D 36
159 #define CYGNUM_HAL_INTERRUPT_TIMER_12_COMPARE_D 37
160 #define CYGNUM_HAL_INTERRUPT_RESERVED_38 38
161 #define CYGNUM_HAL_INTERRUPT_RESERVED_39 39
162
163 #define CYGNUM_HAL_INTERRUPT_DMA0 40
164 #define CYGNUM_HAL_INTERRUPT_RESERVED_41 41
165 #define CYGNUM_HAL_INTERRUPT_RESERVED_42 42
166 #define CYGNUM_HAL_INTERRUPT_RESERVED_43 43
167
168 #define CYGNUM_HAL_INTERRUPT_DMA1 44
169 #define CYGNUM_HAL_INTERRUPT_RESERVED_45 45
170 #define CYGNUM_HAL_INTERRUPT_RESERVED_46 46
171 #define CYGNUM_HAL_INTERRUPT_RESERVED_47 47
172
173 #define CYGNUM_HAL_INTERRUPT_DMA2 48
174 #define CYGNUM_HAL_INTERRUPT_RESERVED_49 49
175 #define CYGNUM_HAL_INTERRUPT_RESERVED_50 50
176 #define CYGNUM_HAL_INTERRUPT_RESERVED_51 51
177
178 #define CYGNUM_HAL_INTERRUPT_DMA3 52
179 #define CYGNUM_HAL_INTERRUPT_RESERVED_53 53
180 #define CYGNUM_HAL_INTERRUPT_RESERVED_54 54
181 #define CYGNUM_HAL_INTERRUPT_RESERVED_55 55
182
183 #define CYGNUM_HAL_INTERRUPT_SERIAL_0_RX 56
184 #define CYGNUM_HAL_INTERRUPT_SERIAL_0_TX 57
185 #define CYGNUM_HAL_INTERRUPT_RESERVED_58 58
186 #define CYGNUM_HAL_INTERRUPT_RESERVED_59 59
187
188 #define CYGNUM_HAL_INTERRUPT_SERIAL_1_RX 60
189 #define CYGNUM_HAL_INTERRUPT_SERIAL_1_TX 61
190 #define CYGNUM_HAL_INTERRUPT_RESERVED_62 62
191 #define CYGNUM_HAL_INTERRUPT_RESERVED_63 63
192
193 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_0 64
194 #define CYGNUM_HAL_INTERRUPT_RESERVED_65 65
195 #define CYGNUM_HAL_INTERRUPT_RESERVED_66 66
196 #define CYGNUM_HAL_INTERRUPT_RESERVED_67 67
197
198 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_1 68
199 #define CYGNUM_HAL_INTERRUPT_RESERVED_69 69
200 #define CYGNUM_HAL_INTERRUPT_RESERVED_70 70
201 #define CYGNUM_HAL_INTERRUPT_RESERVED_71 71
202
203 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_2 72
204 #define CYGNUM_HAL_INTERRUPT_RESERVED_73 73
205 #define CYGNUM_HAL_INTERRUPT_RESERVED_74 74
206 #define CYGNUM_HAL_INTERRUPT_RESERVED_75 75
207
208 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_3 76
209 #define CYGNUM_HAL_INTERRUPT_RESERVED_77 77
210 #define CYGNUM_HAL_INTERRUPT_RESERVED_78 78
211 #define CYGNUM_HAL_INTERRUPT_RESERVED_79 79
212
213 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_4 80
214 #define CYGNUM_HAL_INTERRUPT_RESERVED_81 81
215 #define CYGNUM_HAL_INTERRUPT_RESERVED_82 82
216 #define CYGNUM_HAL_INTERRUPT_RESERVED_83 83
217
218 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_5 84
219 #define CYGNUM_HAL_INTERRUPT_RESERVED_85 85
220 #define CYGNUM_HAL_INTERRUPT_RESERVED_86 86
221 #define CYGNUM_HAL_INTERRUPT_RESERVED_87 87
222
223 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_6 88
224 #define CYGNUM_HAL_INTERRUPT_RESERVED_89 89
225 #define CYGNUM_HAL_INTERRUPT_RESERVED_90 90
226 #define CYGNUM_HAL_INTERRUPT_RESERVED_91 91
227
228 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_7 92
229 #define CYGNUM_HAL_INTERRUPT_RESERVED_93 93
230 #define CYGNUM_HAL_INTERRUPT_RESERVED_94 94
231 #define CYGNUM_HAL_INTERRUPT_RESERVED_95 95
232
233 #define CYGNUM_HAL_INTERRUPT_AD_CONVERSION 96
234 #define CYGNUM_HAL_INTERRUPT_RESERVED_97 97
235 #define CYGNUM_HAL_INTERRUPT_RESERVED_98 98
236 #define CYGNUM_HAL_INTERRUPT_RESERVED_99 99
237
238 #define CYGNUM_HAL_ISR_MIN 0
239 #define CYGNUM_HAL_ISR_MAX 99
240
241 #define CYGNUM_HAL_ISR_COUNT 100
242
243 #elif defined(CYG_HAL_MN10300_MN103002)
244
245 // The decoded interrupts
246
247 #define CYGNUM_HAL_INTERRUPT_NMIRQ 0
248 #define CYGNUM_HAL_INTERRUPT_WATCHDOG 1
249 #define CYGNUM_HAL_INTERRUPT_SYSTEM_ERROR 2
250 #define CYGNUM_HAL_INTERRUPT_RESERVED_3 3
251
252 #define CYGNUM_HAL_INTERRUPT_RESERVED_4 4
253 #define CYGNUM_HAL_INTERRUPT_RESERVED_5 5
254 #define CYGNUM_HAL_INTERRUPT_RESERVED_6 6
255 #define CYGNUM_HAL_INTERRUPT_RESERVED_7 7
256
257 #define CYGNUM_HAL_INTERRUPT_TIMER_0 8
258 #define CYGNUM_HAL_INTERRUPT_RESERVED_9 9
259 #define CYGNUM_HAL_INTERRUPT_RESERVED_10 10
260 #define CYGNUM_HAL_INTERRUPT_RESERVED_11 11
261
262 #define CYGNUM_HAL_INTERRUPT_TIMER_1 12
263 #define CYGNUM_HAL_INTERRUPT_RESERVED_13 13
264 #define CYGNUM_HAL_INTERRUPT_RESERVED_14 14
265 #define CYGNUM_HAL_INTERRUPT_RESERVED_15 15
266
267 #define CYGNUM_HAL_INTERRUPT_TIMER_2 16
268 #define CYGNUM_HAL_INTERRUPT_RESERVED_17 17
269 #define CYGNUM_HAL_INTERRUPT_RESERVED_18 18
270 #define CYGNUM_HAL_INTERRUPT_RESERVED_19 19
271
272 #define CYGNUM_HAL_INTERRUPT_TIMER_3 20
273 #define CYGNUM_HAL_INTERRUPT_RESERVED_21 21
274 #define CYGNUM_HAL_INTERRUPT_RESERVED_22 22
275 #define CYGNUM_HAL_INTERRUPT_RESERVED_23 23
276
277 #define CYGNUM_HAL_INTERRUPT_TIMER_4 24
278 #define CYGNUM_HAL_INTERRUPT_RESERVED_25 25
279 #define CYGNUM_HAL_INTERRUPT_RESERVED_26 26
280 #define CYGNUM_HAL_INTERRUPT_RESERVED_27 27
281
282 #define CYGNUM_HAL_INTERRUPT_TIMER_5 28
283 #define CYGNUM_HAL_INTERRUPT_RESERVED_29 29
284 #define CYGNUM_HAL_INTERRUPT_RESERVED_30 30
285 #define CYGNUM_HAL_INTERRUPT_RESERVED_31 31
286
287 #define CYGNUM_HAL_INTERRUPT_TIMER_6 32
288 #define CYGNUM_HAL_INTERRUPT_RESERVED_33 33
289 #define CYGNUM_HAL_INTERRUPT_RESERVED_34 34
290 #define CYGNUM_HAL_INTERRUPT_RESERVED_35 35
291
292 #define CYGNUM_HAL_INTERRUPT_TIMER_6_COMPARE_A 36
293 #define CYGNUM_HAL_INTERRUPT_RESERVED_37 37
294 #define CYGNUM_HAL_INTERRUPT_RESERVED_38 38
295 #define CYGNUM_HAL_INTERRUPT_RESERVED_39 39
296
297 #define CYGNUM_HAL_INTERRUPT_TIMER_6_COMPARE_B 40
298 #define CYGNUM_HAL_INTERRUPT_RESERVED_41 41
299 #define CYGNUM_HAL_INTERRUPT_RESERVED_42 42
300 #define CYGNUM_HAL_INTERRUPT_RESERVED_43 43
301
302 #define CYGNUM_HAL_INTERRUPT_RESERVED_44 44
303 #define CYGNUM_HAL_INTERRUPT_RESERVED_45 45
304 #define CYGNUM_HAL_INTERRUPT_RESERVED_46 46
305 #define CYGNUM_HAL_INTERRUPT_RESERVED_47 47
306
307 #define CYGNUM_HAL_INTERRUPT_DMA0 48
308 #define CYGNUM_HAL_INTERRUPT_RESERVED_49 49
309 #define CYGNUM_HAL_INTERRUPT_RESERVED_50 50
310 #define CYGNUM_HAL_INTERRUPT_RESERVED_51 51
311
312 #define CYGNUM_HAL_INTERRUPT_DMA1 52
313 #define CYGNUM_HAL_INTERRUPT_RESERVED_53 53
314 #define CYGNUM_HAL_INTERRUPT_RESERVED_54 54
315 #define CYGNUM_HAL_INTERRUPT_RESERVED_55 55
316
317 #define CYGNUM_HAL_INTERRUPT_DMA2 56
318 #define CYGNUM_HAL_INTERRUPT_RESERVED_57 57
319 #define CYGNUM_HAL_INTERRUPT_RESERVED_58 58
320 #define CYGNUM_HAL_INTERRUPT_RESERVED_59 59
321
322 #define CYGNUM_HAL_INTERRUPT_DMA3 60
323 #define CYGNUM_HAL_INTERRUPT_RESERVED_61 61
324 #define CYGNUM_HAL_INTERRUPT_RESERVED_62 62
325 #define CYGNUM_HAL_INTERRUPT_RESERVED_63 63
326
327 #define CYGNUM_HAL_INTERRUPT_SERIAL_0_RX 64
328 #define CYGNUM_HAL_INTERRUPT_RESERVED_65 65
329 #define CYGNUM_HAL_INTERRUPT_RESERVED_66 66
330 #define CYGNUM_HAL_INTERRUPT_RESERVED_67 67
331
332 #define CYGNUM_HAL_INTERRUPT_SERIAL_0_TX 68
333 #define CYGNUM_HAL_INTERRUPT_RESERVED_69 69
334 #define CYGNUM_HAL_INTERRUPT_RESERVED_70 70
335 #define CYGNUM_HAL_INTERRUPT_RESERVED_71 71
336
337 #define CYGNUM_HAL_INTERRUPT_SERIAL_1_RX 72
338 #define CYGNUM_HAL_INTERRUPT_RESERVED_73 73
339 #define CYGNUM_HAL_INTERRUPT_RESERVED_74 74
340 #define CYGNUM_HAL_INTERRUPT_RESERVED_75 75
341
342 #define CYGNUM_HAL_INTERRUPT_SERIAL_1_TX 76
343 #define CYGNUM_HAL_INTERRUPT_RESERVED_77 77
344 #define CYGNUM_HAL_INTERRUPT_RESERVED_78 78
345 #define CYGNUM_HAL_INTERRUPT_RESERVED_79 79
346
347 #define CYGNUM_HAL_INTERRUPT_SERIAL_2_RX 80
348 #define CYGNUM_HAL_INTERRUPT_RESERVED_81 81
349 #define CYGNUM_HAL_INTERRUPT_RESERVED_82 82
350 #define CYGNUM_HAL_INTERRUPT_RESERVED_83 83
351
352 #define CYGNUM_HAL_INTERRUPT_SERIAL_2_TX 84
353 #define CYGNUM_HAL_INTERRUPT_RESERVED_85 85
354 #define CYGNUM_HAL_INTERRUPT_RESERVED_86 86
355 #define CYGNUM_HAL_INTERRUPT_RESERVED_87 87
356
357 #define CYGNUM_HAL_INTERRUPT_RESERVED_88 88
358 #define CYGNUM_HAL_INTERRUPT_RESERVED_89 89
359 #define CYGNUM_HAL_INTERRUPT_RESERVED_90 90
360 #define CYGNUM_HAL_INTERRUPT_RESERVED_91 91
361
362 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_0 92
363 #define CYGNUM_HAL_INTERRUPT_RESERVED_93 93
364 #define CYGNUM_HAL_INTERRUPT_RESERVED_94 94
365 #define CYGNUM_HAL_INTERRUPT_RESERVED_95 95
366
367 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_1 96
368 #define CYGNUM_HAL_INTERRUPT_RESERVED_97 97
369 #define CYGNUM_HAL_INTERRUPT_RESERVED_98 98
370 #define CYGNUM_HAL_INTERRUPT_RESERVED_99 99
371
372 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_2 100
373 #define CYGNUM_HAL_INTERRUPT_RESERVED_101 101
374 #define CYGNUM_HAL_INTERRUPT_RESERVED_102 102
375 #define CYGNUM_HAL_INTERRUPT_RESERVED_103 103
376
377 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_3 104
378 #define CYGNUM_HAL_INTERRUPT_RESERVED_105 105
379 #define CYGNUM_HAL_INTERRUPT_RESERVED_106 106
380 #define CYGNUM_HAL_INTERRUPT_RESERVED_107 107
381
382 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_4 108
383 #define CYGNUM_HAL_INTERRUPT_RESERVED_109 109
384 #define CYGNUM_HAL_INTERRUPT_RESERVED_110 110
385 #define CYGNUM_HAL_INTERRUPT_RESERVED_111 111
386
387 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_5 112
388 #define CYGNUM_HAL_INTERRUPT_RESERVED_113 113
389 #define CYGNUM_HAL_INTERRUPT_RESERVED_114 114
390 #define CYGNUM_HAL_INTERRUPT_RESERVED_115 115
391
392 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_6 116
393 #define CYGNUM_HAL_INTERRUPT_RESERVED_117 117
394 #define CYGNUM_HAL_INTERRUPT_RESERVED_118 118
395 #define CYGNUM_HAL_INTERRUPT_RESERVED_119 119
396
397 #define CYGNUM_HAL_INTERRUPT_EXTERNAL_7 120
398 #define CYGNUM_HAL_INTERRUPT_RESERVED_121 121
399 #define CYGNUM_HAL_INTERRUPT_RESERVED_122 122
400 #define CYGNUM_HAL_INTERRUPT_RESERVED_123 123
401
402 #define CYGNUM_HAL_ISR_MIN 0
403 #define CYGNUM_HAL_ISR_MAX 123
404
405 #define CYGNUM_HAL_ISR_COUNT (3+((CYGNUM_HAL_ISR_MAX+1)/4))
406
407 #endif
408
409 // The vector used by the Real time clock
410
411 #ifdef CYG_HAL_MN10300_SIM
412 # define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER_5
413 //# define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_EXTERNAL_1
414 #else
415 # ifdef CYG_HAL_MN10300_MN103000
416 # define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER_8
417 # endif
418 # ifdef CYG_HAL_MN10300_MN103002
419 # define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER_5
420 # endif
421 #endif
422
423 //--------------------------------------------------------------------------
424 // Timer control registers.
425
426 // On simulator we use simulated external interrupt
427
428 #if defined(CYG_HAL_MN10300_MN103002)
429
430 // On the mn103002 we use timers 4 and 5
431
432 #define TIMER4_CR 0x340010a0
433 #define TIMER4_BR 0x34001090
434 #define TIMER4_MD 0x34001080
435
436 #define TIMER5_CR 0x340010a2
437 #define TIMER5_BR 0x34001092
438 #define TIMER5_MD 0x34001082
439
440 #define TIMER_CR TIMER5_CR
441 #define TIMER_BR TIMER5_BR
442 #define TIMER_MD TIMER5_MD
443
444 #define TIMER0_MD 0x34001000
445 #define TIMER0_BR 0x34001010
446 #define TIMER0_CR 0x34001020
447
448 #elif defined(CYG_HAL_MN10300_MN103000)
449
450 // on the mn103000 we use timers 4 and 5
451 #define TIMER4_CR 0x340010a0
452 #define TIMER4_BR 0x34001090
453 #define TIMER4_MD 0x34001080
454
455 #define TIMER5_CR 0x340010a2
456 #define TIMER5_BR 0x34001092
457 #define TIMER5_MD 0x34001082
458
459 #define TIMER_CR TIMER5_CR
460 #define TIMER_BR TIMER5_BR
461 #define TIMER_MD TIMER5_MD
462
463 #define TIMER0_MD 0x34001000
464 #define TIMER0_BR 0x34001010
465 #define TIMER0_CR 0x34001020
466
467 #endif
468 55
469 //-------------------------------------------------------------------------- 56 //--------------------------------------------------------------------------
470 // Static data used by HAL 57 // Static data used by HAL
471 58
472 // ISR tables 59 // ISR tables
476 63
477 // VSR table 64 // VSR table
478 externC volatile CYG_ADDRESS hal_vsr_table[CYGNUM_HAL_VSR_COUNT]; 65 externC volatile CYG_ADDRESS hal_vsr_table[CYGNUM_HAL_VSR_COUNT];
479 66
480 // MN10300 interrupt control registers, mapped by linker script. 67 // MN10300 interrupt control registers, mapped by linker script.
481 externC volatile cyg_uint16 mn10300_interrupt_control[0x300/2]; 68 externC volatile cyg_uint16 mn10300_interrupt_control[];
69
70 //--------------------------------------------------------------------------
71 // Default ISR
72 // The #define is used to test whether this routine exists, and to allow
73 // us to call it.
74
75 externC cyg_uint32 hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data);
76
77 #define HAL_DEFAULT_ISR hal_default_isr
482 78
483 //-------------------------------------------------------------------------- 79 //--------------------------------------------------------------------------
484 // Interrupt state storage 80 // Interrupt state storage
485 81
486 typedef cyg_uint32 CYG_INTERRUPT_STATE; 82 typedef cyg_uint32 CYG_INTERRUPT_STATE;
487 83
488 //-------------------------------------------------------------------------- 84 //--------------------------------------------------------------------------
85
489 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK 86 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
87
88 // Routine to execute DSRs using separate interrupt stack
89 externC void hal_interrupt_stack_call_pending_DSRs(void);
90 #define HAL_INTERRUPT_STACK_CALL_PENDING_DSRS() \
91 hal_interrupt_stack_call_pending_DSRs()
490 92
491 // these are offered solely for stack usage testing 93 // these are offered solely for stack usage testing
492 // if they are not defined, then there is no interrupt stack. 94 // if they are not defined, then there is no interrupt stack.
493 #define HAL_INTERRUPT_STACK_BASE cyg_interrupt_stack_base 95 #define HAL_INTERRUPT_STACK_BASE cyg_interrupt_stack_base
494 #define HAL_INTERRUPT_STACK_TOP cyg_interrupt_stack 96 #define HAL_INTERRUPT_STACK_TOP cyg_interrupt_stack
495 // use them to declare these extern however you want: 97 // use them to declare these extern however you want:
496 // extern char HAL_INTERRUPT_STACK_BASE[]; 98 // extern char HAL_INTERRUPT_STACK_BASE[];
497 // extern char HAL_INTERRUPT_STACK_TOP[]; 99 // extern char HAL_INTERRUPT_STACK_TOP[];
498 // is recommended 100 // is recommended
101
499 #endif 102 #endif
500 103
501 //-------------------------------------------------------------------------- 104 //--------------------------------------------------------------------------
502 // Interrupt control macros 105 // Interrupt control macros
503 106
546 // level. On the MN103000 there are several interrupts per controller, 149 // level. On the MN103000 there are several interrupts per controller,
547 // so we have to decode to one of 100 vectors. On the MN103002 there is 150 // so we have to decode to one of 100 vectors. On the MN103002 there is
548 // only one interrupt per controller, so we can have just one ISR per 151 // only one interrupt per controller, so we can have just one ISR per
549 // controller, except for the NMI vectors which occupy the first 3 slots. 152 // controller, except for the NMI vectors which occupy the first 3 slots.
550 153
551 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN 154 #ifndef HAL_TRANSLATE_VECTOR
155
156 #if defined(CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN)
552 157
553 #define HAL_TRANSLATE_VECTOR(_vector_,_index_) \ 158 #define HAL_TRANSLATE_VECTOR(_vector_,_index_) \
554 { \ 159 { \
555 if( _vector_ <= CYGNUM_HAL_INTERRUPT_SYSTEM_ERROR ) \ 160 if( _vector_ <= CYGNUM_HAL_INTERRUPT_SYSTEM_ERROR ) \
556 (_index_) = (_vector_); \ 161 (_index_) = (_vector_); \
567 } \ 172 } \
568 } 173 }
569 174
570 #else 175 #else
571 176
572 #if defined(CYG_HAL_MN10300_MN103000)
573
574 #define HAL_TRANSLATE_VECTOR(_vector_,_index_) _index_ = (_vector_) 177 #define HAL_TRANSLATE_VECTOR(_vector_,_index_) _index_ = (_vector_)
575 178
576 #elif defined(CYG_HAL_MN10300_MN103002) 179 #endif
577 180
578 #define HAL_TRANSLATE_VECTOR(_vector_,_index_) \ 181 #endif
579 _index_ = (((_vector_)<=CYGNUM_HAL_INTERRUPT_SYSTEM_ERROR) ? \
580 (_vector_) : \
581 (((_vector_)>>2)+CYGNUM_HAL_INTERRUPT_RESERVED_3))
582
583 #endif
584
585 #endif
586
587 182
588 //-------------------------------------------------------------------------- 183 //--------------------------------------------------------------------------
589 // Interrupt and VSR attachment macros 184 // Interrupt and VSR attachment macros
590 185
591 #define HAL_INTERRUPT_IN_USE( _vector_, _state_) \ 186 #define HAL_INTERRUPT_IN_USE( _vector_, _state_) \
592 CYG_MACRO_START \ 187 CYG_MACRO_START \
593 cyg_uint32 _index_; \ 188 cyg_uint32 _index_; \
594 HAL_TRANSLATE_VECTOR ((_vector_), _index_); \ 189 HAL_TRANSLATE_VECTOR ((_vector_), _index_); \
595 \ 190 \
596 if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)NULL ) \ 191 if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)HAL_DEFAULT_ISR ) \
597 (_state_) = 0; \ 192 (_state_) = 0; \
598 else \ 193 else \
599 (_state_) = 1; \ 194 (_state_) = 1; \
600 CYG_MACRO_END 195 CYG_MACRO_END
601 196
602 #define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ ) \ 197 #define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ ) \
603 { \ 198 CYG_MACRO_START \
199 cyg_uint32 _index_; \
200 HAL_TRANSLATE_VECTOR(_vector_,_index_); \
201 \
202 if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)HAL_DEFAULT_ISR ) \
203 { \
204 hal_interrupt_handlers[_index_] = (CYG_ADDRESS)_isr_; \
205 hal_interrupt_data[_index_] = (CYG_ADDRWORD)_data_; \
206 hal_interrupt_objects[_index_] = (CYG_ADDRESS)_object_; \
207 } \
208 CYG_MACRO_END
209
210 #define HAL_INTERRUPT_DETACH( _vector_, _isr_ ) \
211 CYG_MACRO_START \
604 cyg_uint32 _index_; \ 212 cyg_uint32 _index_; \
605 HAL_TRANSLATE_VECTOR(_vector_,_index_); \ 213 HAL_TRANSLATE_VECTOR(_vector_,_index_); \
606 \ 214 \
607 if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)NULL ) \
608 { \
609 hal_interrupt_handlers[_index_] = (CYG_ADDRESS)_isr_; \
610 hal_interrupt_data[_index_] = (CYG_ADDRWORD)_data_; \
611 hal_interrupt_objects[_index_] = (CYG_ADDRESS)_object_; \
612 } \
613 }
614
615 #define HAL_INTERRUPT_DETACH( _vector_, _isr_ ) \
616 { \
617 cyg_uint32 _index_; \
618 HAL_TRANSLATE_VECTOR(_vector_,_index_); \
619 \
620 if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)_isr_ ) \ 215 if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)_isr_ ) \
621 { \ 216 { \
622 hal_interrupt_handlers[_index_] = (CYG_ADDRESS)NULL; \ 217 hal_interrupt_handlers[_index_] = (CYG_ADDRESS)HAL_DEFAULT_ISR; \
623 hal_interrupt_data[_index_] = 0; \ 218 hal_interrupt_data[_index_] = 0; \
624 hal_interrupt_objects[_index_] = 0; \ 219 hal_interrupt_objects[_index_] = 0; \
625 } \ 220 } \
626 } 221 CYG_MACRO_END
627 222
628 #define HAL_VSR_GET( _vector_, _pvsr_ ) \ 223 #define HAL_VSR_GET( _vector_, _pvsr_ ) \
629 *((CYG_ADDRESS *)_pvsr_) = hal_vsr_table[_vector_]; 224 *((CYG_ADDRESS *)_pvsr_) = hal_vsr_table[_vector_];
630 225
631 226
689 /* restore the interrupt control register */ \ 284 /* restore the interrupt control register */ \
690 mn10300_interrupt_control[_index_] = _icr_; \ 285 mn10300_interrupt_control[_index_] = _icr_; \
691 _icr_ = mn10300_interrupt_control[_index_]; \ 286 _icr_ = mn10300_interrupt_control[_index_]; \
692 } 287 }
693 288
694 #define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \ 289 #if !defined(HAL_INTERRUPT_CONFIGURE)
695 { \ 290
696 cyg_uint32 _v_ = _vector_; \ 291 #error HAL_INTERRUPT_CONFIGURE not defined by variant
697 cyg_uint16 _val_ = 0; \ 292
698 cyg_uint16 _reg_; \ 293 #endif
699 \
700 /* adjust vector to bit offset in EXTMD */ \
701 _v_ -= CYGNUM_HAL_INTERRUPT_EXTERNAL_0; \
702 _v_ >>= 1; \
703 \
704 /* set bits according to requirements */ \
705 if( _up_ ) _val_ |= 1; \
706 if( !(_level_) ) _val_ |= 2; \
707 \
708 /* get EXTMD */ \
709 _reg_ = mn10300_interrupt_control[0x180>>1]; \
710 \
711 /* clear old value and set new */ \
712 _reg_ &= ~(3<<_v_); \
713 _reg_ |= _val_<<_v_; \
714 \
715 /* restore EXTMD */ \
716 mn10300_interrupt_control[0x180>>1] = _reg_; \
717 }
718 294
719 #define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \ 295 #define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \
720 { \ 296 { \
721 /* ICRs are 16 bit regs at 32 bit spacing */ \ 297 /* ICRs are 16 bit regs at 32 bit spacing */ \
722 cyg_ucount16 _index_ = (_vector_>>2)<<1; \ 298 cyg_ucount16 _index_ = (_vector_>>2)<<1; \
732 mn10300_interrupt_control[_index_] = _icr_; \ 308 mn10300_interrupt_control[_index_] = _icr_; \
733 _icr_ = mn10300_interrupt_control[_index_]; \ 309 _icr_ = mn10300_interrupt_control[_index_]; \
734 } 310 }
735 311
736 //-------------------------------------------------------------------------- 312 //--------------------------------------------------------------------------
737 // Clock control 313 // Clock control.
738 314 // This is almost all handled in the var_intr.h.
739
740 #if 0 // defined(CYG_HAL_MN10300_SIM)
741
742 #define OEA_DEV 0x31000000
743
744 #define HAL_SWAP(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)| \
745 (((x)&0xff0000)>>8)|(((x)&0xff000000)>>24))
746
747 #define PAL_COUNTDOWN_TIMER 0x20 // one shot on IR0
748 #define PAL_COUNTDOWN_VALUE 0x24
749 #define PAL_PERIODIC_TIMER 0x28 // repeating on IR1
750 #define PAL_PERIODIC_VALUE 0x2c
751
752
753 // IRQ1 set to receive clock intrs
754 #define HAL_CLOCK_INITIALIZE( _period_ ) \
755 { \
756 volatile cyg_uint32 *timer = (cyg_uint32 *) \
757 (OEA_DEV + PAL_PERIODIC_TIMER); \
758 cyg_uint32 p = _period_; \
759 \
760 *timer = HAL_SWAP(p); \
761 }
762
763 #elif defined(CYG_HAL_MN10300_MN103000)
764
765 #define HAL_CLOCK_INITIALIZE( _period_ ) \
766 { \
767 volatile cyg_uint16 *timer_ctr = (cyg_uint16 *)TIMER_BR; \
768 volatile cyg_uint16 *timer_mode = (cyg_uint16 *)TIMER_MD; \
769 volatile cyg_uint8 *timer_a_mode = (cyg_uint8 *)0x34001084; \
770 \
771 *timer_a_mode = 0x04; \
772 \
773 *timer_ctr = 0xf000; \
774 \
775 *timer_mode = 0x0013; \
776 *timer_mode = 0x4013; \
777 *timer_mode = 0x0013; \
778 *timer_mode = 0x8013; \
779 }
780
781 #elif defined(CYG_HAL_MN10300_MN103002)
782
783 #define HAL_CLOCK_INITIALIZE( _period_ ) \
784 { \
785 volatile cyg_uint16 *timer4_br = (cyg_uint16 *)TIMER4_BR; \
786 volatile cyg_uint8 *timer4_md = (cyg_uint8 *)TIMER4_MD; \
787 volatile cyg_uint16 *timer5_br = (cyg_uint16 *)TIMER5_BR; \
788 volatile cyg_uint8 *timer5_md = (cyg_uint8 *)TIMER5_MD; \
789 \
790 /* Set timers 4 and 5 into cascade mode */ \
791 \
792 *timer5_br = (_period_)>>16; \
793 \
794 *timer5_md = 0x40; \
795 *timer5_md = 0x83; \
796 \
797 *timer4_br = (_period_)&0x0000FFFF; \
798 \
799 *timer4_md = 0x40; \
800 *timer4_md = 0x80; \
801 }
802
803 #else
804
805 #error Undefined MN10300 model
806
807 #endif
808
809 #define HAL_CLOCK_RESET( _vector_, _period_ )
810
811 #if 0 //def CYG_HAL_MN10300_SIM
812
813 // This timer counts down, so subtract from set value.
814 #define HAL_CLOCK_READ( _pvalue_ ) \
815 { \
816 volatile cyg_uint32 *timer = (cyg_uint32 *) \
817 (OEA_DEV + PAL_PERIODIC_TIMER); \
818 volatile cyg_uint32 *value = (cyg_uint32 *) \
819 (OEA_DEV + PAL_PERIODIC_VALUE); \
820 cyg_uint32 t,v; \
821 t = *timer; \
822 v = *value; \
823 *(_pvalue_) = HAL_SWAP(t) - HAL_SWAP(v); \
824 }
825
826 #else // CYG_HAL_MN10300_SIM not
827 #define HAL_CLOCK_READ( _pvalue_ ) \
828 { \
829 volatile cyg_uint16 *timer4_cr = (cyg_uint16 *)TIMER4_CR; \
830 volatile cyg_uint16 *timer5_cr = (cyg_uint16 *)TIMER5_CR; \
831 \
832 cyg_uint16 t5; \
833 cyg_uint16 t4; \
834 \
835 /* Loop reading the two timers until we can read t5 twice */ \
836 /* with the same value. This avoids getting silly times if */ \
837 /* the timers carry between reading the two regs. */ \
838 do { \
839 t5 = *timer5_cr; \
840 t4 = *timer4_cr; \
841 } while( t5 != *timer5_cr ); \
842 \
843 *(_pvalue_) = CYGNUM_KERNEL_COUNTERS_RTC_PERIOD - ((t5<<16) + t4); \
844 }
845
846 // FIXME: above line should not use CYGNUM_KERNEL_COUNTERS_RTC_PERIOD since
847 // this means the HAL gets configured by kernel options even when the
848 // kernel is disabled!
849
850 #endif // CYG_HAL_MN10300_SIM
851 315
852 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY 316 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
853 #define HAL_CLOCK_LATENCY(_pvalue_) HAL_CLOCK_READ(_pvalue_) 317 #define HAL_CLOCK_LATENCY(_pvalue_) HAL_CLOCK_READ(_pvalue_)
854 #endif 318 #endif
855 319