Mercurial > ecos
annotate packages/hal/arm/pid/current/src/pid_misc.c @ 112:02ea4320376c ecos-sw-2000-07-21
Merge from eCos master repository on 2000-07-21-21:01:39-BST
| author | jlarmour |
|---|---|
| date | Fri, 21 Jul 2000 21:34:11 +0000 |
| parents | ff3f181b64bd |
| children | 25e238959bae |
| rev | line source |
|---|---|
| 2 | 1 //========================================================================== |
| 2 // | |
| 3 // pid_misc.c | |
| 4 // | |
| 5 // HAL misc board support code for ARM PID7 | |
| 6 // | |
| 7 //========================================================================== | |
| 8 //####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
9 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
10 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
11 // 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
|
12 // 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:
50
diff
changeset
|
13 // 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
|
14 // http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
15 // |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
16 // 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:
50
diff
changeset
|
17 // 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:
50
diff
changeset
|
18 // 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:
50
diff
changeset
|
19 // the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
20 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
21 // 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:
50
diff
changeset
|
22 // released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
23 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
24 // 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:
50
diff
changeset
|
25 // Portions created by Red Hat are |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
27 // All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
28 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
50
diff
changeset
|
29 // |
| 2 | 30 //####COPYRIGHTEND#### |
| 31 //========================================================================== | |
| 32 //#####DESCRIPTIONBEGIN#### | |
| 33 // | |
| 34 // Author(s): gthomas | |
| 35 // Contributors: gthomas | |
| 36 // Date: 1999-02-20 | |
| 37 // Purpose: HAL board support | |
| 38 // Description: Implementations of HAL board interfaces | |
| 39 // | |
| 40 //####DESCRIPTIONEND#### | |
| 41 // | |
| 42 //===========================================================================*/ | |
| 43 | |
| 44 #include <pkgconf/hal.h> | |
| 45 | |
| 46 #include <cyg/infra/cyg_type.h> // base types | |
| 47 #include <cyg/infra/cyg_trac.h> // tracing macros | |
| 48 #include <cyg/infra/cyg_ass.h> // assertion macros | |
| 49 | |
| 50 #include <cyg/hal/hal_io.h> // IO macros | |
| 51 #include <cyg/hal/hal_arch.h> // Register state info | |
| 52 #include <cyg/hal/hal_diag.h> | |
| 53 #include <cyg/hal/hal_intr.h> // necessary? | |
|
108
ff3f181b64bd
Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
66
diff
changeset
|
54 #include <cyg/hal/hal_if.h> // calling interface |
| 2 | 55 |
| 56 /*------------------------------------------------------------------------*/ | |
| 57 // On-board timer | |
| 58 /*------------------------------------------------------------------------*/ | |
| 59 | |
| 60 // Timer registers | |
| 61 #define CYG_DEVICE_TIMER_BASE 0x0A800020 | |
| 62 #define CYG_DEVICE_TIMER_LOAD \ | |
| 63 ((volatile cyg_uint32 *) (CYG_DEVICE_TIMER_BASE + 0x00)) | |
| 64 // Load value, read/write | |
| 65 #define CYG_DEVICE_TIMER_CURRENT \ | |
| 66 ((volatile cyg_uint32 *) (CYG_DEVICE_TIMER_BASE + 0x04)) | |
| 67 // Current value, read | |
| 68 #define CYG_DEVICE_TIMER_CONTROL \ | |
| 69 ((volatile cyg_uint32 *) (CYG_DEVICE_TIMER_BASE + 0x08)) | |
| 70 // Control register, read/write | |
| 71 #define CYG_DEVICE_TIMER_CLEAR \ | |
| 72 ((volatile cyg_uint32 *) (CYG_DEVICE_TIMER_BASE + 0x0C)) | |
| 73 // Clears interrrupt, write only | |
| 74 | |
| 75 // Clock/timer control register | |
| 76 #define CTL_ENABLE 0x80 // Bit 7: 1 - counter enabled | |
| 77 #define CTL_DISABLE 0x00 // 0 - counter disabled | |
| 78 #define CTL_FREERUN 0x00 // Bit 6: 0 - free running counter | |
| 79 #define CTL_PERIODIC 0x40 // 1 - periodic timer mode | |
| 80 #define CTL_SCALE_1 0x00 // Bits 32: 00 - Scale clock by 1 | |
| 81 #define CTL_SCALE_16 0x04 // 01 - Scale by 16 | |
| 82 #define CTL_SCALE_256 0x08 // 10 - Scale by 256 | |
| 83 // 12.8us/tick | |
| 84 | |
| 85 // Interrupt controller registers | |
| 86 #define CYG_DEVICE_ICTL_BASE 0x0A000000 | |
| 87 #define CYG_DEVICE_IRQ_Status \ | |
| 88 ((volatile cyg_uint32 *) (CYG_DEVICE_ICTL_BASE + 0x00)) | |
| 89 // Current status, read only | |
| 90 #define CYG_DEVICE_IRQ_Enable \ | |
| 91 ((volatile cyg_uint32 *) (CYG_DEVICE_ICTL_BASE + 0x08)) | |
| 92 // Enable status, read only | |
| 93 #define CYG_DEVICE_IRQ_EnableSet \ | |
| 94 ((volatile cyg_uint32 *) (CYG_DEVICE_ICTL_BASE + 0x08)) | |
| 95 // Enable (1's only), write only | |
| 96 #define CYG_DEVICE_IRQ_EnableClear \ | |
| 97 ((volatile cyg_uint32 *) (CYG_DEVICE_ICTL_BASE + 0x0C)) | |
| 98 // Disable (1's only), write only | |
| 99 | |
| 100 static cyg_uint32 _period; | |
| 101 | |
| 102 void hal_clock_initialize(cyg_uint32 period) | |
| 103 { | |
| 104 //diag_init(); diag_printf("%s(%d)\n", __PRETTY_FUNCTION__, period); | |
| 105 //diag_printf("psr = %x\n", psr()); | |
| 106 HAL_WRITE_UINT32(CYG_DEVICE_TIMER_CONTROL, CTL_DISABLE); // Turn off | |
| 107 HAL_WRITE_UINT32(CYG_DEVICE_TIMER_LOAD, period); | |
| 108 HAL_WRITE_UINT32(CYG_DEVICE_TIMER_CONTROL, | |
| 109 CTL_ENABLE | CTL_PERIODIC | CTL_SCALE_16); | |
| 110 _period = period; | |
| 111 } | |
| 112 | |
| 113 void hal_clock_reset(cyg_uint32 vector, cyg_uint32 period) | |
| 114 { | |
| 115 //diag_init(); diag_printf("%s\n", __PRETTY_FUNCTION__); | |
| 116 HAL_WRITE_UINT32(CYG_DEVICE_TIMER_CLEAR, 0); | |
| 117 _period = period; | |
| 118 } | |
| 119 | |
| 120 void hal_clock_read(cyg_uint32 *pvalue) | |
| 121 { | |
| 122 cyg_uint32 value; | |
| 123 // diag_init(); diag_printf("%s\n", __PRETTY_FUNCTION__); | |
| 124 HAL_READ_UINT32(CYG_DEVICE_TIMER_CURRENT, value); | |
| 125 value &= 0xFFFF; | |
| 126 *pvalue = _period - (value & 0xFFFF); // Note: counter is only 16 bits | |
| 127 // and decreases | |
| 128 } | |
| 129 | |
| 130 void hal_hardware_init(void) | |
| 131 { | |
| 132 // Any hardware/platform initialization that needs to be done. | |
| 133 HAL_WRITE_UINT32(CYG_DEVICE_IRQ_EnableClear, 0xFFFF); // Clear all | |
| 134 // interrupt sources | |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
108
diff
changeset
|
135 // FIXME: The line with the thumb check is a hack, allowing |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
108
diff
changeset
|
136 // the farm to run test. Problem is that virtual vector table |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
108
diff
changeset
|
137 // API needs to be ARM/Thumb consistent. Will fix later. |
|
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
108
diff
changeset
|
138 #ifndef __thumb__ |
|
108
ff3f181b64bd
Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
66
diff
changeset
|
139 // Set up eCos/ROM interfaces |
|
ff3f181b64bd
Merge from eCos master repository on 2000-07-04-20:42:44-BST
jlarmour
parents:
66
diff
changeset
|
140 hal_if_init(); |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
108
diff
changeset
|
141 #endif |
| 2 | 142 } |
| 143 | |
| 144 // | |
| 145 // This routine is called to respond to a hardware interrupt (IRQ). It | |
| 146 // should interrogate the hardware and return the IRQ vector number. | |
| 147 | |
| 148 int hal_IRQ_handler(void) | |
| 149 { | |
| 150 // Do hardware-level IRQ handling | |
| 151 int irq_status, vector; | |
| 152 HAL_READ_UINT32(CYG_DEVICE_IRQ_Status, irq_status); | |
| 153 //diag_init(); diag_printf("%s, status: %x\n", __PRETTY_FUNCTION__, irq_status); | |
| 154 for (vector = 1; vector < 16; vector++) { | |
| 155 if (irq_status & (1<<vector)) return vector; | |
| 156 } | |
| 157 return CYGNUM_HAL_INTERRUPT_unused; // This shouldn't happen! | |
| 158 } | |
| 159 | |
| 160 // | |
| 161 // Interrupt control | |
| 162 // | |
| 163 | |
| 164 void hal_interrupt_mask(int vector) | |
| 165 { | |
| 166 //diag_init(); diag_printf("%s(%d)\n", __PRETTY_FUNCTION__, vector); | |
| 167 HAL_WRITE_UINT32(CYG_DEVICE_IRQ_EnableClear, 1<<vector); | |
| 168 } | |
| 169 | |
| 170 #if 0 | |
| 171 void hal_interrupt_status(void) | |
| 172 { | |
| 173 int irq_status, irq_enable, timer_status, timer_value, timer_load; | |
| 174 HAL_READ_UINT32(CYG_DEVICE_IRQ_Status, irq_status); | |
| 175 HAL_READ_UINT32(CYG_DEVICE_IRQ_Enable, irq_enable); | |
| 176 HAL_READ_UINT32(CYG_DEVICE_TIMER_LOAD, timer_load); | |
| 177 HAL_READ_UINT32(CYG_DEVICE_TIMER_CURRENT, timer_value); | |
| 178 HAL_READ_UINT32(CYG_DEVICE_TIMER_CONTROL, timer_status); | |
| 179 diag_printf("Interrupt: IRQ: %x.%x, TIMER: %x.%x.%x, psr: %x\n", | |
| 180 irq_status, irq_enable, timer_status, timer_value, | |
| 181 timer_load, psr()); | |
| 182 } | |
| 183 #endif | |
| 184 | |
| 185 void hal_interrupt_unmask(int vector) | |
| 186 { | |
| 187 //diag_init(); diag_printf("%s(%d)\n", __PRETTY_FUNCTION__, vector); | |
| 188 HAL_WRITE_UINT32(CYG_DEVICE_IRQ_EnableSet, 1<<vector); | |
| 189 } | |
| 190 | |
| 191 void hal_interrupt_acknowledge(int vector) | |
| 192 { | |
| 193 //diag_init(); diag_printf("%s(%d)\n", __PRETTY_FUNCTION__, vector); | |
| 194 } | |
| 195 | |
| 196 void hal_interrupt_configure(int vector, int level, int up) | |
| 197 { | |
| 198 //diag_init(); diag_printf("%s(%d,%d,%d)\n", __PRETTY_FUNCTION__, vector, level, up); | |
| 199 } | |
| 200 | |
| 201 void hal_interrupt_set_level(int vector, int level) | |
| 202 { | |
| 203 //diag_init(); diag_printf("%s(%d,%d)\n", __PRETTY_FUNCTION__, vector, level); | |
| 204 } | |
| 205 | |
| 206 void hal_show_IRQ(int vector, int data, int handler) | |
| 207 { | |
| 208 // diag_printf("IRQ - vector: %x, data: %x, handler: %x\n", vector, data, handler); | |
| 209 } | |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
2
diff
changeset
|
210 |
| 2 | 211 /*---------------------------------------------------------------------------*/ |
| 212 /* End of hal_misc.c */ |
