1 #ifndef CYGONCE_VAR_INTR_H
2 #define CYGONCE_VAR_INTR_H
4 //==========================================================================
8 // HAL variant interrupt and clock support
10 //==========================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
16 // eCos is free software; you can redistribute it and/or modify it under
17 // the terms of the GNU General Public License as published by the Free
18 // Software Foundation; either version 2 or (at your option) any later version.
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 // You should have received a copy of the GNU General Public License along
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
29 // As a special exception, if other files instantiate templates or use macros
30 // or inline functions from this file, or you compile this file and link it
31 // with other works to produce a work based on this file, this file does not
32 // by itself cause the resulting work to be covered by the GNU General Public
33 // License. However the source code for this file must still be made available
34 // in accordance with section (3) of the GNU General Public License.
36 // This exception does not invalidate any other reasons why a work based on
37 // this file might be covered by the GNU General Public License.
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40 // at http://sources.redhat.com/ecos/ecos-license/
41 // -------------------------------------------
42 //####ECOSGPLCOPYRIGHTEND####
43 //==========================================================================
44 //#####DESCRIPTIONBEGIN####
47 // Contributors: jskov,
49 // Purpose: Define Interrupt support
50 // Description: The macros defined here provide the HAL APIs for handling
51 // interrupts and the clock.
54 // #include <cyg/hal/hal_intr.h>
58 //####DESCRIPTIONEND####
60 //==========================================================================
62 #include <pkgconf/hal.h>
64 #include CYGBLD_HAL_CPU_MODULES_H // INTC module selection
66 //--------------------------------------------------------------------------
67 // Optional platform overrides and fallbacks
68 #include <cyg/hal/plf_intr.h>
70 #ifndef CYGPRI_HAL_INTERRUPT_ACKNOWLEDGE_PLF
71 # define CYGPRI_HAL_INTERRUPT_ACKNOWLEDGE_PLF(vec)
74 #ifndef CYGPRI_HAL_INTERRUPT_CONFIGURE_PLF
75 # define CYGPRI_HAL_INTERRUPT_CONFIGURE_PLF(vec, level, up)
78 //----------------------------------------------------------------------------
79 // Additional vectors provided by INTC V1
81 #if (CYGARC_SH_MOD_INTC == 1)
83 #ifndef CYGPRI_HAL_INTERRUPT_UPDATE_LEVEL_PLF
84 # define CYGPRI_HAL_INTERRUPT_UPDATE_LEVEL_PLF(vec, level) \
85 case CYGNUM_HAL_INTERRUPT_NMI: \
87 case CYGNUM_HAL_INTERRUPT_LVL4 ... CYGNUM_HAL_INTERRUPT_LVL_MAX: \
88 /* Cannot change levels */ \
92 #define CYGNUM_HAL_INTERRUPT_LVL8 9
93 #define CYGNUM_HAL_INTERRUPT_LVL9 10
94 #define CYGNUM_HAL_INTERRUPT_LVL10 11
95 #define CYGNUM_HAL_INTERRUPT_LVL11 12
96 #define CYGNUM_HAL_INTERRUPT_LVL12 13
97 #define CYGNUM_HAL_INTERRUPT_LVL13 14
98 #define CYGNUM_HAL_INTERRUPT_LVL14 15
99 #define CYGNUM_HAL_INTERRUPT_DMAC0_TE 16
100 #define CYGNUM_HAL_INTERRUPT_DMAC1_TE 17
101 #define CYGNUM_HAL_INTERRUPT_WDT_ITI 18
102 #define CYGNUM_HAL_INTERRUPT_REF_CMI 19
103 #define CYGNUM_HAL_INTERRUPT_EDMAC_EINT 20
104 #define CYGNUM_HAL_INTERRUPT_FRT_ICI 21
105 #define CYGNUM_HAL_INTERRUPT_FRT_OCI 22
106 #define CYGNUM_HAL_INTERRUPT_FRT_OVI 23
107 #define CYGNUM_HAL_INTERRUPT_TPU0_TGI0A 24
108 #define CYGNUM_HAL_INTERRUPT_TPU0_TGI0B 25
109 #define CYGNUM_HAL_INTERRUPT_TPU0_TGI0C 26
110 #define CYGNUM_HAL_INTERRUPT_TPU0_TGI0D 27
111 #define CYGNUM_HAL_INTERRUPT_TPU0_TGI0V 28
112 #define CYGNUM_HAL_INTERRUPT_TPU1_TGI1A 29
113 #define CYGNUM_HAL_INTERRUPT_TPU1_TGI1B 30
114 #define CYGNUM_HAL_INTERRUPT_TPU1_TGI1V 31
115 #define CYGNUM_HAL_INTERRUPT_TPU1_TGI1U 32
116 #define CYGNUM_HAL_INTERRUPT_TPU2_TGI2A 33
117 #define CYGNUM_HAL_INTERRUPT_TPU2_TGI2B 34
118 #define CYGNUM_HAL_INTERRUPT_TPU2_TGI2V 35
119 #define CYGNUM_HAL_INTERRUPT_TPU2_TGI2U 36
120 #define CYGNUM_HAL_INTERRUPT_SCIF1_ERI1 37
121 #define CYGNUM_HAL_INTERRUPT_SCIF1_RXI1 38
122 #define CYGNUM_HAL_INTERRUPT_SCIF1_BRI1 39
123 #define CYGNUM_HAL_INTERRUPT_SCIF1_TXI1 40
124 #define CYGNUM_HAL_INTERRUPT_SCIF2_ERI2 41
125 #define CYGNUM_HAL_INTERRUPT_SCIF2_RXI2 42
126 #define CYGNUM_HAL_INTERRUPT_SCIF2_BRI2 43
127 #define CYGNUM_HAL_INTERRUPT_SCIF2_TXI2 44
128 #define CYGNUM_HAL_INTERRUPT_SIO0_RERI0 45
129 #define CYGNUM_HAL_INTERRUPT_SIO0_TERI0 46
130 #define CYGNUM_HAL_INTERRUPT_SIO0_RDFI0 47
131 #define CYGNUM_HAL_INTERRUPT_SIO0_TDEI0 48
132 #define CYGNUM_HAL_INTERRUPT_SIO1_RERI1 49
133 #define CYGNUM_HAL_INTERRUPT_SIO1_TERI1 50
134 #define CYGNUM_HAL_INTERRUPT_SIO1_RDFI1 51
135 #define CYGNUM_HAL_INTERRUPT_SIO1_TDEI1 52
136 #define CYGNUM_HAL_INTERRUPT_SIO2_RERI2 53
137 #define CYGNUM_HAL_INTERRUPT_SIO2_TERI2 54
138 #define CYGNUM_HAL_INTERRUPT_SIO2_RDFI2 55
139 #define CYGNUM_HAL_INTERRUPT_SIO2_TDEI2 56
141 #define CYGNUM_HAL_INTERRUPT_LVL_MAX CYGNUM_HAL_INTERRUPT_LVL14
143 #undef CYGNUM_HAL_ISR_MAX
144 #ifdef CYGNUM_HAL_ISR_PLF_MAX
145 # define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_ISR_PLF_MAX
147 # define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_SIO2_TDEI2
150 // The vector used by the Real time clock
151 #ifndef CYGNUM_HAL_INTERRUPT_RTC
152 # define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_FRT_OCI
155 #elif (CYGARC_SH_MOD_INTC == 2)
157 #ifndef CYGPRI_HAL_INTERRUPT_UPDATE_LEVEL_PLF
158 # define CYGPRI_HAL_INTERRUPT_UPDATE_LEVEL_PLF(vec, level) \
159 case CYGNUM_HAL_INTERRUPT_NMI: \
160 /* Cannot change levels */ \
164 #define CYGNUM_HAL_INTERRUPT_DMAC0_DEI0 9
165 #define CYGNUM_HAL_INTERRUPT_DMAC1_DEI1 10
166 #define CYGNUM_HAL_INTERRUPT_DMAC2_DEI2 11
167 #define CYGNUM_HAL_INTERRUPT_DMAC3_DEI3 12
168 #define CYGNUM_HAL_INTERRUPT_MTU0_TGI0A 13
169 #define CYGNUM_HAL_INTERRUPT_MTU0_TGI0B 14
170 #define CYGNUM_HAL_INTERRUPT_MTU0_TGI0C 15
171 #define CYGNUM_HAL_INTERRUPT_MTU0_TGI0D 16
172 #define CYGNUM_HAL_INTERRUPT_MTU0_TGI0V 17
173 #define CYGNUM_HAL_INTERRUPT_MTU1_TGI1A 18
174 #define CYGNUM_HAL_INTERRUPT_MTU1_TGI1B 19
175 #define CYGNUM_HAL_INTERRUPT_MTU1_TGI1V 20
176 #define CYGNUM_HAL_INTERRUPT_MTU1_TGI1U 21
177 #define CYGNUM_HAL_INTERRUPT_MTU2_TGI2A 22
178 #define CYGNUM_HAL_INTERRUPT_MTU2_TGI2B 23
179 #define CYGNUM_HAL_INTERRUPT_MTU2_TGI2V 24
180 #define CYGNUM_HAL_INTERRUPT_MTU2_TGI2U 25
181 #define CYGNUM_HAL_INTERRUPT_MTU3_TGI3A 26
182 #define CYGNUM_HAL_INTERRUPT_MTU3_TGI3B 27
183 #define CYGNUM_HAL_INTERRUPT_MTU3_TGI3C 28
184 #define CYGNUM_HAL_INTERRUPT_MTU3_TGI3D 29
185 #define CYGNUM_HAL_INTERRUPT_MTU3_TGI3V 30
186 #define CYGNUM_HAL_INTERRUPT_MTU4_TGI4A 31
187 #define CYGNUM_HAL_INTERRUPT_MTU4_TGI4B 32
188 #define CYGNUM_HAL_INTERRUPT_MTU4_TGI4C 33
189 #define CYGNUM_HAL_INTERRUPT_MTU4_TGI4D 34
190 #define CYGNUM_HAL_INTERRUPT_MTU4_TGI4V 35
191 #define CYGNUM_HAL_INTERRUPT_SCI0_ERI0 36
192 #define CYGNUM_HAL_INTERRUPT_SCI0_RXI0 37
193 #define CYGNUM_HAL_INTERRUPT_SCI0_TXI0 38
194 #define CYGNUM_HAL_INTERRUPT_SCI0_TEI0 39
195 #define CYGNUM_HAL_INTERRUPT_SCI1_ERI1 40
196 #define CYGNUM_HAL_INTERRUPT_SCI1_RXI1 41
197 #define CYGNUM_HAL_INTERRUPT_SCI1_TXI1 42
198 #define CYGNUM_HAL_INTERRUPT_SCI1_TEI1 43
199 #define CYGNUM_HAL_INTERRUPT_AD_ADI0 44
200 #define CYGNUM_HAL_INTERRUPT_AD_ADI1 45
201 #define CYGNUM_HAL_INTERRUPT_DTC_SWDTCE 46
202 #define CYGNUM_HAL_INTERRUPT_CMT0_CMI0 47
203 #define CYGNUM_HAL_INTERRUPT_CMT1_CMI1 48
204 #define CYGNUM_HAL_INTERRUPT_WDT_ITI 49
205 #define CYGNUM_HAL_INTERRUPT_BSC_CMI 50
206 #define CYGNUM_HAL_INTERRUPT_IO_OEI 51
207 #define CYGNUM_HAL_INTERRUPT_VAR_RESERVED 52 // just to catch bad assignments
209 #undef CYGNUM_HAL_ISR_MAX
210 #ifdef CYGNUM_HAL_ISR_PLF_MAX
211 # define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_ISR_PLF_MAX
213 # define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_VAR_RESERVED
216 // eCos vector this entry decodes to , actual HW interrupt vector
217 #define CYGHWR_HAL_SH_SH2_CUSTOM_INTERRUPT_LAYOUT \
218 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL0 , 1 ; \
219 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL1 , 2 ; \
220 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL2 , 3 ; \
221 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL3 , 4 ; \
222 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL4 , 5 ; \
223 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL5 , 6 ; \
224 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL6 , 7 ; \
225 exception_vector_int CYGNUM_HAL_INTERRUPT_LVL7 , 8 ; \
227 exception_vector_int CYGNUM_HAL_INTERRUPT_DMAC0_DEI0 , 9 ; \
228 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 10 ; \
229 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 11 ; \
230 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 12 ; \
231 exception_vector_int CYGNUM_HAL_INTERRUPT_DMAC1_DEI1 , 13 ; \
232 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 14 ; \
233 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 15 ; \
234 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 16 ; \
235 exception_vector_int CYGNUM_HAL_INTERRUPT_DMAC2_DEI2 , 17 ; \
236 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 18 ; \
237 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 19 ; \
238 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 20 ; \
239 exception_vector_int CYGNUM_HAL_INTERRUPT_DMAC3_DEI3 , 21 ; \
240 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 22 ; \
241 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 23 ; \
242 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 24 ; \
243 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU0_TGI0A , 25 ; \
244 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU0_TGI0B , 26 ; \
245 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU0_TGI0C , 27 ; \
246 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU0_TGI0D , 28 ; \
247 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU0_TGI0V , 29 ; \
248 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 30 ; \
249 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 31 ; \
250 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 32 ; \
251 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU1_TGI1A , 33 ; \
252 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU1_TGI1B , 34 ; \
253 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 35 ; \
254 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 36 ; \
255 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU1_TGI1V , 37 ; \
256 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU1_TGI1U , 38 ; \
257 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 39 ; \
258 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 40 ; \
259 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU2_TGI2A , 41 ; \
260 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU2_TGI2B , 42 ; \
261 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 43 ; \
262 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 44 ; \
263 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU2_TGI2V , 45 ; \
264 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU2_TGI2U , 46 ; \
265 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 47 ; \
266 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 48 ; \
267 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU3_TGI3A , 49 ; \
268 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU3_TGI3B , 50 ; \
269 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU3_TGI3C , 51 ; \
270 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU3_TGI3D , 52 ; \
271 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU3_TGI3V , 53 ; \
272 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 54 ; \
273 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 55 ; \
274 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 56 ; \
275 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU4_TGI4A , 57 ; \
276 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU4_TGI4B , 58 ; \
277 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU4_TGI4C , 59 ; \
278 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU4_TGI4D , 60 ; \
279 exception_vector_int CYGNUM_HAL_INTERRUPT_MTU4_TGI4V , 61 ; \
280 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 62 ; \
281 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 63 ; \
282 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 64 ; \
283 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI0_ERI0 , 65 ; \
284 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI0_RXI0 , 66 ; \
285 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI0_TXI0 , 67 ; \
286 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI0_TEI0 , 68 ; \
287 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI1_ERI1 , 69 ; \
288 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI1_RXI1 , 70 ; \
289 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI1_TXI1 , 71 ; \
290 exception_vector_int CYGNUM_HAL_INTERRUPT_SCI1_TEI1 , 72 ; \
291 exception_vector_int CYGNUM_HAL_INTERRUPT_AD_ADI0 , 73 ; \
292 exception_vector_int CYGNUM_HAL_INTERRUPT_AD_ADI1 , 74 ; \
293 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 75 ; \
294 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 76 ; \
295 exception_vector_int CYGNUM_HAL_INTERRUPT_DTC_SWDTCE , 77 ; \
296 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 78 ; \
297 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 79 ; \
298 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 80 ; \
299 exception_vector_int CYGNUM_HAL_INTERRUPT_CMT0_CMI0 , 81 ; \
300 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 82 ; \
301 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 83 ; \
302 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 84 ; \
303 exception_vector_int CYGNUM_HAL_INTERRUPT_CMT1_CMI1 , 85 ; \
304 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 86 ; \
305 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 87 ; \
306 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 88 ; \
307 exception_vector_int CYGNUM_HAL_INTERRUPT_WDT_ITI , 89 ; \
308 exception_vector_int CYGNUM_HAL_INTERRUPT_BSC_CMI , 90 ; \
309 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 91 ; \
310 exception_vector_int CYGNUM_HAL_INTERRUPT_VAR_RESERVED , 92 ; \
311 exception_vector_int CYGNUM_HAL_INTERRUPT_BSC_CMI , 93 ; \
312 .set vecno, CYGNUM_HAL_INTERRUPT_VAR_RESERVED ; \
313 .rept (256-CYGNUM_HAL_INTERRUPT_VAR_RESERVED) ; \
314 exception_vector_int vecno ; \
315 .set vecno, vecno+1 ; \
318 // The vector used by the Real time clock
319 #ifndef CYGNUM_HAL_INTERRUPT_RTC
320 # define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_CMT0_CMI0
325 # error "No vectors defined for this INTC type"
329 //----------------------------------------------------------------------------
330 // Platform may provide extensions to the interrupt configuration functions
331 // via these macros. The first macro is put inside the functions's
332 // switch statements, the last two called as functions.
333 #ifndef CYGPRI_HAL_INTERRUPT_UPDATE_LEVEL_PLF
334 # define CYGPRI_HAL_INTERRUPT_UPDATE_LEVEL_PLF(vec, level)
335 # define CYGPRI_HAL_INTERRUPT_ACKNOWLEDGE_PLF(vec)
336 # define CYGPRI_HAL_INTERRUPT_CONFIGURE_PLF(vec)
339 #ifndef __ASSEMBLER__
340 //--------------------------------------------------------------------------
341 // Clock control, using Free-running Timer to match on compare register A
343 #include <cyg/hal/sh_regs.h> // register definitions
344 #include <cyg/hal/hal_io.h> // io macros
345 #include <cyg/infra/cyg_ass.h> // CYG_FAIL
347 #if defined(CYGARC_SH_MOD_FRT)
348 #define HAL_CLOCK_VAR_INITIALIZE( _period_ ) \
350 register cyg_uint8 _tier_; \
352 /* Disable interrupts while programming the timer */ \
353 HAL_READ_UINT8(CYGARC_REG_TIER, _tier_); \
354 HAL_WRITE_UINT8(CYGARC_REG_TIER, 0); \
356 /* Clear counter register */ \
357 HAL_WRITE_UINT8(CYGARC_REG_FRC, 0); \
358 /* Set compare A register */ \
359 HAL_WRITE_UINT8(CYGARC_REG_TOCR, CYGARC_REG_TOCR_OLVLA); \
360 HAL_WRITE_UINT16(CYGARC_REG_OCR, _period_); \
362 /* Enable match A counter clear */ \
363 HAL_WRITE_UINT8(CYGARC_REG_FTCSR, CYGARC_REG_FTCSR_CCLRA); \
364 /* Set interrupt prescaling */ \
365 HAL_WRITE_UINT8(CYGARC_REG_TCR, \
366 ((8==CYGHWR_HAL_SH_FRT_PRESCALE) ? \
367 CYGARC_REG_TCR_CLK_8 : \
368 (32==CYGHWR_HAL_SH_FRT_PRESCALE) ? \
369 CYGARC_REG_TCR_CLK_32: \
370 (128==CYGHWR_HAL_SH_FRT_PRESCALE) ? \
371 CYGARC_REG_TCR_CLK_128:CYGARC_REG_TCR_CLK_EXT)); \
376 // HAL_CLOCK_VAR_INITIALIZE is called from hal_variant_init since the
377 // FRT is also used by the hal_delay_us code.
378 #define HAL_CLOCK_INITIALIZE( _period_ ) \
380 register cyg_uint8 _tier_; \
382 CYG_ASSERT((cyg_uint16)(_period_) < (cyg_uint16)0xfffe, \
383 "period too large for 16bit FRT"); \
385 /* Disable interrupts while programming the timer */ \
386 HAL_READ_UINT8(CYGARC_REG_TIER, _tier_); \
387 HAL_WRITE_UINT8(CYGARC_REG_TIER, 0); \
389 /* Set compare A register */ \
390 HAL_WRITE_UINT8(CYGARC_REG_TOCR, CYGARC_REG_TOCR_OLVLA); \
391 HAL_WRITE_UINT16(CYGARC_REG_OCR, _period_); \
393 /* Enable interrupt */ \
394 _tier_ |= CYGARC_REG_TIER_OCIAE; \
395 HAL_WRITE_UINT8(CYGARC_REG_TIER, _tier_); \
399 #define HAL_CLOCK_RESET( _vector_, _period_ ) \
401 register cyg_uint8 _ftcsr_; \
403 /* Clear match flag */ \
404 HAL_READ_UINT8(CYGARC_REG_FTCSR, _ftcsr_); \
405 _ftcsr_ &= ~CYGARC_REG_FTCSR_OCFA; \
406 HAL_WRITE_UINT8(CYGARC_REG_FTCSR, _ftcsr_); \
410 #define HAL_CLOCK_READ( _pvalue_ ) \
412 register cyg_uint16 _frc_; \
414 HAL_READ_UINT16(CYGARC_REG_FRC, _frc_); \
416 *(_pvalue_) = _frc_; \
419 #elif defined(CYGARC_SH_MOD_CMT)
421 /* Compare Match Timer 0 is used for the eCos kernel RTC */
422 #define HAL_CLOCK_VAR_INITIALIZE( _period_ ) \
424 register cyg_uint16 _tmp_; \
426 /* Disable timer while programming it */ \
427 HAL_READ_UINT16(CYGARC_REG_CMSTR, _tmp_); \
428 HAL_WRITE_UINT16(CYGARC_REG_CMSTR, _tmp_ & ~CYGARC_REG_CMSTR_STR0); \
430 /* Clear counter register */ \
431 HAL_WRITE_UINT16(CYGARC_REG_CMCNT0, 0); \
432 /* Set compare 0 register */ \
433 HAL_WRITE_UINT16(CYGARC_REG_CMCOR0, _period_); \
435 /* Set prescaling and disable interrupts */ \
436 HAL_WRITE_UINT16(CYGARC_REG_CMCSR0, \
437 ((8==CYGHWR_HAL_SH_CMT_PRESCALE) ? \
438 CYGARC_REG_CMCSR_CLK_8 : \
439 (32==CYGHWR_HAL_SH_CMT_PRESCALE) ? \
440 CYGARC_REG_CMCSR_CLK_32: \
441 (128==CYGHWR_HAL_SH_CMT_PRESCALE) ? \
442 CYGARC_REG_CMCSR_CLK_128:CYGARC_REG_CMCSR_CLK_512)); \
445 HAL_WRITE_UINT16(CYGARC_REG_CMSTR, _tmp_ | CYGARC_REG_CMSTR_STR0); \
449 // HAL_CLOCK_VAR_INITIALIZE is called from hal_variant_init since the
450 // CMT0 is also used by the hal_delay_us code.
451 #define HAL_CLOCK_INITIALIZE( _period_ ) \
453 register cyg_uint16 _tmp_; \
455 CYG_ASSERT((cyg_uint16)(_period_) < (cyg_uint16)0xfffe, \
456 "period too large for 16bit CMT"); \
458 /* Disable timer while programming it */ \
459 HAL_READ_UINT16(CYGARC_REG_CMSTR, _tmp_); \
460 HAL_WRITE_UINT16(CYGARC_REG_CMSTR, _tmp_ & ~CYGARC_REG_CMSTR_STR0); \
462 /* Clear counter register */ \
463 HAL_WRITE_UINT16(CYGARC_REG_CMCNT0, 0); \
464 /* Set compare 0 register */ \
465 HAL_WRITE_UINT16(CYGARC_REG_CMCOR0, _period_); \
467 /* Set prescaling and enable interrupts */ \
468 HAL_WRITE_UINT16(CYGARC_REG_CMCSR0, CYGARC_REG_CMCSR_CMIE | \
469 ((8==CYGHWR_HAL_SH_CMT_PRESCALE) ? \
470 CYGARC_REG_CMCSR_CLK_8 : \
471 (32==CYGHWR_HAL_SH_CMT_PRESCALE) ? \
472 CYGARC_REG_CMCSR_CLK_32: \
473 (128==CYGHWR_HAL_SH_CMT_PRESCALE) ? \
474 CYGARC_REG_CMCSR_CLK_128:CYGARC_REG_CMCSR_CLK_512)); \
477 HAL_WRITE_UINT16(CYGARC_REG_CMSTR, _tmp_ | CYGARC_REG_CMSTR_STR0); \
481 #define HAL_CLOCK_RESET( _vector_, _period_ ) \
483 register cyg_uint16 _tmp_; \
485 /* Clear match flag */ \
486 HAL_READ_UINT16(CYGARC_REG_CMCSR0, _tmp_); \
487 _tmp_ &= ~CYGARC_REG_CMCSR_CMF; \
488 HAL_WRITE_UINT16(CYGARC_REG_CMCSR0, _tmp_); \
492 #define HAL_CLOCK_READ( _pvalue_ ) \
494 register cyg_uint16 _tmp_; \
496 HAL_READ_UINT16(CYGARC_REG_CMCNT0, _tmp_); \
498 *(_pvalue_) = _tmp_; \
504 # error "No RTC handling defined"
509 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
510 #define HAL_CLOCK_LATENCY( _pvalue_ ) HAL_CLOCK_READ(_pvalue_)
514 //----------------------------------------------------------------------------
516 #ifndef HAL_PLATFORM_RESET
517 #define HAL_PLATFORM_RESET() \
519 HAL_WRITE_UINT16(CYGARC_REG_RSTCSR_W, CYGARC_REG_RSTCSR_W_RSTx_MAGIC|CYGARC_REG_RSTCSR_RSTE); \
520 HAL_WRITE_UINT16(CYGARC_REG_WTCNT_W, CYGARC_REG_WTCNT_W_MAGIC|0xfe); \
521 HAL_WRITE_UINT16(CYGARC_REG_WTCSR_W, CYGARC_REG_WTCSR_W_MAGIC|CYGARC_REG_WTCSR_TME|CYGARC_REG_WTCSR_WTIT); \
526 #define HAL_PLATFORM_RESET()
529 #endif // __ASSEMBLER__
531 //--------------------------------------------------------------------------
532 #endif // ifndef CYGONCE_VAR_INTR_H