diff options
Diffstat (limited to 'c/src/lib/libbsp/m68k/mvme162/tod/tod.c')
-rw-r--r-- | c/src/lib/libbsp/m68k/mvme162/tod/tod.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/m68k/mvme162/tod/tod.c b/c/src/lib/libbsp/m68k/mvme162/tod/tod.c new file mode 100644 index 0000000000..67efadaf53 --- /dev/null +++ b/c/src/lib/libbsp/m68k/mvme162/tod/tod.c @@ -0,0 +1,90 @@ +/* + * Real Time Clock (MK48T08) for RTEMS on MVME162 + * + * Author: + * COPYRIGHT (C) 1997 + * by Katsutoshi Shibuya - BU Denken Co.,Ltd. - Sapporo - JAPAN + * ALL RIGHTS RESERVED + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * This material is a part of the MVME162 Board Support Package + * for the RTEMS executive. Its licensing policies are those of the + * RTEMS above. + * + * $Id$ + */ + +#include <rtems.h> +#include <tod.h> + +#define tod ((volatile unsigned char *)0xfffc1ff8) + +static int getTod(int n, unsigned char mask) +{ + unsigned char x; + + x = tod[n]&mask; + return (x>>4)*10+(x&0x0f); +} + +static void setTod(int n, unsigned char d) +{ + tod[n] = ((d/10)<<4)+(d%10); +} + +void setRealTimeToRTEMS() +{ + rtems_time_of_day t; + + tod[0] |= 0x40; /* Stop read register */ + t.year = 1900+getTod(7,0xff); + t.month = getTod(6,0x1f); + t.day = getTod(5,0x3f); + t.hour = getTod(3,0x3f); + t.minute = getTod(2,0x7f); + t.second = getTod(1,0x7f); + t.ticks = 0; + tod[0] &= 0x3f; /* Release read register */ + + rtems_clock_set(&t); +} + +void setRealTimeFromRTEMS() +{ + rtems_time_of_day t; + + rtems_clock_get(RTEMS_CLOCK_GET_TOD,&t); + t.year -= 1900; + + tod[0] |= 0x80; /* Stop write register */ + setTod(7,t.year); + setTod(6,t.month); + setTod(5,t.day); + setTod(4,1); /* I don't know which day of week is */ + setTod(3,t.hour); + setTod(2,t.minute); + setTod(1,t.second); + tod[0] &= 0x3f; /* Write these parameters */ +} + +int checkRealTime() +{ + rtems_time_of_day t; + int d; + + tod[0] |= 0x40; /* Stop read register */ + rtems_clock_get(RTEMS_CLOCK_GET_TOD,&t); + if((t.year != 1900+getTod(7,0xff)) + || (t.month != getTod(6,0x1f)) + || (t.day != getTod(5,0x3f))) + d = 9999; + else + d = (t.hour-getTod(3,0x3f))*3600 + + (t.minute-getTod(3,0x7f))*60 + + (t.second - getTod(1,0x7f)); + tod[1] &= 0x3f; + return d; +} |