1 #ifndef CYGONCE_HAL_INTR_EXCEVT_H
2 #define CYGONCE_HAL_INTR_EXCEVT_H
4 //==========================================================================
8 // HAL Interrupt and clock support for variants with EXCEVT style
9 // exception/interrupt mapping (SH3, SH4)
11 //==========================================================================
12 //####ECOSGPLCOPYRIGHTBEGIN####
13 // -------------------------------------------
14 // This file is part of eCos, the Embedded Configurable Operating System.
15 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
17 // eCos is free software; you can redistribute it and/or modify it under
18 // the terms of the GNU General Public License as published by the Free
19 // Software Foundation; either version 2 or (at your option) any later version.
21 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
22 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
26 // You should have received a copy of the GNU General Public License along
27 // with eCos; if not, write to the Free Software Foundation, Inc.,
28 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
30 // As a special exception, if other files instantiate templates or use macros
31 // or inline functions from this file, or you compile this file and link it
32 // with other works to produce a work based on this file, this file does not
33 // by itself cause the resulting work to be covered by the GNU General Public
34 // License. However the source code for this file must still be made available
35 // in accordance with section (3) of the GNU General Public License.
37 // This exception does not invalidate any other reasons why a work based on
38 // this file might be covered by the GNU General Public License.
40 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
41 // at http://sources.redhat.com/ecos/ecos-license/
42 // -------------------------------------------
43 //####ECOSGPLCOPYRIGHTEND####
44 //==========================================================================
45 //#####DESCRIPTIONBEGIN####
48 // Contributors: jskov,
50 // Purpose: Define Interrupt support
51 // Description: The macros defined here provide the HAL APIs for handling
52 // interrupts and the clock.
54 // Usage: Is included from <cyg/hal/hal_intr.h>
56 //####DESCRIPTIONEND####
58 //==========================================================================
60 //--------------------------------------------------------------------------
61 // SH exception vectors. These correspond to VSRs and are the values
62 // to use for HAL_VSR_GET/SET
64 // Note that exceptions are decoded - there is a VSR slot for each exception
65 // source, while interrupts are handled via the same VSR.
67 #define CYGNUM_HAL_VECTOR_POWERON 0 // power-on
68 #define CYGNUM_HAL_VECTOR_RESET 1 // reset
69 #define CYGNUM_HAL_VECTOR_TLBMISS_ACCESS 2 // TLB-miss/invalid load
70 #define CYGNUM_HAL_VECTOR_TLBMISS_WRITE 3 // TLB-miss/invalid store
71 #define CYGNUM_HAL_VECTOR_INITIAL_WRITE 4 // initial page write
72 #define CYGNUM_HAL_VECTOR_TLBERROR_ACCESS 5 // TLB prot violation l
73 #define CYGNUM_HAL_VECTOR_TLBERROR_WRITE 6 // TLB prot violation s
74 #define CYGNUM_HAL_VECTOR_DATA_ACCESS 7 // address error (load)
75 #define CYGNUM_HAL_VECTOR_DATA_WRITE 8 // address error (store)
77 #define CYGNUM_HAL_VECTOR_TRAP 11 // unconditional trap
78 #define CYGNUM_HAL_VECTOR_ILLEGAL_INSTRUCTION 12 // reserved instruction
79 #define CYGNUM_HAL_VECTOR_ILLEGAL_SLOT_INSTRUCTION 13
80 // illegal instruction in delay slot
81 #define CYGNUM_HAL_VECTOR_NMI 14 // NMI
82 #define CYGNUM_HAL_VECTOR_INSTRUCTION_BP 15 // user breakpoint
84 #define CYGNUM_HAL_VECTOR_INTERRUPT 16 // all interrupts
86 #ifndef CYG_VECTOR_IS_INTERRUPT
87 # define CYG_VECTOR_IS_INTERRUPT(v) (CYGNUM_HAL_VECTOR_INSTRUCTION_BP < (v))
90 #define CYGNUM_HAL_VSR_MIN CYGNUM_HAL_VECTOR_POWERON
91 #ifndef CYGNUM_HAL_VSR_MAX
92 # define CYGNUM_HAL_VSR_MAX CYGNUM_HAL_VECTOR_INTERRUPT
94 #define CYGNUM_HAL_VSR_COUNT ( CYGNUM_HAL_VSR_MAX + 1 )
96 #ifndef CYGNUM_HAL_VSR_EXCEPTION_COUNT
97 # define CYGNUM_HAL_VSR_EXCEPTION_COUNT (CYGNUM_HAL_VECTOR_INSTRUCTION_BP-CYGNUM_HAL_VECTOR_POWERON+1)
100 // For the stub exception handling
101 #define _CYGNUM_HAL_VECTOR_FIRST_MEM_FAULT CYGNUM_HAL_EXCEPTION_TLBMISS_ACCESS
102 #define _CYGNUM_HAL_VECTOR_LAST_MEM_FAULT CYGNUM_HAL_EXCEPTION_DATA_WRITE
104 // The decoded interrupts.
105 #define CYGNUM_HAL_INTERRUPT_NMI 0
106 #define CYGNUM_HAL_INTERRUPT_RESERVED_1E0 1
107 #define CYGNUM_HAL_INTERRUPT_LVL0 2
108 #define CYGNUM_HAL_INTERRUPT_LVL1 3
109 #define CYGNUM_HAL_INTERRUPT_LVL2 4
110 #define CYGNUM_HAL_INTERRUPT_LVL3 5
111 #define CYGNUM_HAL_INTERRUPT_LVL4 6
112 #define CYGNUM_HAL_INTERRUPT_LVL5 7
113 #define CYGNUM_HAL_INTERRUPT_LVL6 8
114 #define CYGNUM_HAL_INTERRUPT_LVL7 9
115 #define CYGNUM_HAL_INTERRUPT_LVL8 10
116 #define CYGNUM_HAL_INTERRUPT_LVL9 11
117 #define CYGNUM_HAL_INTERRUPT_LVL10 12
118 #define CYGNUM_HAL_INTERRUPT_LVL11 13
119 #define CYGNUM_HAL_INTERRUPT_LVL12 14
120 #define CYGNUM_HAL_INTERRUPT_LVL13 15
121 #define CYGNUM_HAL_INTERRUPT_LVL14 16
122 #define CYGNUM_HAL_INTERRUPT_RESERVED_3E0 17
123 #define CYGNUM_HAL_INTERRUPT_TMU0_TUNI0 18
124 #define CYGNUM_HAL_INTERRUPT_TMU1_TUNI1 19
125 #define CYGNUM_HAL_INTERRUPT_TMU2_TUNI2 20
126 #define CYGNUM_HAL_INTERRUPT_TMU2_TICPI2 21
127 #define CYGNUM_HAL_INTERRUPT_RTC_ATI 22
128 #define CYGNUM_HAL_INTERRUPT_RTC_PRI 23
129 #define CYGNUM_HAL_INTERRUPT_RTC_CUI 24
130 #define CYGNUM_HAL_INTERRUPT_SCI_ERI 25
131 #define CYGNUM_HAL_INTERRUPT_SCI_RXI 26
132 #define CYGNUM_HAL_INTERRUPT_SCI_TXI 27
133 #define CYGNUM_HAL_INTERRUPT_SCI_TEI 28
134 #define CYGNUM_HAL_INTERRUPT_WDT_ITI 29
135 #define CYGNUM_HAL_INTERRUPT_REF_RCMI 30
136 #define CYGNUM_HAL_INTERRUPT_REF_ROVI 31
138 #ifndef CYGNUM_HAL_ISR_MAX
139 # define CYGNUM_HAL_ISR_MAX CYGNUM_HAL_INTERRUPT_REF_ROVI
142 #define CYGNUM_HAL_ISR_MIN CYGNUM_HAL_INTERRUPT_NMI
143 #define CYGNUM_HAL_ISR_COUNT ( CYGNUM_HAL_ISR_MAX - CYGNUM_HAL_ISR_MIN + 1 )
145 // The vector used by the Real time clock
146 #ifndef CYGNUM_HAL_INTERRUPT_RTC
147 # define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TMU0_TUNI0
150 //--------------------------------------------------------------------------
151 // Exception vectors. These are the values used when passed out to an
152 // external exception handler using cyg_hal_deliver_exception()
154 // The exception indexes are EXPEVT/0x20. Variants may define additional
155 // exception vectors.
157 #define CYGNUM_HAL_EXCEPTION_POWERON 0 // power-on
158 #define CYGNUM_HAL_EXCEPTION_RESET 1 // reset
159 #define CYGNUM_HAL_EXCEPTION_TLBMISS_ACCESS 2 // TLB-miss/invalid load
160 #define CYGNUM_HAL_EXCEPTION_TLBMISS_WRITE 3 // TLB-miss/invalid store
161 #define CYGNUM_HAL_EXCEPTION_INITIAL_WRITE 4 // initial page write
162 #define CYGNUM_HAL_EXCEPTION_TLBERROR_ACCESS 5 // TLB prot violation l
163 #define CYGNUM_HAL_EXCEPTION_TLBERROR_WRITE 6 // TLB prot violation s
164 #define CYGNUM_HAL_EXCEPTION_DATA_ACCESS 7 // address error (load)
165 #define CYGNUM_HAL_EXCEPTION_DATA_WRITE 8 // address error (store)
166 #define CYGNUM_HAL_EXCEPTION_TRAP 11 // unconditional trap
167 #define CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION 12 // reserved instruction
168 #define CYGNUM_HAL_EXCEPTION_ILLEGAL_SLOT_INSTRUCTION 13
169 // illegal instruction in delay slot
170 #define CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP 15 // user breakpoint
172 #define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_EXCEPTION_POWERON
174 #ifndef CYGNUM_HAL_EXCEPTION_MAX
175 # define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_INSTRUCTION_BP
178 #define CYGNUM_HAL_EXCEPTION_COUNT \
179 ( CYGNUM_HAL_EXCEPTION_MAX - CYGNUM_HAL_EXCEPTION_MIN + 1 )
181 #ifndef __ASSEMBLER__
183 #include <cyg/infra/cyg_type.h>
185 #include <cyg/hal/sh_regs.h> // register definitions
186 #include <cyg/hal/hal_io.h> // io macros
187 #include <cyg/infra/cyg_ass.h> // CYG_FAIL
189 //--------------------------------------------------------------------------
190 // Clock control, using TMU counter 0.
192 #define CYGHWR_SH_RTC_TIMER_IS_TMU
194 #define HAL_CLOCK_INITIALIZE( _period_ ) \
196 register cyg_uint8 _tstr_; \
198 /* Disable timer while programming it. */ \
199 HAL_READ_UINT8(CYGARC_REG_TSTR, _tstr_); \
200 _tstr_ &= ~CYGARC_REG_TSTR_STR0; \
201 HAL_WRITE_UINT8(CYGARC_REG_TSTR, _tstr_); \
203 /* Set counter registers. */ \
204 HAL_WRITE_UINT32(CYGARC_REG_TCOR0, (_period_)); \
205 HAL_WRITE_UINT32(CYGARC_REG_TCNT0, (_period_)); \
207 /* Set interrupt on underflow and decrement frequency */ \
208 HAL_WRITE_UINT16(CYGARC_REG_TCR0, CYGARC_REG_TCR_UNIE | \
209 ((4==CYGHWR_HAL_SH_TMU_PRESCALE_0) ? \
210 CYGARC_REG_TCR_TPSC_4 : \
211 (16==CYGHWR_HAL_SH_TMU_PRESCALE_0) ? \
212 CYGARC_REG_TCR_TPSC_16: \
213 (64==CYGHWR_HAL_SH_TMU_PRESCALE_0) ? \
214 CYGARC_REG_TCR_TPSC_64:CYGARC_REG_TCR_TPSC_256)); \
217 /* Enable timer. */ \
218 _tstr_ |= CYGARC_REG_TSTR_STR0; \
219 HAL_WRITE_UINT8(CYGARC_REG_TSTR, _tstr_); \
223 #define HAL_CLOCK_RESET( _vector_, _period_ ) \
225 register cyg_uint16 _tcr_; \
227 /* Clear underflow flag. */ \
228 HAL_READ_UINT16(CYGARC_REG_TCR0, _tcr_); \
229 _tcr_ &= ~CYGARC_REG_TCR_UNF; \
230 HAL_WRITE_UINT16(CYGARC_REG_TCR0, _tcr_); \
231 HAL_READ_UINT16(CYGARC_REG_TCR0, _tcr_); \
235 #define HAL_CLOCK_READ( _pvalue_ ) \
237 register cyg_uint32 _result_; \
239 HAL_READ_UINT32(CYGARC_REG_TCNT0, _result_); \
241 *(_pvalue_) = CYGNUM_KERNEL_COUNTERS_RTC_PERIOD-_result_; \
244 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
245 #define HAL_CLOCK_LATENCY( _pvalue_ ) HAL_CLOCK_READ(_pvalue_)
248 externC void hal_delay_us(int);
249 #define HAL_DELAY_US(n) hal_delay_us(n)
251 #endif // __ASSEMBLER__
253 //--------------------------------------------------------------------------
254 #endif // ifndef CYGONCE_HAL_INTR_EXCEVT_H
255 // End of hal_intr_excevt.h