From 9c448e1db38c6dd64c885ddfb3fe28de33cd037b Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 19 Feb 1999 00:22:33 +0000 Subject: BSP for Vista Score603e added. --- c/src/lib/libbsp/powerpc/score603e/tod/tod_g1.c | 138 ++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 c/src/lib/libbsp/powerpc/score603e/tod/tod_g1.c (limited to 'c/src/lib/libbsp/powerpc/score603e/tod/tod_g1.c') diff --git a/c/src/lib/libbsp/powerpc/score603e/tod/tod_g1.c b/c/src/lib/libbsp/powerpc/score603e/tod/tod_g1.c new file mode 100644 index 0000000000..6366cf662a --- /dev/null +++ b/c/src/lib/libbsp/powerpc/score603e/tod/tod_g1.c @@ -0,0 +1,138 @@ +/* + * Real Time Clock (SGS-Thomson M48T08/M48T18) for RTEMS + * + * This part is only found on the first generation board. + * + * Based on MVME162 TOD Driver by: + * 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. + * + * $Id$ + */ + +#include +#include +#include + +/* + * These routines are M48T08 and M48T18 dependent and should be in + * a separate support library. + */ + +static int M48T08_GetField( + volatile unsigned char *mk48t08, + int n, + unsigned char mask +) +{ + unsigned char x; + + x = mk48t08[n] & mask; + return ((x >> 4) * 10) + (x & 0x0f); +} + +static void M48T08_SetField( + volatile unsigned char *mk48t08, + int n, + unsigned char d +) +{ + mk48t08[n] = ((d / 10) << 4) + (d % 10); +} + +static void M48T08_GetTOD( + volatile unsigned char *mk48t08, + rtems_time_of_day *rtc_tod +) +{ + int year; + + mk48t08[0] |= 0x40; /* Stop read register */ + + year = M48T08_GetField( mk48t08, 7, 0xff ); + if ( year >= 88 ) + year += 1900; + else + year += 2000; + + rtc_tod->year = year; + rtc_tod->month = M48T08_GetField( mk48t08, 6, 0x1f ); + rtc_tod->day = M48T08_GetField( mk48t08, 5, 0x3f ); + rtc_tod->hour = M48T08_GetField( mk48t08, 3, 0x3f ); + rtc_tod->minute = M48T08_GetField( mk48t08, 2, 0x7f ); + rtc_tod->second = M48T08_GetField( mk48t08, 1, 0x7f ); + rtc_tod->ticks = 0; + mk48t08[0] &= 0x3f; /* Release read register */ +} + +static void M48T08_SetTOD( + volatile unsigned char *mk48t08, + rtems_time_of_day *rtc_tod +) +{ + int year; + + year = rtc_tod->year; + + if ( year >= 2088 ) /* plan ahead :) */ + rtems_fatal_error_occurred( 0xBAD0BAD0 ); + + if ( year >= 2000 ) + year -= 2000; + else + year -= 1900; + + mk48t08[0] |= 0x80; /* Stop write register */ + M48T08_SetField( mk48t08, 7, year ); + M48T08_SetField( mk48t08, 6, rtc_tod->month ); + M48T08_SetField( mk48t08, 5, rtc_tod->day ); + M48T08_SetField( mk48t08, 4, 1 ); /* I don't know which day of week is */ + M48T08_SetField( mk48t08, 3, rtc_tod->hour ); + M48T08_SetField( mk48t08, 2, rtc_tod->minute ); + M48T08_SetField( mk48t08, 1, rtc_tod->second ); + mk48t08[0] &= 0x3f; /* Write these parameters */ +} + +/* + * This code is dependent on the Vista 603e's use of the M48T18 RTC/NVRAM + * and should remain in this file. + */ + +void setRealTimeToRTEMS() +{ + rtems_time_of_day rtc_tod; + + M48T08_GetTOD( SCORE603E_RTC_ADDRESS, &rtc_tod ); + rtems_clock_set( &rtc_tod ); +} + +void setRealTimeFromRTEMS() +{ + rtems_time_of_day rtems_tod; + + rtems_clock_get( RTEMS_CLOCK_GET_TOD, &rtems_tod ); + M48T08_SetTOD( SCORE603E_RTC_ADDRESS, &rtems_tod ); +} + +int checkRealTime() +{ + rtems_time_of_day rtems_tod; + rtems_time_of_day rtc_tod; + + M48T08_GetTOD( SCORE603E_RTC_ADDRESS, &rtc_tod ); + rtems_clock_get( RTEMS_CLOCK_GET_TOD, &rtems_tod ); + + if( rtems_tod.year == rtc_tod.year && + rtems_tod.month == rtc_tod.month && + rtems_tod.day == rtc_tod.day ) { + return ((rtems_tod.hour - rtc_tod.hour) * 3600) + + ((rtems_tod.minute - rtc_tod.minute) * 60) + + (rtems_tod.second - rtc_tod.second); + } + return 9999; +} -- cgit v1.2.3