summaryrefslogtreecommitdiffstats
path: root/private/ntos/fw/mips/jztime.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/fw/mips/jztime.c')
-rw-r--r--private/ntos/fw/mips/jztime.c415
1 files changed, 415 insertions, 0 deletions
diff --git a/private/ntos/fw/mips/jztime.c b/private/ntos/fw/mips/jztime.c
new file mode 100644
index 000000000..d57296de6
--- /dev/null
+++ b/private/ntos/fw/mips/jztime.c
@@ -0,0 +1,415 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ jztime.c
+
+Abstract:
+
+ This module contains the code to set the Jazz time.
+
+Author:
+
+ David M. Robinson (davidro) 25-Oct-1991
+
+Revision History:
+
+--*/
+
+
+
+#include "jzsetup.h"
+
+//
+// Static Data
+//
+
+PVOID JzEisaControlBase;
+PVOID JzRealTimeClockBase;
+ULONG LastTime = 0;
+
+
+UCHAR
+JzReadClockRegister (
+ UCHAR Register
+ )
+
+/*++
+
+Routine Description:
+
+ This routine reads the specified realtime clock register.
+
+Arguments:
+
+ Register - Supplies the number of the register whose value is read.
+
+Return Value:
+
+ The value of the register is returned as the function value.
+
+--*/
+
+{
+
+ UCHAR DataByte;
+
+ //
+ // Read the EISA NMI enable register, insert the realtime clock register
+ // number, and write the value back to the EISA NMI enable register. This
+ // selects the realtime clock register that is read.
+ //
+
+ DataByte = READ_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI);
+ DataByte = (DataByte & 0x80) | Register;
+ WRITE_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI, DataByte);
+
+ //
+ // Read the realtime clock register value.
+ //
+
+ DataByte = READ_REGISTER_UCHAR((PUCHAR)JzRealTimeClockBase);
+ return DataByte;
+}
+
+VOID
+JzWriteClockRegister (
+ UCHAR Register,
+ UCHAR Value
+ )
+
+/*++
+
+Routine Description:
+
+ This routine writes the specified value to the specified realtime
+ clock register.
+
+Arguments:
+
+ Register - Supplies the number of the register whose value is written.
+
+ Value - Supplies the value that is written to the specified register.
+
+Return Value:
+
+ The value of the register is returned as the function value.
+
+--*/
+
+{
+ UCHAR DataByte;
+
+ //
+ // Read the EISA NMI enable register, insert the realtime clock register
+ // number, and write the value back to the EISA NMI enable register. This
+ // selects the realtime clock register that is written.
+ //
+
+ DataByte = READ_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI);
+ DataByte = (DataByte & 0x80) | Register;
+ WRITE_REGISTER_UCHAR((PUCHAR)JzEisaControlBase + EISA_NMI, DataByte);
+
+ //
+ // Write the realtime clock register value.
+ //
+
+ WRITE_REGISTER_UCHAR((PUCHAR)JzRealTimeClockBase, Value);
+ return;
+}
+
+VOID
+JzWriteTime (
+ IN PTIME_FIELDS TimeFields
+ )
+
+/*++
+
+Routine Description:
+
+ This routine sets the realtime clock.
+
+ N.B. This routine assumes that the caller has provided any required
+ synchronization to set the realtime clock information.
+
+Arguments:
+
+ TimeFields - Supplies a pointer to a time structure that specifies the
+ realtime clock information.
+
+Return Value:
+
+ If the power to the realtime clock has not failed, then the time
+ values are written to the realtime clock and a value of TRUE is
+ returned. Otherwise, a value of FALSE is returned.
+
+--*/
+
+{
+
+ UCHAR DataByte;
+
+ //
+ // If the realtime clock battery is still functioning, then write
+ // the realtime clock values, and return a function value of TRUE.
+ // Otherwise, return a function value of FALSE.
+ //
+
+ DataByte = JzReadClockRegister(RTC_CONTROL_REGISTERD);
+ if (((PRTC_CONTROL_REGISTER_D)(&DataByte))->ValidTime == 1) {
+
+ //
+ // Set the realtime clock control to set the time.
+ //
+
+ DataByte = 0;
+ ((PRTC_CONTROL_REGISTER_B)(&DataByte))->HoursFormat = 1;
+ ((PRTC_CONTROL_REGISTER_B)(&DataByte))->DataMode = 1;
+ ((PRTC_CONTROL_REGISTER_B)(&DataByte))->SetTime = 1;
+ JzWriteClockRegister(RTC_CONTROL_REGISTERB, DataByte);
+
+ //
+ // Write the realtime clock values.
+ //
+
+ JzWriteClockRegister(RTC_YEAR, (UCHAR)(TimeFields->Year - 1980));
+ JzWriteClockRegister(RTC_MONTH, (UCHAR)TimeFields->Month);
+ JzWriteClockRegister(RTC_DAY_OF_MONTH, (UCHAR)TimeFields->Day);
+ JzWriteClockRegister(RTC_DAY_OF_WEEK, (UCHAR)(TimeFields->Weekday + 1));
+ JzWriteClockRegister(RTC_HOUR, (UCHAR)TimeFields->Hour);
+ JzWriteClockRegister(RTC_MINUTE, (UCHAR)TimeFields->Minute);
+ JzWriteClockRegister(RTC_SECOND, (UCHAR)TimeFields->Second);
+
+ //
+ // Set the realtime clock control to update the time.
+ //
+
+ ((PRTC_CONTROL_REGISTER_B)(&DataByte))->SetTime = 0;
+ JzWriteClockRegister(RTC_CONTROL_REGISTERB, DataByte);
+ return;
+
+ } else {
+ return;
+ }
+}
+
+
+VOID
+JzSetTime (
+ VOID
+ )
+
+/*++
+
+Routine Description:
+
+Arguments:
+
+Return Value:
+
+--*/
+
+{
+
+ UCHAR Character;
+ ULONG Count;
+ PTIME_FIELDS TimeFields;
+ TIME Time;
+ CHAR TimeString[80];
+ CHAR DateString[80];
+ PCHAR StartToken;
+ PCHAR EndToken;
+ GETSTRING_ACTION Action;
+
+ //
+ // Set addresses for RTC access.
+ //
+
+ JzEisaControlBase = (PVOID)EISA_IO_VIRTUAL_BASE;
+ JzRealTimeClockBase = (PVOID)RTC_VIRTUAL_BASE;
+
+ JzSetPosition( 3, 5);
+ JzPrint(JZ_ENTER_DATE_MSG);
+ do {
+ Action = FwGetString( DateString,
+ sizeof(DateString),
+ NULL,
+ 3,
+ 5 + strlen(JZ_ENTER_DATE_MSG));
+ if (Action == GetStringEscape) {
+ return;
+ }
+ } while ( Action != GetStringSuccess );
+
+ JzSetPosition( 4, 5);
+ JzPrint(JZ_ENTER_TIME_MSG);
+ do {
+ Action = FwGetString( TimeString,
+ sizeof(TimeString),
+ NULL,
+ 4,
+ 5 + strlen(JZ_ENTER_TIME_MSG));
+ if (Action == GetStringEscape) {
+ return;
+ }
+ } while ( Action != GetStringSuccess );
+
+ //
+ // Get time
+ //
+
+ TimeFields = ArcGetTime();
+
+ StartToken = DateString;
+ if (*StartToken != 0) {
+ EndToken = strchr(StartToken, '-');
+ if (EndToken != NULL) {
+ *EndToken = 0;
+ TimeFields->Month = atoi(StartToken);
+ StartToken = EndToken + 1;
+ }
+
+ EndToken = strchr(StartToken, '-');
+ if (EndToken != NULL) {
+ *EndToken = 0;
+ TimeFields->Day = atoi(StartToken);
+ StartToken = EndToken + 1;
+ TimeFields->Year = atoi(StartToken);
+ if (TimeFields->Year < 100) {
+ if (TimeFields->Year < 80) {
+ TimeFields->Year += 2000;
+ } else {
+ TimeFields->Year += 1900;
+ }
+ }
+ }
+ }
+
+ StartToken = TimeString;
+ if (*StartToken != 0) {
+ EndToken = strchr(StartToken, ':');
+
+ if (EndToken != NULL) {
+ *EndToken = 0;
+ TimeFields->Hour = atoi(StartToken);
+ StartToken = EndToken + 1;
+ }
+
+ EndToken = strchr(StartToken, ':');
+ if (EndToken != NULL) {
+ *EndToken = 0;
+ TimeFields->Minute = atoi(StartToken);
+ StartToken = EndToken + 1;
+ TimeFields->Second = atoi(StartToken);
+ } else {
+ TimeFields->Minute = atoi(StartToken);
+ TimeFields->Second = 0;
+ }
+
+ }
+
+ if (!RtlTimeFieldsToTime(TimeFields, &Time)) {
+ JzSetPosition( 5, 5);
+ JzPrint(JZ_ILLEGAL_TIME_MSG);
+ JzPrint(JZ_PRESS_KEY2_MSG);
+ ArcRead(ARC_CONSOLE_INPUT, &Character, 1, &Count);
+ } else {
+ RtlTimeToTimeFields( &Time, TimeFields);
+ JzWriteTime(TimeFields);
+ }
+
+}
+
+VOID
+JzShowTime (
+ BOOLEAN First
+ )
+
+/*++
+
+Routine Description:
+
+Arguments:
+
+ First - If TRUE then don't check LastTime.
+
+Return Value:
+
+--*/
+
+{
+
+ PTIME_FIELDS TimeFields;
+ TIME Time;
+ BOOLEAN Pm;
+ ULONG ThisTime;
+
+ //
+ // Set addresses for RTC access.
+ //
+
+ JzEisaControlBase = (PVOID)EISA_IO_VIRTUAL_BASE;
+ JzRealTimeClockBase = (PVOID)RTC_VIRTUAL_BASE;
+
+ //
+ // See if the time has changed since last time we were called. This is
+ // for when the display is over the serial port, so we don't blast
+ // characters out all the time.
+ //
+
+ ThisTime = ArcGetRelativeTime();
+ if (!First && (ThisTime == LastTime)) {
+
+ //
+ // Stall to get rid of the "whistle" on Jazz.
+ //
+
+ JzStallExecution(1000);
+ return;
+ }
+ LastTime = ThisTime;
+
+ //
+ // Get and display time.
+ //
+
+ TimeFields = ArcGetTime();
+
+ JzSetPosition( 0, 44);
+ JzPrint("%s, ", Weekday[TimeFields->Weekday]);
+ JzPrint("%d-", TimeFields->Month);
+ JzPrint("%d-", TimeFields->Day);
+ JzPrint("%d ", TimeFields->Year);
+
+ if (TimeFields->Hour >= 12) {
+ Pm = TRUE;
+ } else {
+ Pm = FALSE;
+ }
+
+ if (TimeFields->Hour > 12) {
+ TimeFields->Hour -= 12;
+ } else if (TimeFields->Hour == 0) {
+ TimeFields->Hour = 12;
+ }
+
+ JzPrint("%d:", TimeFields->Hour);
+ JzPrint("%02d:", TimeFields->Minute);
+ JzPrint("%02d ", TimeFields->Second);
+ if (Pm) {
+ JzPrint(JZ_PM);
+ } else {
+ JzPrint(JZ_AM);
+ }
+
+ //
+ // Clear anything to the end of the line.
+ //
+
+ JzPrint("%cK", ASCII_CSI);
+
+ return;
+
+}