Contiki 2.5
rtimer-arch.c
1 #include "rtimer-arch.h"
2 #include <AT91SAM7S64.h>
3 #include "rtimer-arch-interrupt.h"
4 
5 #define DEBUG 1
6 #if DEBUG
7 #include <stdio.h>
8 #define PRINTF(...) printf(__VA_ARGS__)
9 #else
10 #define PRINTF(...)
11 #endif
12 
13 static rtimer_clock_t offset;
14 
15 void
16 rtimer_arch_init(void)
17 {
18  offset = 0;
19  RTIMER_ARCH_TIMER_BASE->TC_CMR =
20  (AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP | AT91C_TC_CLKS_TIMER_DIV5_CLOCK);
21  RTIMER_ARCH_TIMER_BASE->TC_RA = 0xffff;
22  RTIMER_ARCH_TIMER_BASE->TC_IER = AT91C_TC_CPAS;
23  *AT91C_PMC_PCER = (1 << RTIMER_ARCH_TIMER_ID);
24  AT91C_AIC_SMR[RTIMER_ARCH_TIMER_ID] =
25  AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 6;
26  AT91C_AIC_SVR[RTIMER_ARCH_TIMER_ID] = (unsigned long)rtimer_interrupt;
27  *AT91C_AIC_IECR = (1 << RTIMER_ARCH_TIMER_ID);
28  RTIMER_ARCH_TIMER_BASE->TC_CCR = AT91C_TC_SWTRG | AT91C_TC_CLKEN;
29  PRINTF("rtimer_arch_init: Done\n");
30 }
31 
32 void
33 rtimer_arch_schedule(rtimer_clock_t t)
34 {
35  RTIMER_ARCH_TIMER_BASE->TC_RA = t + offset;
36  PRINTF("rtimer_arch_schedule: %d\n",t);
37 }
38 
39 void
40 rtimer_arch_set(rtimer_clock_t t)
41 {
42  offset = t - RTIMER_ARCH_TIMER_BASE->TC_CV;
43 }
44 
45 rtimer_clock_t
46 rtimer_arch_now(void)
47 {
48  return RTIMER_ARCH_TIMER_BASE->TC_CV + offset;
49 }