Mercurial > ecos-v2_0-branch
annotate packages/hal/arm/arch/current/include/hal_intr.h @ 66:bf00f99aec69 ecos-sw-2000-02-02
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
| author | jlarmour |
|---|---|
| date | Wed, 02 Feb 2000 19:57:02 +0000 |
| parents | c38311975d4f |
| children | 435cced73e2f |
| rev | line source |
|---|---|
| 2 | 1 #ifndef CYGONCE_HAL_INTR_H |
| 2 #define CYGONCE_HAL_INTR_H | |
| 3 | |
| 4 //========================================================================== | |
| 5 // | |
| 6 // hal_intr.h | |
| 7 // | |
| 8 // HAL Interrupt and clock support | |
| 9 // | |
| 10 //========================================================================== | |
| 11 //####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
12 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
13 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
14 // The contents of this file are subject to the Red Hat eCos Public License |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
15 // Version 1.1 (the "License"); you may not use this file except in |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
16 // compliance with the License. You may obtain a copy of the License at |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
17 // http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
18 // |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
19 // Software distributed under the License is distributed on an "AS IS" |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
20 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
21 // License for the specific language governing rights and limitations under |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
22 // the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
23 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
24 // The Original Code is eCos - Embedded Configurable Operating System, |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
25 // released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
26 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
27 // The Initial Developer of the Original Code is Red Hat. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
28 // Portions created by Red Hat are |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
29 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
30 // All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
31 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
26
diff
changeset
|
32 // |
| 2 | 33 //####COPYRIGHTEND#### |
| 34 //========================================================================== | |
| 35 //#####DESCRIPTIONBEGIN#### | |
| 36 // | |
| 37 // Author(s): nickg, gthomas | |
| 38 // Contributors: nickg, gthomas, | |
| 39 // jlarmour | |
| 40 // Date: 1999-02-20 | |
| 41 // Purpose: Define Interrupt support | |
| 42 // Description: The macros defined here provide the HAL APIs for handling | |
| 43 // interrupts and the clock. | |
| 44 // | |
| 45 // Usage: #include <cyg/hal/hal_intr.h> | |
| 46 // ... | |
| 47 // | |
| 48 // | |
| 49 //####DESCRIPTIONEND#### | |
| 50 // | |
| 51 //========================================================================== | |
| 52 | |
| 53 #include <pkgconf/hal.h> | |
| 54 | |
| 55 #include <cyg/infra/cyg_type.h> | |
| 56 #include <cyg/hal/hal_platform_ints.h> | |
| 57 | |
| 58 //-------------------------------------------------------------------------- | |
| 59 // ARM exception vectors. | |
| 60 | |
| 61 // These vectors correspond to VSRs. These values are the ones to use for | |
| 62 // HAL_VSR_GET/SET | |
| 63 | |
|
26
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
64 #define CYGNUM_HAL_VECTOR_RESET 0 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
65 #define CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION 1 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
66 #define CYGNUM_HAL_VECTOR_SOFTWARE_INTERRUPT 2 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
67 #define CYGNUM_HAL_VECTOR_ABORT_PREFETCH 3 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
68 #define CYGNUM_HAL_VECTOR_ABORT_DATA 4 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
69 #define CYGNUM_HAL_VECTOR_reserved 5 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
70 #define CYGNUM_HAL_VECTOR_IRQ 6 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
71 #define CYGNUM_HAL_VECTOR_FIQ 7 |
| 2 | 72 |
| 73 #define CYGNUM_HAL_VSR_MIN 0 | |
|
26
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
74 #define CYGNUM_HAL_VSR_MAX 7 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
75 #define CYGNUM_HAL_VSR_COUNT 8 |
| 2 | 76 |
| 77 // Exception vectors. These are the values used when passed out to an | |
| 78 // external exception handler using cyg_hal_deliver_exception() | |
| 79 | |
| 80 #define CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION \ | |
| 81 CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION | |
| 82 #define CYGNUM_HAL_EXCEPTION_INTERRUPT \ | |
| 83 CYGNUM_HAL_VECTOR_SOFTWARE_INTERRUPT | |
| 84 #define CYGNUM_HAL_EXCEPTION_CODE_ACCESS CYGNUM_HAL_VECTOR_ABORT_PREFETCH | |
| 85 #define CYGNUM_HAL_EXCEPTION_DATA_ACCESS CYGNUM_HAL_VECTOR_ABORT_DATA | |
| 86 #define CYGNUM_HAL_EXCEPTION_FIQ CYGNUM_HAL_VECTOR_FIQ | |
| 87 | |
| 88 #define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION | |
| 89 #define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_EXCEPTION_FIQ | |
| 90 #define CYGNUM_HAL_EXCEPTION_COUNT (CYGNUM_HAL_EXCEPTION_MAX - \ | |
| 91 CYGNUM_HAL_EXCEPTION_MIN + 1) | |
| 92 | |
| 93 //-------------------------------------------------------------------------- | |
| 94 // Static data used by HAL | |
| 95 | |
| 96 // ISR tables | |
| 97 externC volatile CYG_ADDRESS hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT]; | |
| 98 externC volatile CYG_ADDRWORD hal_interrupt_data[CYGNUM_HAL_ISR_COUNT]; | |
| 99 externC volatile CYG_ADDRESS hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT]; | |
| 100 | |
| 101 // VSR table | |
|
26
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
102 //externC volatile CYG_ADDRESS hal_vsr_table[CYGNUM_HAL_VSR_COUNT]; |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
103 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
104 // actually, it is immediately after the hardware vectors |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
105 #define hal_vsr_table ((volatile CYG_ADDRESS *)(0x20)) |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
106 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
107 // and followed by a DRAM size variable used during bootup. This is in a |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
108 // fixed location so that it can be shared between an eCos Stub ROM and a |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
109 // RAM start eCos app. Ie. so that RAM startup code knows DRAM size. |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
110 // If this variable is zero, RAM size is unknown/is the default. |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
8
diff
changeset
|
111 #define hal_dram_size (*(CYG_WORD *)(0x40)) |
| 2 | 112 |
| 113 //-------------------------------------------------------------------------- | |
| 114 // Default ISR | |
| 115 | |
| 116 externC cyg_uint32 hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data); | |
| 117 | |
| 118 //-------------------------------------------------------------------------- | |
| 119 // Interrupt state storage | |
| 120 | |
| 121 typedef cyg_uint32 CYG_INTERRUPT_STATE; | |
| 122 | |
| 123 //-------------------------------------------------------------------------- | |
| 124 // Interrupt control macros | |
| 125 | |
| 126 // Note: This disables both FIQ and IRQ interrupts! | |
| 127 #define HAL_DISABLE_INTERRUPTS(_old_) \ | |
| 128 asm volatile ( \ | |
| 129 "mrs %0,cpsr;" \ | |
| 130 "mrs r4,cpsr;" \ | |
| 131 "orr r4,r4,#0xC0;" \ | |
| 132 "msr cpsr,r4" \ | |
| 133 : "=r"(_old_) \ | |
| 134 : \ | |
| 135 : "r4" \ | |
| 136 ); | |
| 137 | |
| 138 #define HAL_ENABLE_INTERRUPTS() \ | |
| 139 asm volatile ( \ | |
| 140 "mrs r3,cpsr;" \ | |
| 141 "bic r3,r3,#0xC0;" \ | |
| 142 "msr cpsr,r3" \ | |
| 143 : \ | |
| 144 : \ | |
| 145 : "r3" \ | |
| 146 ); | |
| 147 | |
| 148 #define HAL_RESTORE_INTERRUPTS(_old_) \ | |
| 149 asm volatile ( \ | |
| 150 "mrs r3,cpsr;" \ | |
| 151 "and r4,%0,#0xC0;" \ | |
| 152 "bic r3,r3,#0xC0;" \ | |
| 153 "orr r3,r3,r4;" \ | |
| 154 "msr cpsr,r3" \ | |
| 155 : \ | |
| 156 : "r"(_old_) \ | |
| 157 : "r3", "r4" \ | |
| 158 ); | |
| 159 | |
| 160 #define HAL_QUERY_INTERRUPTS(_old_) \ | |
| 161 asm volatile ( \ | |
| 162 "mrs r4,cpsr;" \ | |
| 163 "and r4,r4,#0xC0;" \ | |
| 164 "eor %0,r4,#0xC0;" \ | |
| 165 : "=r"(_old_) \ | |
| 166 : \ | |
| 167 : "r4" \ | |
| 168 ); | |
| 169 | |
| 170 //-------------------------------------------------------------------------- | |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
171 // Routine to execute DSRs using separate interrupt stack |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
172 |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
173 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
174 externC void hal_interrupt_stack_call_pending_DSRs(void); |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
175 #define HAL_INTERRUPT_STACK_CALL_PENDING_DSRS() \ |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
176 hal_interrupt_stack_call_pending_DSRs() |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
177 |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
178 // these are offered solely for stack usage testing |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
179 // if they are not defined, then there is no interrupt stack. |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
180 #define HAL_INTERRUPT_STACK_BASE cyg_interrupt_stack_base |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
181 #define HAL_INTERRUPT_STACK_TOP cyg_interrupt_stack |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
182 // use them to declare these extern however you want: |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
183 // extern char HAL_INTERRUPT_STACK_BASE[]; |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
184 // extern char HAL_INTERRUPT_STACK_TOP[]; |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
185 // is recommended |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
186 #endif |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
187 |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
188 //-------------------------------------------------------------------------- |
| 2 | 189 // Vector translation. |
| 190 | |
| 191 #ifndef HAL_TRANSLATE_VECTOR | |
| 192 #define HAL_TRANSLATE_VECTOR(_vector_,_index_) \ | |
| 193 (_index_) = (_vector_) | |
| 194 #endif | |
| 195 | |
| 196 //-------------------------------------------------------------------------- | |
| 197 // Interrupt and VSR attachment macros | |
| 198 | |
| 199 #define HAL_INTERRUPT_IN_USE( _vector_, _state_) \ | |
| 200 CYG_MACRO_START \ | |
| 201 cyg_uint32 _index_; \ | |
| 202 HAL_TRANSLATE_VECTOR ((_vector_), _index_); \ | |
| 203 \ | |
| 204 if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)hal_default_isr ) \ | |
| 205 (_state_) = 0; \ | |
| 206 else \ | |
| 207 (_state_) = 1; \ | |
| 208 CYG_MACRO_END | |
| 209 | |
| 210 #define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ ) \ | |
| 211 CYG_MACRO_START \ | |
| 212 if( hal_interrupt_handlers[_vector_] == (CYG_ADDRESS)hal_default_isr ) \ | |
| 213 { \ | |
| 214 hal_interrupt_handlers[_vector_] = (CYG_ADDRESS)_isr_; \ | |
| 215 hal_interrupt_data[_vector_] = (CYG_ADDRWORD) _data_; \ | |
| 216 hal_interrupt_objects[_vector_] = (CYG_ADDRESS)_object_; \ | |
| 217 } \ | |
| 218 CYG_MACRO_END | |
| 219 | |
| 220 #define HAL_INTERRUPT_DETACH( _vector_, _isr_ ) \ | |
| 221 CYG_MACRO_START \ | |
| 222 if( hal_interrupt_handlers[_vector_] == (CYG_ADDRESS)_isr_ ) \ | |
| 223 { \ | |
| 224 hal_interrupt_handlers[_vector_] = (CYG_ADDRESS)hal_default_isr; \ | |
| 225 hal_interrupt_data[_vector_] = 0; \ | |
| 226 hal_interrupt_objects[_vector_] = 0; \ | |
| 227 } \ | |
| 228 CYG_MACRO_END | |
| 229 | |
| 230 #define HAL_VSR_GET( _vector_, _pvsr_ ) \ | |
| 231 *(CYG_ADDRESS *)(_pvsr_) = hal_vsr_table[_vector_]; | |
| 232 | |
| 233 | |
| 234 #define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ ) \ | |
| 235 CYG_MACRO_START \ | |
| 236 if( _poldvsr_ != NULL ) \ | |
| 237 *(CYG_ADDRESS *)_poldvsr_ = hal_vsr_table[_vector_]; \ | |
| 238 hal_vsr_table[_vector_] = (CYG_ADDRESS)_vsr_; \ | |
| 239 CYG_MACRO_END | |
| 240 | |
| 241 //-------------------------------------------------------------------------- | |
| 242 // Interrupt controller access | |
| 243 | |
| 244 externC void hal_interrupt_mask(int); | |
| 245 externC void hal_interrupt_unmask(int); | |
| 246 externC void hal_interrupt_acknowledge(int); | |
| 247 externC void hal_interrupt_configure(int, int, int); | |
| 248 externC void hal_interrupt_set_level(int, int); | |
| 249 | |
| 250 #define HAL_INTERRUPT_MASK( _vector_ ) \ | |
| 251 hal_interrupt_mask( _vector_ ) | |
| 252 #define HAL_INTERRUPT_UNMASK( _vector_ ) \ | |
| 253 hal_interrupt_unmask( _vector_ ) | |
| 254 #define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \ | |
| 255 hal_interrupt_acknowledge( _vector_ ) | |
| 256 #define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \ | |
| 257 hal_interrupt_configure( _vector_, _level_, _up_ ) | |
| 258 #define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) \ | |
| 259 hal_interrupt_set_level( _vector_, _level_ ) | |
| 260 | |
| 261 //-------------------------------------------------------------------------- | |
| 262 // Clock control | |
| 263 | |
| 264 externC void hal_clock_initialize(cyg_uint32); | |
| 265 externC void hal_clock_read(cyg_uint32 *); | |
| 266 externC void hal_clock_reset(cyg_uint32, cyg_uint32); | |
| 267 | |
| 268 #define HAL_CLOCK_INITIALIZE( _period_ ) hal_clock_initialize( _period_ ) | |
| 269 #define HAL_CLOCK_RESET( _vec_, _period_ ) hal_clock_reset( _vec_, _period_ ) | |
| 270 #define HAL_CLOCK_READ( _pvalue_ ) hal_clock_read( _pvalue_ ) | |
| 271 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY | |
| 272 #define HAL_CLOCK_LATENCY( _pvalue_ ) HAL_CLOCK_READ( (cyg_uint32 *)_pvalue_ ) | |
| 273 #endif | |
| 274 | |
| 275 //-------------------------------------------------------------------------- | |
| 276 #endif // ifndef CYGONCE_HAL_INTR_H | |
| 277 // End of hal_intr.h |
