clock.c
00001 #include <sys/clock.h>
00002 #include <sys/cc.h>
00003 #include <sys/etimer.h>
00004 #include <debug-uart.h>
00005
00006 #include <AT91SAM7S64.h>
00007 #include <sys-interrupt.h>
00008
00009 #define PIV ((MCK/CLOCK_SECOND/16)-1)
00010
00011 static volatile clock_time_t current_clock = 0;
00012 static volatile unsigned long current_seconds = 0;
00013 static unsigned int second_countdown = CLOCK_SECOND;
00014
00015
00016 static int pit_handler_func()
00017 {
00018 if (!(*AT91C_PITC_PISR & AT91C_PITC_PITS)) return 0;
00019
00020 current_clock++;
00021 if(etimer_pending() && etimer_next_expiration_time() <= current_clock) {
00022 etimer_request_poll();
00023
00024
00025 }
00026 if (--second_countdown == 0) {
00027 current_seconds++;
00028 second_countdown = CLOCK_SECOND;
00029 }
00030 (void)*AT91C_PITC_PIVR;
00031 return 1;
00032 }
00033
00034 static SystemInterruptHandler pit_handler = {NULL, pit_handler_func};
00035
00036 void
00037 clock_init()
00038 {
00039 sys_interrupt_append_handler(&pit_handler);
00040 *AT91C_PITC_PIMR = (AT91C_PITC_PITIEN |
00041 AT91C_PITC_PITEN |
00042 PIV);
00043 sys_interrupt_enable();
00044 }
00045
00046 clock_time_t
00047 clock_time(void)
00048 {
00049 return current_clock;
00050 }
00051
00052
00053
00054 #define SPIN_TIME 2
00055 #define SPIN_COUNT (((MCK*SPIN_TIME/1000000)-5)/4)
00056
00057 #ifndef __MAKING_DEPS__
00058
00059 void
00060 clock_delay(unsigned int t)
00061 {
00062 #ifdef __THUMBEL__
00063 asm volatile("1: mov r1,%2\n2:\tsub r1,#1\n\tbne 2b\n\tsub %0,#1\n\tbne 1b\n":"=l"(t):"0"(t),"l"(SPIN_COUNT));
00064 #else
00065 #error Must be compiled in thumb mode
00066 #endif
00067 }
00068
00069 unsigned long
00070 clock_seconds(void)
00071 {
00072 return current_seconds;
00073 }
00074 #endif