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