Mercurial > ecos
annotate packages/devs/watchdog/current/src/mn10300.cxx @ 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 |
|---|---|
| 0 | 1 //========================================================================== |
| 2 // | |
| 2 | 3 // watchdog/mn10300.cxx |
| 0 | 4 // |
| 2 | 5 // Watchdog implementation for MN10300 |
| 0 | 6 // |
| 7 //========================================================================== | |
| 8 //####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
diff
changeset
|
9 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
diff
changeset
|
10 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
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:
34
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:
34
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:
34
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:
34
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:
34
diff
changeset
|
19 // the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
diff
changeset
|
20 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
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:
34
diff
changeset
|
22 // released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
diff
changeset
|
23 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
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:
34
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:
34
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:
34
diff
changeset
|
27 // All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
diff
changeset
|
28 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
34
diff
changeset
|
29 // |
| 0 | 30 //####COPYRIGHTEND#### |
| 31 //========================================================================== | |
| 32 //#####DESCRIPTIONBEGIN#### | |
| 33 // | |
| 2 | 34 // Author(s): nickg |
| 35 // Contributors: nickg | |
| 36 // Date: 1999-02-18 | |
| 37 // Purpose: Watchdog class implementation | |
| 38 // Description: Contains an implementation of the Watchdog class for use | |
| 39 // with the MN10300 hardware watchdog timer. | |
| 0 | 40 // |
| 41 //####DESCRIPTIONEND#### | |
| 42 // | |
| 43 //========================================================================== | |
| 44 | |
| 45 #include <pkgconf/system.h> // system configuration file | |
| 46 #include <pkgconf/watchdog.h> // configuration for this package | |
| 47 | |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
48 #if defined(CYGPKG_HAL_MN10300) && !defined(CYGIMP_WATCHDOG_EMULATE) |
| 0 | 49 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
50 #include <pkgconf/kernel.h> // Kernel config |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
51 |
| 0 | 52 #include <cyg/kernel/ktypes.h> // base kernel types |
| 53 #include <cyg/infra/cyg_trac.h> // tracing macros | |
| 54 #include <cyg/infra/cyg_ass.h> // assertion macros | |
| 55 #include <cyg/kernel/instrmnt.h> // instrumentation | |
| 56 | |
| 57 #include <cyg/hal/hal_io.h> // IO register access | |
| 58 | |
| 59 #include <cyg/kernel/sched.hxx> // scheduler | |
| 60 #include <cyg/kernel/intr.hxx> // interrupts | |
| 61 | |
| 62 #include <cyg/kernel/sched.inl> // scheduler inlines | |
| 63 | |
| 64 #include <cyg/devs/watchdog.hxx> // my header | |
| 65 | |
| 66 // ------------------------------------------------------------------------- | |
| 67 // MN10300 watchdog timer registers | |
| 68 | |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
69 #if defined(CYGPKG_HAL_MN10300_AM31) |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
70 |
| 0 | 71 #define WATCHDOG_BASE 0x34004000 |
| 72 #define WATCHDOG_COUNTER (WATCHDOG_BASE) | |
| 73 #define WATCHDOG_CONTROL (WATCHDOG_BASE+2) | |
| 74 #define WATCHDOG_RESET (WATCHDOG_BASE+4) | |
| 75 | |
| 76 #define WATCHDOG_WDCK0 0x07 | |
| 77 #define WATCHDOG_WDCK0_DEFAULT 0x04 // 1016.801ms cycle | |
| 78 #define WATCHDOG_WDRST 0x40 | |
| 79 #define WATCHDOG_WDCNE 0x80 | |
| 80 | |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
81 #define WATCHDOG_RESOLUTION 1016801000 // cycle time in nanoseconds |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
82 |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
83 #else |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
84 |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
85 #error Unsupported MN10300 variant |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
86 |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
87 #endif |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
88 |
| 0 | 89 // ------------------------------------------------------------------------- |
| 90 // Forward definitions | |
| 91 | |
| 92 static cyg_ISR watchdog_isr; | |
| 93 static cyg_DSR watchdog_dsr; | |
| 94 | |
| 95 // ------------------------------------------------------------------------- | |
| 96 // Statics | |
| 97 | |
| 98 // A static pointer to the single system defined watchdog device. | |
| 99 Cyg_Watchdog Cyg_Watchdog::watchdog; | |
| 100 | |
| 101 // Interrupt object | |
| 102 static Cyg_Interrupt interrupt( | |
| 2 | 103 CYGNUM_HAL_INTERRUPT_WATCHDOG, |
| 0 | 104 0, |
| 105 0, | |
| 106 watchdog_isr, | |
| 107 watchdog_dsr | |
| 108 ); | |
| 109 | |
| 110 // ------------------------------------------------------------------------- | |
| 111 // Constructor | |
| 112 | |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
113 |
| 0 | 114 Cyg_Watchdog::Cyg_Watchdog() |
| 115 { | |
| 116 CYG_REPORT_FUNCTION(); | |
| 117 | |
| 118 action_list = 0; | |
| 119 | |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
120 resolution = WATCHDOG_RESOLUTION; |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
121 |
| 0 | 122 CYG_REPORT_RETURN(); |
| 123 } | |
| 124 | |
| 125 // ------------------------------------------------------------------------- | |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
126 // Return reset resolution |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
127 |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
128 cyg_uint64 Cyg_Watchdog::get_resolution() |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
129 { |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
130 return resolution; |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
131 } |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
132 |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
133 |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
134 // ------------------------------------------------------------------------- |
| 0 | 135 // Start the watchdog running. |
| 136 | |
| 2 | 137 void |
| 138 Cyg_Watchdog::start() | |
| 0 | 139 { |
| 140 CYG_REPORT_FUNCTION(); | |
| 141 | |
| 142 interrupt.attach(); | |
| 143 | |
| 144 HAL_WRITE_UINT8( WATCHDOG_COUNTER, 0 ); | |
| 145 | |
| 146 // Set overflow cycle | |
| 147 // Enable and reset counter | |
| 148 HAL_WRITE_UINT8( WATCHDOG_CONTROL, | |
| 149 WATCHDOG_WDCK0_DEFAULT|WATCHDOG_WDCNE|WATCHDOG_WDRST); | |
| 150 | |
| 151 CYG_REPORT_RETURN(); | |
| 152 } | |
| 153 | |
| 154 // ------------------------------------------------------------------------- | |
| 155 // Reset watchdog timer. This needs to be called regularly to prevent | |
| 156 // the watchdog firing. | |
| 157 | |
| 2 | 158 void |
| 159 Cyg_Watchdog::reset() | |
| 0 | 160 { |
| 161 CYG_REPORT_FUNCTION(); | |
| 162 | |
| 163 cyg_uint8 ctrl; | |
| 164 | |
| 165 HAL_READ_UINT8( WATCHDOG_CONTROL, ctrl ); | |
| 166 | |
| 167 ctrl |= WATCHDOG_WDRST; | |
| 168 | |
| 169 HAL_WRITE_UINT8( WATCHDOG_CONTROL, ctrl ); | |
| 170 | |
| 171 CYG_REPORT_RETURN(); | |
| 172 } | |
| 173 | |
| 174 // ------------------------------------------------------------------------- | |
| 175 // Trigger the watchdog as if the timer had expired. | |
| 176 | |
| 2 | 177 void |
| 178 Cyg_Watchdog::trigger() | |
| 0 | 179 { |
| 180 CYG_REPORT_FUNCTION(); | |
| 181 | |
| 182 Cyg_Scheduler::lock(); | |
| 183 | |
| 184 // Disable interrupt just in case | |
| 185 interrupt.detach(); | |
| 186 | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
187 // Turn watchdog off to prevent it re-triggering. |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
188 HAL_WRITE_UINT8( WATCHDOG_CONTROL, 0 ); |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
189 |
| 0 | 190 Cyg_Watchdog_Action *act = action_list; |
| 191 | |
| 192 while( 0 != act ) | |
| 193 { | |
| 194 act->action( act->data ); | |
| 195 | |
| 196 act = act->next; | |
| 197 } | |
| 198 | |
| 199 Cyg_Scheduler::unlock(); | |
| 200 | |
| 201 CYG_REPORT_RETURN(); | |
| 202 } | |
| 203 | |
| 204 // ------------------------------------------------------------------------- | |
| 205 // Register an action routine that will be called when the timer | |
| 206 // triggers. | |
| 207 | |
| 2 | 208 void |
| 209 Cyg_Watchdog::install_action( Cyg_Watchdog_Action *action ) | |
| 0 | 210 { |
| 211 CYG_REPORT_FUNCTION(); | |
| 212 | |
| 213 Cyg_Scheduler::lock(); | |
| 214 | |
| 215 action->next = action_list; | |
| 216 action_list = action; | |
| 217 | |
| 218 Cyg_Scheduler::unlock(); | |
| 219 | |
| 220 CYG_REPORT_RETURN(); | |
| 221 } | |
| 222 | |
| 223 // ------------------------------------------------------------------------- | |
| 224 // Deregister a previously registered action routine. | |
| 225 | |
| 2 | 226 void |
| 227 Cyg_Watchdog::uninstall_action( Cyg_Watchdog_Action *action ) | |
| 0 | 228 { |
| 229 CYG_REPORT_FUNCTION(); | |
| 230 | |
| 231 Cyg_Scheduler::lock(); | |
| 232 | |
| 233 Cyg_Watchdog_Action **act_ptr = &action_list; | |
| 234 | |
| 235 while( 0 != *act_ptr ) | |
| 236 { | |
| 237 Cyg_Watchdog_Action *a = *act_ptr; | |
| 238 | |
| 239 if( a == action ) | |
| 240 { | |
| 241 *act_ptr = a->next; | |
| 242 break; | |
| 243 } | |
| 244 act_ptr = &a->next; | |
| 245 } | |
| 246 | |
| 247 Cyg_Scheduler::unlock(); | |
| 248 | |
| 249 CYG_REPORT_RETURN(); | |
| 250 } | |
| 251 | |
| 252 // ------------------------------------------------------------------------- | |
| 253 // ISR and DSR | |
| 254 | |
| 2 | 255 cyg_uint32 |
| 256 watchdog_isr( cyg_vector vector, CYG_ADDRWORD data) | |
| 0 | 257 { |
| 258 CYG_REPORT_FUNCTION(); | |
| 259 | |
| 260 Cyg_Watchdog::watchdog.trigger(); | |
| 261 | |
| 262 CYG_REPORT_RETURN(); | |
| 263 | |
| 2 | 264 // FIXME: why is this 0??? why not Cyg_Interrupt::HANDLED? - Jifl |
| 0 | 265 return 0; |
| 266 } | |
| 267 | |
| 2 | 268 void |
| 269 watchdog_dsr(cyg_vector vector, cyg_ucount32 count, CYG_ADDRWORD data) | |
| 0 | 270 { |
| 271 } | |
| 272 | |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
24
diff
changeset
|
273 #endif // defined(CYGPKG_HAL_MN10300) && |
| 2 | 274 // !defined(CYGIMP_WATCHDOG_EMULATE) |
| 0 | 275 // ------------------------------------------------------------------------- |
| 276 // EOF watchdog/mn10300.cxx |
