\r
#define PL031_COUNTS_PER_SECOND 1\r
\r
-// Define EPOCH (1970-JANUARY-01) in the Julian Date representation\r
-#define EPOCH_JULIAN_DATE 2440588\r
-\r
-// Seconds per unit\r
-#define SEC_PER_MIN ((UINTN) 60)\r
-#define SEC_PER_HOUR ((UINTN) 3600)\r
-#define SEC_PER_DAY ((UINTN) 86400)\r
-\r
-#define SEC_PER_MONTH ((UINTN) 2,592,000)\r
-#define SEC_PER_YEAR ((UINTN) 31,536,000)\r
-\r
#endif\r
\r
#include <Drivers/PL031RealTimeClock.h>\r
\r
+#include <Library/TimeBaseLib.h>\r
+\r
#include <ArmPlatform.h>\r
\r
STATIC CONST CHAR16 mTimeZoneVariableName[] = L"PL031RtcTimeZone";\r
return Status;\r
}\r
\r
-/**\r
- Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME\r
- **/\r
-VOID\r
-EpochToEfiTime (\r
- IN UINTN EpochSeconds,\r
- OUT EFI_TIME *Time\r
- )\r
-{\r
- UINTN a;\r
- UINTN b;\r
- UINTN c;\r
- UINTN d;\r
- UINTN g;\r
- UINTN j;\r
- UINTN m;\r
- UINTN y;\r
- UINTN da;\r
- UINTN db;\r
- UINTN dc;\r
- UINTN dg;\r
- UINTN hh;\r
- UINTN mm;\r
- UINTN ss;\r
- UINTN J;\r
-\r
- J = (EpochSeconds / 86400) + 2440588;\r
- j = J + 32044;\r
- g = j / 146097;\r
- dg = j % 146097;\r
- c = (((dg / 36524) + 1) * 3) / 4;\r
- dc = dg - (c * 36524);\r
- b = dc / 1461;\r
- db = dc % 1461;\r
- a = (((db / 365) + 1) * 3) / 4;\r
- da = db - (a * 365);\r
- y = (g * 400) + (c * 100) + (b * 4) + a;\r
- m = (((da * 5) + 308) / 153) - 2;\r
- d = da - (((m + 4) * 153) / 5) + 122;\r
-\r
- Time->Year = y - 4800 + ((m + 2) / 12);\r
- Time->Month = ((m + 2) % 12) + 1;\r
- Time->Day = d + 1;\r
-\r
- ss = EpochSeconds % 60;\r
- a = (EpochSeconds - ss) / 60;\r
- mm = a % 60;\r
- b = (a - mm) / 60;\r
- hh = b % 24;\r
-\r
- Time->Hour = hh;\r
- Time->Minute = mm;\r
- Time->Second = ss;\r
- Time->Nanosecond = 0;\r
-\r
-}\r
-\r
-/**\r
- Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC)\r
- **/\r
-UINTN\r
-EfiTimeToEpoch (\r
- IN EFI_TIME *Time\r
- )\r
-{\r
- UINTN a;\r
- UINTN y;\r
- UINTN m;\r
- UINTN JulianDate; // Absolute Julian Date representation of the supplied Time\r
- UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY\r
- UINTN EpochSeconds;\r
-\r
- a = (14 - Time->Month) / 12 ;\r
- y = Time->Year + 4800 - a;\r
- m = Time->Month + (12*a) - 3;\r
-\r
- JulianDate = Time->Day + ((153*m + 2)/5) + (365*y) + (y/4) - (y/100) + (y/400) - 32045;\r
-\r
- ASSERT (JulianDate >= EPOCH_JULIAN_DATE);\r
- EpochDays = JulianDate - EPOCH_JULIAN_DATE;\r
-\r
- EpochSeconds = (EpochDays * SEC_PER_DAY) + ((UINTN)Time->Hour * SEC_PER_HOUR) + (Time->Minute * SEC_PER_MIN) + Time->Second;\r
-\r
- return EpochSeconds;\r
-}\r
-\r
-BOOLEAN\r
-IsLeapYear (\r
- IN EFI_TIME *Time\r
- )\r
-{\r
- if (Time->Year % 4 == 0) {\r
- if (Time->Year % 100 == 0) {\r
- if (Time->Year % 400 == 0) {\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
- } else {\r
- return TRUE;\r
- }\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-BOOLEAN\r
-DayValid (\r
- IN EFI_TIME *Time\r
- )\r
-{\r
- STATIC CONST INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
-\r
- if (Time->Day < 1 ||\r
- Time->Day > DayOfMonth[Time->Month - 1] ||\r
- (Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28))\r
- ) {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
/**\r
Returns the current time and date information, and the time-keeping capabilities\r
of the hardware platform.\r
(Time->Year > 9999) ||\r
(Time->Month < 1 ) ||\r
(Time->Month > 12 ) ||\r
- (!DayValid (Time) ) ||\r
+ (!IsDayValid (Time) ) ||\r
(Time->Hour > 23 ) ||\r
(Time->Minute > 59 ) ||\r
(Time->Second > 59 ) ||\r