comparison packages/hal/powerpc/ppc40x/current/src/var_intr.c @ 136:a9ac27ec7abc ecos-sw-2000-11-17

Merge from eCos master repository on 2000-11-17-18:24:25-GMT
author jlarmour
date Fri, 17 Nov 2000 23:16:43 +0000
parents d2f49caf9e38
children 52c99470ec11
comparison
equal deleted inserted replaced
135:3bc2abeae9ff 136:a9ac27ec7abc
41 //####DESCRIPTIONEND#### 41 //####DESCRIPTIONEND####
42 // 42 //
43 //========================================================================== 43 //==========================================================================
44 44
45 #include <pkgconf/hal.h> 45 #include <pkgconf/hal.h>
46 #define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS
47 #include <cyg/hal/ppc_regs.h>
48 #include <cyg/hal/hal_intr.h>
46 #include <cyg/infra/cyg_type.h> 49 #include <cyg/infra/cyg_type.h>
50
51 static cyg_uint32 exier_mask[] = {
52 0x00000000, // Unused
53 0x00000000, // Unused
54 0x80000000, // CYGNUM_HAL_INTERRUPT_CRITICAL 2
55 0x08000000, // CYGNUM_HAL_INTERRUPT_SERIAL_RCV 3
56 0x04000000, // CYGNUM_HAL_INTERRUPT_SERIAL_XMT 4
57 0x02000000, // CYGNUM_HAL_INTERRUPT_JTAG_RCV 5
58 0x01000000, // CYGNUM_HAL_INTERRUPT_JTAG_XMT 6
59 0x00800000, // CYGNUM_HAL_INTERRUPT_DMA0 7
60 0x00400000, // CYGNUM_HAL_INTERRUPT_DMA1 8
61 0x00200000, // CYGNUM_HAL_INTERRUPT_DMA2 9
62 0x00100000, // CYGNUM_HAL_INTERRUPT_DMA3 10
63 0x00000010, // CYGNUM_HAL_INTERRUPT_EXT0 11
64 0x00000008, // CYGNUM_HAL_INTERRUPT_EXT1 12
65 0x00000004, // CYGNUM_HAL_INTERRUPT_EXT2 13
66 0x00000002, // CYGNUM_HAL_INTERRUPT_EXT3 14
67 0x00000001, // CYGNUM_HAL_INTERRUPT_EXT4 15
68 };
69
70 // This table inverts bit number to signal number
71 cyg_uint32 EXISR_TAB[] = {
72 CYGNUM_HAL_INTERRUPT_CRITICAL, // 0x80000000
73 0x00000000, // 0x40000000
74 0x00000000, // 0x20000000
75 0x00000000, // 0x10000000
76 CYGNUM_HAL_INTERRUPT_SERIAL_RCV, // 0x08000000
77 CYGNUM_HAL_INTERRUPT_SERIAL_XMT, // 0x04000000
78 CYGNUM_HAL_INTERRUPT_JTAG_RCV, // 0x02000000
79 CYGNUM_HAL_INTERRUPT_JTAG_XMT, // 0x01000000
80 CYGNUM_HAL_INTERRUPT_DMA0, // 0x00800000
81 CYGNUM_HAL_INTERRUPT_DMA1, // 0x00400000
82 CYGNUM_HAL_INTERRUPT_DMA2, // 0x00200000
83 CYGNUM_HAL_INTERRUPT_DMA3, // 0x00100000
84 0x00000000, // 0x00080000
85 0x00000000, // 0x00040000
86 0x00000000, // 0x00020000
87 0x00000000, // 0x00010000
88 0x00000000, // 0x00008000
89 0x00000000, // 0x00004000
90 0x00000000, // 0x00002000
91 0x00000000, // 0x00001000
92 0x00000000, // 0x00000800
93 0x00000000, // 0x00000400
94 0x00000000, // 0x00000200
95 0x00000000, // 0x00000100
96 0x00000000, // 0x00000080
97 0x00000000, // 0x00000040
98 0x00000000, // 0x00000020
99 CYGNUM_HAL_INTERRUPT_EXT0, // 0x00000010
100 CYGNUM_HAL_INTERRUPT_EXT1, // 0x00000008
101 CYGNUM_HAL_INTERRUPT_EXT2, // 0x00000004
102 CYGNUM_HAL_INTERRUPT_EXT3, // 0x00000002
103 CYGNUM_HAL_INTERRUPT_EXT4 // 0x00000001
104 };
105
106 cyg_uint32 _hold_tcr = 0; // Shadow of hardware register
47 107
48 externC void 108 externC void
49 hal_variant_IRQ_init(void) 109 hal_variant_IRQ_init(void)
50 { 110 {
51 // No special init required for 40x series. 111 cyg_uint32 iocr;
112
113 // Ensure all interrupts masked (disabled) & cleared
114 CYGARC_MTDCR(DCR_EXIER, 0);
115 CYGARC_MTDCR(DCR_EXISR, 0xFFFFFFFF);
116
117 // Configure all external interrupts to be level/low
118 CYGARC_MFDCR(DCR_IOCR, iocr);
119 iocr &= ~0xFFC00000;
120 CYGARC_MTDCR(DCR_IOCR, iocr);
121
122 // Disable timers
123 CYGARC_MTSPR(SPR_TCR, 0);
124 }
125
126 externC void
127 hal_ppc40x_interrupt_mask(int vector)
128 {
129 cyg_uint32 exier, tcr;
130
131 switch (vector) {
132 case CYGNUM_HAL_INTERRUPT_CRITICAL:
133 case CYGNUM_HAL_INTERRUPT_SERIAL_RCV:
134 case CYGNUM_HAL_INTERRUPT_SERIAL_XMT:
135 case CYGNUM_HAL_INTERRUPT_JTAG_RCV:
136 case CYGNUM_HAL_INTERRUPT_JTAG_XMT:
137 case CYGNUM_HAL_INTERRUPT_DMA0:
138 case CYGNUM_HAL_INTERRUPT_DMA1:
139 case CYGNUM_HAL_INTERRUPT_DMA2:
140 case CYGNUM_HAL_INTERRUPT_DMA3:
141 case CYGNUM_HAL_INTERRUPT_EXT0:
142 case CYGNUM_HAL_INTERRUPT_EXT1:
143 case CYGNUM_HAL_INTERRUPT_EXT2:
144 case CYGNUM_HAL_INTERRUPT_EXT3:
145 case CYGNUM_HAL_INTERRUPT_EXT4:
146 CYGARC_MFDCR(DCR_EXIER, exier);
147 exier &= ~exier_mask[vector];
148 CYGARC_MTDCR(DCR_EXIER, exier);
149 break;
150 case CYGNUM_HAL_INTERRUPT_VAR_TIMER:
151 CYGARC_MFSPR(SPR_TCR, tcr);
152 tcr = _hold_tcr;
153 tcr &= ~TCR_PIE;
154 CYGARC_MTSPR(SPR_TCR, tcr);
155 _hold_tcr = tcr;
156 break;
157 case CYGNUM_HAL_INTERRUPT_FIXED_TIMER:
158 CYGARC_MFSPR(SPR_TCR, tcr);
159 tcr = _hold_tcr;
160 tcr &= ~TCR_FIE;
161 CYGARC_MTSPR(SPR_TCR, tcr);
162 _hold_tcr = tcr;
163 break;
164 case CYGNUM_HAL_INTERRUPT_WATCHDOG_TIMER:
165 CYGARC_MFSPR(SPR_TCR, tcr);
166 tcr = _hold_tcr;
167 tcr &= ~TCR_WIE;
168 CYGARC_MTSPR(SPR_TCR, tcr);
169 _hold_tcr = tcr;
170 break;
171 default:
172 }
173 }
174
175 externC void
176 hal_ppc40x_interrupt_unmask(int vector)
177 {
178 cyg_uint32 exier, tcr;
179
180 switch (vector) {
181 case CYGNUM_HAL_INTERRUPT_CRITICAL:
182 case CYGNUM_HAL_INTERRUPT_SERIAL_RCV:
183 case CYGNUM_HAL_INTERRUPT_SERIAL_XMT:
184 case CYGNUM_HAL_INTERRUPT_JTAG_RCV:
185 case CYGNUM_HAL_INTERRUPT_JTAG_XMT:
186 case CYGNUM_HAL_INTERRUPT_DMA0:
187 case CYGNUM_HAL_INTERRUPT_DMA1:
188 case CYGNUM_HAL_INTERRUPT_DMA2:
189 case CYGNUM_HAL_INTERRUPT_DMA3:
190 case CYGNUM_HAL_INTERRUPT_EXT0:
191 case CYGNUM_HAL_INTERRUPT_EXT1:
192 case CYGNUM_HAL_INTERRUPT_EXT2:
193 case CYGNUM_HAL_INTERRUPT_EXT3:
194 case CYGNUM_HAL_INTERRUPT_EXT4:
195 CYGARC_MFDCR(DCR_EXIER, exier);
196 exier |= exier_mask[vector];
197 CYGARC_MTDCR(DCR_EXIER, exier);
198 break;
199 case CYGNUM_HAL_INTERRUPT_VAR_TIMER:
200 CYGARC_MFSPR(SPR_TCR, tcr);
201 tcr = _hold_tcr;
202 tcr |= TCR_PIE;
203 CYGARC_MTSPR(SPR_TCR, tcr);
204 _hold_tcr = tcr;
205 break;
206 case CYGNUM_HAL_INTERRUPT_FIXED_TIMER:
207 CYGARC_MFSPR(SPR_TCR, tcr);
208 tcr = _hold_tcr;
209 tcr |= TCR_FIE;
210 CYGARC_MTSPR(SPR_TCR, tcr);
211 _hold_tcr = tcr;
212 break;
213 case CYGNUM_HAL_INTERRUPT_WATCHDOG_TIMER:
214 CYGARC_MFSPR(SPR_TCR, tcr);
215 tcr = _hold_tcr;
216 tcr |= TCR_WIE;
217 CYGARC_MTSPR(SPR_TCR, tcr);
218 _hold_tcr = tcr;
219 break;
220 default:
221 }
222 }
223
224 externC void
225 hal_ppc40x_interrupt_acknowledge(int vector)
226 {
227 switch (vector) {
228 case CYGNUM_HAL_INTERRUPT_EXT0:
229 case CYGNUM_HAL_INTERRUPT_EXT1:
230 case CYGNUM_HAL_INTERRUPT_EXT2:
231 case CYGNUM_HAL_INTERRUPT_EXT3:
232 case CYGNUM_HAL_INTERRUPT_EXT4:
233 CYGARC_MTDCR(DCR_EXISR, exier_mask[vector]);
234 break;
235 case CYGNUM_HAL_INTERRUPT_VAR_TIMER:
236 CYGARC_MTSPR(SPR_TSR, TSR_PIS); // clear & acknowledge interrupt
237 break;
238 case CYGNUM_HAL_INTERRUPT_FIXED_TIMER:
239 CYGARC_MTSPR(SPR_TSR, TSR_FIS); // clear & acknowledge interrupt
240 break;
241 case CYGNUM_HAL_INTERRUPT_WATCHDOG_TIMER:
242 CYGARC_MTSPR(SPR_TSR, TSR_WIS); // clear & acknowledge interrupt
243 break;
244 case CYGNUM_HAL_INTERRUPT_CRITICAL:
245 case CYGNUM_HAL_INTERRUPT_SERIAL_RCV:
246 case CYGNUM_HAL_INTERRUPT_SERIAL_XMT:
247 case CYGNUM_HAL_INTERRUPT_JTAG_RCV:
248 case CYGNUM_HAL_INTERRUPT_JTAG_XMT:
249 case CYGNUM_HAL_INTERRUPT_DMA0:
250 case CYGNUM_HAL_INTERRUPT_DMA1:
251 case CYGNUM_HAL_INTERRUPT_DMA2:
252 case CYGNUM_HAL_INTERRUPT_DMA3:
253 default:
254 }
255 }
256
257 // Note: These functions are only [well] defined for "external" interrupts
258 // which can be controlled via the EXIER register.
259 externC void
260 hal_ppc40x_interrupt_configure(int vector, int level, int dir)
261 {
262 cyg_uint32 mask, new_state, iocr;
263
264 if ((vector >= CYGNUM_HAL_INTERRUPT_EXT0) &&
265 (vector <= CYGNUM_HAL_INTERRUPT_EXT4)) {
266 mask = 0x03 << (30 - ((vector - CYGNUM_HAL_INTERRUPT_EXT0)*2));
267 new_state = 0x00;
268 if (level == 0) {
269 // Edge triggered
270 new_state = 0x02 | (dir & 0x01); // Up/Down
271 }
272 new_state <<= (30 - ((vector - CYGNUM_HAL_INTERRUPT_EXT0)*2));
273 CYGARC_MFDCR(DCR_IOCR, iocr);
274 iocr = (iocr & ~mask) | new_state;
275 CYGARC_MTDCR(DCR_IOCR, iocr);
276 }
277 }
278
279 externC void
280 hal_ppc40x_interrupt_set_level(int vector, int level)
281 {
52 } 282 }
53 283
54 // ------------------------------------------------------------------------- 284 // -------------------------------------------------------------------------
55 // EOF var_intr.c 285 // EOF var_intr.c