summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/kernel.c51
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
257void 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
277static 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
256int tick_add_task(void (*f)(void)) 307int tick_add_task(void (*f)(void))