diff options
-rw-r--r-- | firmware/kernel.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 221f8a3b38..7ca165c512 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -251,6 +251,57 @@ void TIMER0(void) | |||
251 | 251 | ||
252 | TER0 = 0xff; /* Clear all events */ | 252 | TER0 = 0xff; /* Clear all events */ |
253 | } | 253 | } |
254 | |||
255 | #elif CONFIG_CPU == TCC730 | ||
256 | |||
257 | void TIMER0(void) | ||
258 | { | ||
259 | int i; | ||
260 | |||
261 | /* Run through the list of tick tasks */ | ||
262 | for(i = 0;i < MAX_NUM_TICK_TASKS;i++) | ||
263 | { | ||
264 | if(tick_funcs[i]) | ||
265 | { | ||
266 | tick_funcs[i](); | ||
267 | } | ||
268 | } | ||
269 | |||
270 | current_tick++; | ||
271 | wake_up_thread(); | ||
272 | |||
273 | /* re-enable timer by clearing the counter */ | ||
274 | TACON |= 0x80; | ||
275 | } | ||
276 | |||
277 | static void tick_start(unsigned int interval_in_ms) | ||
278 | { | ||
279 | u32 count; | ||
280 | count = (long)FREQ * (long)interval_in_ms / 1000 / 16; | ||
281 | |||
282 | if(count > 0xffffL) | ||
283 | { | ||
284 | panicf("Error! The tick interval is too long (%dms->%x)\n", | ||
285 | interval_in_ms, count); | ||
286 | return; | ||
287 | } | ||
288 | |||
289 | /* Use timer A */ | ||
290 | TAPRE = 0x0; | ||
291 | TADATA = (u16)count; | ||
292 | |||
293 | TACON = 0x89; | ||
294 | /* counter clear; */ | ||
295 | /* interval mode; */ | ||
296 | /* TICS = F(osc) / 16 */ | ||
297 | /* TCS = internal clock */ | ||
298 | /* enable */ | ||
299 | |||
300 | /* enable the interrupt */ | ||
301 | interruptVector[2] = TIMER0; | ||
302 | IMR0 |= (1<<2); | ||
303 | } | ||
304 | |||
254 | #endif | 305 | #endif |
255 | 306 | ||
256 | int tick_add_task(void (*f)(void)) | 307 | int tick_add_task(void (*f)(void)) |