/** Sets the current local time and date information. @param Time A pointer to the current time. @retval EFI_SUCCESS The operation completed successfully. @retval EFI_INVALID_PARAMETER A time field is out of range. @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error. **/ EFI_STATUS EFIAPI SetTime ( IN EFI_TIME *Time ) { return LibSetTime (Time); }
/** Sets the current local time and date information. @param Time A pointer to the current time. @retval EFI_SUCCESS The operation completed successfully. @retval EFI_INVALID_PARAMETER A time field is out of range. @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error. **/ EFI_STATUS EFIAPI SetTime ( IN EFI_TIME *Time ) { EFI_STATUS Status; BOOLEAN TimeSettingsChanged; if (Time == NULL || !IsTimeValid (Time)) { return EFI_INVALID_PARAMETER; } TimeSettingsChanged = FALSE; if (mTimeSettings.TimeZone != Time->TimeZone || mTimeSettings.Daylight != Time->Daylight) { mTimeSettings.TimeZone = Time->TimeZone; mTimeSettings.Daylight = Time->Daylight; TimeSettingsChanged = TRUE; } Status = LibSetTime (Time); if (EFI_ERROR (Status)) { return Status; } if (TimeSettingsChanged) { Status = EfiSetVariable ( (CHAR16 *)mTimeSettingsVariableName, &gEfiCallerIdGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, sizeof (mTimeSettings), (VOID *)&mTimeSettings); if (EFI_ERROR (Status)) { return EFI_DEVICE_ERROR; } } return EFI_SUCCESS; }
VOID LibRtcInitialize ( VOID ) { EFI_STATUS Status; RTC_REGISTER_A RegisterA; RTC_REGISTER_B RegisterB; RTC_REGISTER_C RegisterC; RTC_REGISTER_D RegisterD; UINT8 Century; EFI_TIME Time; // // Acquire RTC Lock to make access to RTC atomic // EfiAcquireLock (&mRtc.RtcLock); // // Initialize RTC Register // // Make sure Division Chain is properly configured, // or RTC clock won't "tick" -- time won't increment // RegisterA.Data = RTC_INIT_REGISTER_A; RtcWrite (RTC_ADDRESS_REGISTER_A, RegisterA.Data); // // Read Register B // RegisterB.Data = RtcRead (RTC_ADDRESS_REGISTER_B); // // Clear RTC flag register // RegisterC.Data = RtcRead (RTC_ADDRESS_REGISTER_C); // // Clear RTC register D // RegisterD.Data = RTC_INIT_REGISTER_D; RtcWrite (RTC_ADDRESS_REGISTER_D, RegisterD.Data); // // Wait for up to 0.1 seconds for the RTC to be updated // Status = RtcWaitToUpdate (100000); if (EFI_ERROR (Status)) { EfiReleaseLock (&mRtc.RtcLock); return; } // // Get the Time/Date/Daylight Savings values. // Time.Second = RtcRead (RTC_ADDRESS_SECONDS); Time.Minute = RtcRead (RTC_ADDRESS_MINUTES); Time.Hour = RtcRead (RTC_ADDRESS_HOURS); Time.Day = RtcRead (RTC_ADDRESS_DAY_OF_THE_MONTH); Time.Month = RtcRead (RTC_ADDRESS_MONTH); Time.Year = RtcRead (RTC_ADDRESS_YEAR); ConvertRtcTimeToEfiTime (&Time, RegisterB); if (RtcTestCenturyRegister () == EFI_SUCCESS) { Century = BcdToDecimal ((UINT8) (RtcRead (RTC_ADDRESS_CENTURY) & 0x7f)); } else { Century = BcdToDecimal (RtcRead (RTC_ADDRESS_CENTURY)); } Time.Year = (UINT16) (Century * 100 + Time.Year); // // Set RTC configuration after get original time // RtcWrite (RTC_ADDRESS_REGISTER_B, RTC_INIT_REGISTER_B); // // Release RTC Lock. // EfiReleaseLock (&mRtc.RtcLock); // // Validate time fields // Status = RtcTimeFieldsValid (&Time); if (EFI_ERROR (Status)) { Time.Second = RTC_INIT_SECOND; Time.Minute = RTC_INIT_MINUTE; Time.Hour = RTC_INIT_HOUR; Time.Day = RTC_INIT_DAY; Time.Month = RTC_INIT_MONTH; Time.Year = RTC_INIT_YEAR; } // // Reset time value according to new RTC configuration // LibSetTime (&Time); return; }