The unified diff between revisions [8760ae92..] and [253c6510..] is displayed below. It can also be downloaded as a raw diff.
This diff has been restricted to the following files: 'timer.c'
# # old_revision [8760ae9232295422550b79f09e55122390704b3c] # new_revision [253c65100e2208e0b8c93178896f5aab89e4ec0b] # # patch "timer.c" # from [cd7a8d69e6c6dcdc33683f9f6dfcc98c62d77b4d] # to [9ef2a6c50a8a227103c6c98477c1ce62327a0977] # ============================================================ --- timer.c cd7a8d69e6c6dcdc33683f9f6dfcc98c62d77b4d +++ timer.c 9ef2a6c50a8a227103c6c98477c1ce62327a0977 @@ -1,4 +1,7 @@ #include "timer.h" +#include "interrupt.h" +#include "uart.h" +#include "event.h" #define TIMER0BASE 0xE0004000 #define TIMER1BASE 0xE0008000 @@ -28,16 +31,34 @@ #define TCR_ENABLE (1<<0) #define TCR_RESET (1<<1) +#define MR0I (1<<0) +#define MR0R (1<<1) +#define MR0S (1<<2) +#define MR1I (1<<3) +#define MR1R (1<<4) +#define MR1S (1<<5) +#define MR2I (1<<6) +#define MR2R (1<<7) +#define MR2S (1<<8) +#define MR3I (1<<9) +#define MR3R (1<<10) +#define MR3S (1<<11) + +void __attribute__((interrupt("IRQ"))) timer_interrupt_handler(void); + +void timer_event_handler(void); + void init_timer(void) { TREG(TCR) = TCR_ENABLE | TCR_RESET; TREG(CTCR) = 0; /* Use PCLK */ - TREG(TC) = 0; - TREG(PR) = TIMER_PRESCALE ; - TREG(PC) = 0; + TWREG(TC) = 0; + TWREG(PR) = TIMER_PRESCALE ; + TWREG(PC) = 0; TREG(TCR) = TCR_ENABLE; + event_register(EVENT_TIMER, timer_event_handler); } unsigned int timer_read(void) @@ -51,3 +72,30 @@ void timer_delay_clocks(unsigned int clo while (((signed int) (time-TWREG(TC))) > 0); } +void timer_set_period(unsigned int period) +{ + TWREG(MR0) = period; + TWREG(MCR) = MR0I | MR0R; + interrupt_register(TIMER0, timer_interrupt_handler); +} + +void __attribute__((interrupt("IRQ"))) timer_interrupt_handler(void) +{ + unsigned int ir; + ir = TREG(IR); + TREG(IR) = ir; + + if (ir & (1<<0)) { + /* Match channel 0 */ + putstr(" *timer0* "); + } + + event_set(EVENT_TIMER); + + interrupt_clear(); +} + +void timer_event_handler(void) +{ + putstr(" *t0event* "); +}