summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1998-07-29 00:38:51 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1998-07-29 00:38:51 +0000
commit02733a9613a46083196136a7b216c96292b82cb8 (patch)
tree83dd9e3c918fec79dec2ce32cf357c1c697ee861
parentacac0e8b42b4a599640c612c08d3336f05f55917 (diff)
downloadrtems-02733a9613a46083196136a7b216c96292b82cb8.tar.bz2
New file. Based on merged of shared libchip style console.c and the
existing TOD interface.
-rw-r--r--c/src/lib/libbsp/shared/tod.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/shared/tod.c b/c/src/lib/libbsp/shared/tod.c
new file mode 100644
index 0000000000..c414e9e47b
--- /dev/null
+++ b/c/src/lib/libbsp/shared/tod.c
@@ -0,0 +1,187 @@
+/*
+ * Real Time Clock Driver Wrapper for Libchip
+ *
+ * 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 <rtems.h>
+#include <libchip/rtc.h>
+
+/*
+ * Configuration Information
+ */
+
+extern unsigned long RTC_Count;
+extern rtems_device_minor_number RTC_Minor;
+
+int RTC_Present;
+
+/*
+ * rtc_initialize
+ *
+ * Initialize the RTC driver
+ */
+
+rtems_device_driver rtc_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor_arg,
+ void *arg
+)
+{
+ rtems_device_minor_number minor;
+ rtems_status_code status;
+
+ for (minor=0; minor < RTC_Count ; minor++) {
+ /*
+ * First perform the configuration dependent probe, then the
+ * device dependent probe
+ */
+
+ if (RTC_Table[minor].deviceProbe && RTC_Table[minor].deviceProbe(minor)) {
+ /*
+ * Use this device as the primary RTC
+ */
+ RTC_Minor = minor;
+ RTC_Present = 1;
+ break;
+ }
+ }
+
+ if ( !RTC_Present ) {
+ /*
+ * Failed to find an RTC -- this is not a fatal error.
+ */
+
+ return RTEMS_INVALID_NUMBER;
+ }
+
+ /*
+ * Register and initialize the primary RTC's
+ */
+
+ status = rtems_io_register_name( "/dev/rtc", major, RTC_Minor );
+ if (status != RTEMS_SUCCESSFUL) {
+ rtems_fatal_error_occurred(status);
+ }
+
+ RTC_Table[minor].pDeviceFns->deviceInitialize( RTC_Minor );
+
+ /*
+ * Now initialize any secondary RTC's
+ */
+
+ for ( minor++ ; minor<RTC_Count ; minor++) {
+ /*
+ * First perform the configuration dependent probe, then the
+ * device dependent probe
+ */
+
+ if (RTC_Table[minor].deviceProbe && RTC_Table[minor].deviceProbe(minor)) {
+ status = rtems_io_register_name(
+ RTC_Table[minor].sDeviceName,
+ major,
+ minor );
+ if (status != RTEMS_SUCCESSFUL) {
+ rtems_fatal_error_occurred(status);
+ }
+
+ /*
+ * Initialize the hardware device.
+ */
+
+ RTC_Table[minor].pDeviceFns->deviceInitialize(minor);
+
+ }
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/*PAGE
+ *
+ * This routine copies the time from the real time clock to RTEMS
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+void setRealTimeToRTEMS()
+{
+ rtems_time_of_day rtc_tod;
+
+ if (!RTC_Present)
+ return;
+
+ RTC_Table[RTC_Minor].pDeviceFns->deviceGetTime(RTC_Minor, &rtc_tod);
+ rtems_clock_set( &rtc_tod );
+}
+
+/*PAGE
+ *
+ * setRealTimeFromRTEMS
+ *
+ * This routine copies the time from RTEMS to the real time clock
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+void setRealTimeFromRTEMS()
+{
+ rtems_time_of_day rtems_tod;
+
+ if (!RTC_Present)
+ return;
+
+ rtems_clock_get( RTEMS_CLOCK_GET_TOD, &rtems_tod );
+ RTC_Table[RTC_Minor].pDeviceFns->deviceSetTime(RTC_Minor, &rtems_tod);
+}
+
+/*PAGE
+ *
+ * checkRealTime
+ *
+ * This routine reads the returns the variance betweent the real time and
+ * rtems time.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * int The differance between the real time clock and rtems time or
+ * 9999 in the event of an error.
+ */
+
+int checkRealTime()
+{
+ rtems_time_of_day rtems_tod;
+ rtems_time_of_day rtc_tod;
+
+ if (!RTC_Present)
+ return 0;
+
+ rtems_clock_get( RTEMS_CLOCK_GET_TOD, &rtems_tod );
+ RTC_Table[RTC_Minor].pDeviceFns->deviceGetTime(RTC_Minor, &rtc_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;
+}
+