+++ /dev/null
-/** @file\r
-*\r
-* Copyright (c) 2011, ARM Limited. All rights reserved.\r
-*\r
-* SPDX-License-Identifier: BSD-2-Clause-Patent\r
-*\r
-**/\r
-\r
-#include <Uefi.h>\r
-\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/IoLib.h>\r
-\r
-#include <Protocol/RealTimeClock.h>\r
-#include <Protocol/EmbeddedExternalDevice.h>\r
-\r
-#include <Omap3530/Omap3530.h>\r
-#include <TPS65950.h>\r
-\r
-\r
-EMBEDDED_EXTERNAL_DEVICE *gTPS65950;\r
-INT16 TimeZone = EFI_UNSPECIFIED_TIMEZONE;\r
-\r
-/**\r
- Returns the current time and date information, and the time-keeping capabilities\r
- of the hardware platform.\r
-\r
- @param Time A pointer to storage to receive a snapshot of the current time.\r
- @param Capabilities An optional pointer to a buffer to receive the real time clock\r
- device's capabilities.\r
-\r
- @retval EFI_SUCCESS The operation completed successfully.\r
- @retval EFI_INVALID_PARAMETER Time is NULL.\r
- @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-LibGetTime (\r
- OUT EFI_TIME *Time,\r
- OUT EFI_TIME_CAPABILITIES *Capabilities\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 Data;\r
- EFI_TPL OldTpl;\r
-\r
- if (Time == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- OldTpl = gBS->RaiseTPL(TPL_NOTIFY);\r
-\r
- /* Get time and date */\r
- ZeroMem(Time, sizeof(EFI_TIME));\r
-\r
- // Latch values\r
- Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, RTC_CTRL_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
- Data |= BIT6;\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, RTC_CTRL_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
-\r
- // Read registers\r
- Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, YEARS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
- Time->Year = 2000 + ((Data >> 4) & 0xF) * 10 + (Data & 0xF);\r
-\r
- Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, MONTHS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
- Time->Month = ((Data >> 4) & 0x1) * 10 + (Data & 0xF);\r
-\r
- Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, DAYS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
- Time->Day = ((Data >> 4) & 0x3) * 10 + (Data & 0xF);\r
-\r
- Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, HOURS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
- Time->Hour = ((Data >> 4) & 0x3) * 10 + (Data & 0xF);\r
-\r
- Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, MINUTES_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
- Time->Minute = ((Data >> 4) & 0x7) * 10 + (Data & 0xF);\r
-\r
- Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, SECONDS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
- Time->Second = ((Data >> 4) & 0x7) * 10 + (Data & 0xF);\r
-\r
- Time->TimeZone = TimeZone;\r
- // TODO: check what to use here\r
- Time->Daylight = EFI_TIME_ADJUST_DAYLIGHT;\r
-\r
- // Set capabilities\r
-\r
- // TODO: Set real capabilities\r
- if (Capabilities != NULL) {\r
- Capabilities->Resolution = 1;\r
- Capabilities->Accuracy = 50000000;\r
- Capabilities->SetsToZero = FALSE;\r
- }\r
-\r
-EXIT:\r
- gBS->RestoreTPL(OldTpl);\r
-\r
- return (Status == EFI_SUCCESS) ? Status : EFI_DEVICE_ERROR;\r
-}\r
-\r
-/**\r
- Sets the current local time and date information.\r
-\r
- @param Time A pointer to the current time.\r
-\r
- @retval EFI_SUCCESS The operation completed successfully.\r
- @retval EFI_INVALID_PARAMETER A time field is out of range.\r
- @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-LibSetTime (\r
- IN EFI_TIME *Time\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 Data;\r
- UINT8 MonthDayCount[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
- EFI_TPL OldTpl;\r
-\r
- // Input validation according both to UEFI spec and hardware constraints\r
- // UEFI spec says valid year range is 1900-9999 but TPS only supports 2000-2099\r
- if ( (Time == NULL)\r
- || (Time->Year < 2000 || Time->Year > 2099)\r
- || (Time->Month < 1 || Time->Month > 12)\r
- || (Time->Day < 1 || Time->Day > MonthDayCount[Time->Month])\r
- || (Time->Hour > 23)\r
- || (Time->Minute > 59)\r
- || (Time->Second > 59)\r
- || (Time->Nanosecond > 999999999)\r
- || ((Time->TimeZone < -1440 || Time->TimeZone > 1440) && Time->TimeZone != 2047)\r
- ) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- OldTpl = gBS->RaiseTPL(TPL_NOTIFY);\r
-\r
- Data = Time->Year - 2000;\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, YEARS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
-\r
- Data = ((Time->Month / 10) << 4) | (Time->Month % 10);\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, MONTHS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
-\r
- Data = ((Time->Day / 10) << 4) | (Time->Day % 10);\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, DAYS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
-\r
- Data = ((Time->Hour / 10) << 4) | (Time->Hour % 10);\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, HOURS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
-\r
- Data = ((Time->Minute / 10) << 4) | (Time->Minute % 10);\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, MINUTES_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
-\r
- Data = ((Time->Second / 10) << 4) | (Time->Second % 10);\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, SECONDS_REG), 1, &Data);\r
- if (Status != EFI_SUCCESS) goto EXIT;\r
-\r
- TimeZone = Time->TimeZone;\r
-\r
-EXIT:\r
- gBS->RestoreTPL(OldTpl);\r
-\r
- return (Status == EFI_SUCCESS) ? Status : EFI_DEVICE_ERROR;\r
-}\r
-\r
-/**\r
- Returns the current wakeup alarm clock setting.\r
-\r
- @param Enabled Indicates if the alarm is currently enabled or disabled.\r
- @param Pending Indicates if the alarm signal is pending and requires acknowledgement.\r
- @param Time The current alarm setting.\r
-\r
- @retval EFI_SUCCESS The alarm settings were returned.\r
- @retval EFI_INVALID_PARAMETER Any parameter is NULL.\r
- @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-LibGetWakeupTime (\r
- OUT BOOLEAN *Enabled,\r
- OUT BOOLEAN *Pending,\r
- OUT EFI_TIME *Time\r
- )\r
-{\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-/**\r
- Sets the system wakeup alarm clock time.\r
-\r
- @param Enabled Enable or disable the wakeup alarm.\r
- @param Time If Enable is TRUE, the time to set the wakeup alarm for.\r
-\r
- @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled. If\r
- Enable is FALSE, then the wakeup alarm was disabled.\r
- @retval EFI_INVALID_PARAMETER A time field is out of range.\r
- @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error.\r
- @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-LibSetWakeupTime (\r
- IN BOOLEAN Enabled,\r
- OUT EFI_TIME *Time\r
- )\r
-{\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-/**\r
- This is the declaration of an EFI image entry point. This can be the entry point to an application\r
- written to this specification, an EFI boot service driver, or an EFI runtime driver.\r
-\r
- @param ImageHandle Handle that identifies the loaded image.\r
- @param SystemTable System Table for this image.\r
-\r
- @retval EFI_SUCCESS The operation completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-LibRtcInitialize (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE Handle;\r
- UINT8 Data;\r
- EFI_TPL OldTpl;\r
-\r
- Status = gBS->LocateProtocol (&gEmbeddedExternalDeviceProtocolGuid, NULL, (VOID **)&gTPS65950);\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- OldTpl = gBS->RaiseTPL(TPL_NOTIFY);\r
- Data = 1;\r
- Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, RTC_CTRL_REG), 1, &Data);\r
- ASSERT_EFI_ERROR(Status);\r
- gBS->RestoreTPL(OldTpl);\r
-\r
- // Setup the setters and getters\r
- gRT->GetTime = LibGetTime;\r
- gRT->SetTime = LibSetTime;\r
- gRT->GetWakeupTime = LibGetWakeupTime;\r
- gRT->SetWakeupTime = LibSetWakeupTime;\r
-\r
- // Install the protocol\r
- Handle = NULL;\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &Handle,\r
- &gEfiRealTimeClockArchProtocolGuid, NULL,\r
- NULL\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Fixup internal data so that EFI can be call in virtual mode.\r
- Call the passed in Child Notify event and convert any pointers in\r
- lib to virtual mode.\r
-\r
- @param[in] Event The Event that is being processed\r
- @param[in] Context Event Context\r
-**/\r
-VOID\r
-EFIAPI\r
-LibRtcVirtualNotifyEvent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-{\r
- return;\r
-}\r