Contiki 2.6

rtimer-arch.c

00001 #include "rtimer-arch.h"
00002 #include <AT91SAM7S64.h>
00003 #include "rtimer-arch-interrupt.h"
00004 
00005 #define DEBUG 1
00006 #if DEBUG
00007 #include <stdio.h>
00008 #define PRINTF(...) printf(__VA_ARGS__)
00009 #else
00010 #define PRINTF(...)
00011 #endif
00012 
00013 static rtimer_clock_t offset;
00014 
00015 void
00016 rtimer_arch_init(void)
00017 {
00018   offset = 0;
00019   RTIMER_ARCH_TIMER_BASE->TC_CMR =
00020     (AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP | AT91C_TC_CLKS_TIMER_DIV5_CLOCK);
00021   RTIMER_ARCH_TIMER_BASE->TC_RA = 0xffff;
00022   RTIMER_ARCH_TIMER_BASE->TC_IER = AT91C_TC_CPAS;
00023   *AT91C_PMC_PCER = (1 << RTIMER_ARCH_TIMER_ID);
00024   AT91C_AIC_SMR[RTIMER_ARCH_TIMER_ID] =
00025     AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 6;
00026   AT91C_AIC_SVR[RTIMER_ARCH_TIMER_ID] =  (unsigned long)rtimer_interrupt;
00027   *AT91C_AIC_IECR = (1 << RTIMER_ARCH_TIMER_ID);
00028   RTIMER_ARCH_TIMER_BASE->TC_CCR = AT91C_TC_SWTRG | AT91C_TC_CLKEN;
00029   PRINTF("rtimer_arch_init: Done\n");
00030 }
00031 
00032 void
00033 rtimer_arch_schedule(rtimer_clock_t t)
00034 {
00035   RTIMER_ARCH_TIMER_BASE->TC_RA = t + offset;
00036   PRINTF("rtimer_arch_schedule: %d\n",t);
00037 }
00038 
00039 void
00040 rtimer_arch_set(rtimer_clock_t t)
00041 {
00042   offset = t -  RTIMER_ARCH_TIMER_BASE->TC_CV;
00043 }
00044 
00045 rtimer_clock_t
00046 rtimer_arch_now(void)
00047 {
00048   return RTIMER_ARCH_TIMER_BASE->TC_CV + offset;
00049 }