From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from huawei.com (huawei.com [45.249.212.35]) by mx.groups.io with SMTP id smtpd.web10.9096.1589884230568650608 for ; Tue, 19 May 2020 03:30:31 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: huawei.com, ip: 45.249.212.35, mailfrom: huangming23@huawei.com) Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 16212C3AECCE041CA42A; Tue, 19 May 2020 18:30:29 +0800 (CST) Received: from [127.0.0.1] (10.78.51.60) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.487.0; Tue, 19 May 2020 18:30:21 +0800 Subject: Re: [RFC edk2-platforms v1 2/2] Silicon/Hisilicon: Add RX8900RealTimeClockLib To: Leif Lindholm CC: , , , , , References: <1589809044-59210-1-git-send-email-huangming23@huawei.com> <1589809044-59210-3-git-send-email-huangming23@huawei.com> <20200518181336.GI10467@vanye> From: Ming Huang Message-ID: <51d99ea3-e875-5b2b-83f2-40441ed32b75@huawei.com> Date: Tue, 19 May 2020 18:30:21 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <20200518181336.GI10467@vanye> X-Originating-IP: [10.78.51.60] X-CFilter-Loop: Reflected Content-Type: text/plain; charset="gbk" Content-Transfer-Encoding: quoted-printable =D4=DA 2020/5/19 2:13, Leif Lindholm =D0=B4=B5=C0: > On Mon, May 18, 2020 at 21:37:24 +0800, Ming Huang wrote: >> There are some boards base on D06, but use RX8900 RTC, >> so upstream the RX8900RealTimeClockLib. >> >> Contributed-under: TianoCore Contribution Agreement 1.1 >> Signed-off-by: Ming Huang >> --- >> Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClock.= h | 41 ++ >> Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClockL= ib.c | 468 ++++++++++++++++++++ >> Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeClockL= ib.inf | 33 ++ >> 3 files changed, 542 insertions(+) >> >> diff --git a/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900Re= alTimeClock.h b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900Re= alTimeClock.h >> new file mode 100644 >> index 0000000..6bcef10 >> --- /dev/null >> +++ b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeC= lock.h >> @@ -0,0 +1,41 @@ >> +/** @file >> + >> + Copyright (c) 2020, Hisilicon Limited. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#ifndef __RX8900_REAL_TIME_CLOCK_H__ >> +#define __RX8900_REAL_TIME_CLOCK_H__ >=20 > Please drop leading __. Ok. >=20 >> + >> +#define RX8900_REGADDR_SECONDS 0x00 >> +#define RX8900_REGADDR_MIUTES 0x01 >> +#define RX8900_REGADDR_HOURS 0x02 >> +#define RX8900_REGADDR_DAY 0x03 >> +#define RX8900_REGADDR_DATE 0x04 >> +#define RX8900_REGADDR_MONTH 0x05 >> +#define RX8900_REGADDR_YEAR 0x06 >> +#define RX8900_REGADDR_RAM 0x07 >> +#define RX8900_REGADDR_ALARMMIN 0x08 >> +#define RX8900_REGADDR_ALARMHOUR 0x09 >> +#define RX8900_REGADDR_ALARMDAY 0x0A >> +#define RX8900_REGADDR_ALARMWEEK 0x0A >> +#define RX8900_REGADDR_TIMECOUNTER_0 0x0B >> +#define RX8900_REGADDR_TIMECOUNTER_1 0x0C >> +#define RX8900_REGADDR_EXTENSIONREG 0x0D >> +#define RX8900_REGADDR_FLAGREG 0x0E >> +#define RX8900_REGADDR_CONTRLREG 0xF >> +#define RX8900_REGADDR_BACKUP_FUN 0x18 >> + >> +#define RX8900_VDETOFF_SWOFF 0x0C >> +#define TEMPERATURE_COMPENSATION_2S 0x40 >> +#define OUTPUT_FREQUENCY_32768 0x0C >> +#define FLAG_REG_DEFAULT 0x00 >> +#define RX8900_RAM_REG_DEFAULT 0x5A >> + >> + >> +#define RTC_DELAY_1000_MACROSECOND 1000 >=20 > Please keep this definition in RtcHelperLib.h. Ok, Modify in v2. Thanks, Ming >=20 > / > Leif >=20 >> +#define EFI_TIMEOFFSET_TIMEZONE 0x5A0 >> + >> +#endif >> diff --git a/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900Re= alTimeClockLib.c b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX890= 0RealTimeClockLib.c >> new file mode 100644 >> index 0000000..bb124fd >> --- /dev/null >> +++ b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeC= lockLib.c >> @@ -0,0 +1,468 @@ >> +/** @file >> + >> + Copyright (c) 2020, Hisilicon Limited. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include "RX8900RealTimeClock.h" >> + >> +extern I2C_DEVICE gRtcDevice; >> + >> +STATIC BOOLEAN mRX8900Initialized =3D FALSE; >> +STATIC CONST CHAR16 mTimeZoneVariableName[] =3D L"RX8900RtcTimeZone"= ; >> +STATIC CONST CHAR16 mDaylightVariableName[] =3D L"RX8900RtcDaylight"= ; >> + >> +EFI_STATUS >> +InitializeRX8900 ( >> + VOID >> + ) >> +{ >> + EFI_STATUS Status; >> + unsigned char writeTemp; >> + >> + Status =3D SwitchRtcI2cChannelAndLock (); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + >> + Status =3D I2CInit (gRtcDevice.Socket, gRtcDevice.Port, Normal); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + >> + writeTemp =3D RX8900_VDETOFF_SWOFF; >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_BACKUP_FUN, 1, &wr= iteTemp); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + writeTemp =3D TEMPERATURE_COMPENSATION_2S; >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_CONTRLREG, 1, &wri= teTemp); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + writeTemp =3D OUTPUT_FREQUENCY_32768; >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_EXTENSIONREG, 1, &= writeTemp); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + >> + writeTemp =3D FLAG_REG_DEFAULT; >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_FLAGREG, 1, &write= Temp); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + writeTemp =3D RX8900_RAM_REG_DEFAULT; >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_RAM, 1, &writeTemp= ); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + >> + mRX8900Initialized =3D TRUE; >> + >> + EXIT: >> + >> + ReleaseOwnershipOfRtc (); >> + return Status; >> +} >> + >> +STATIC >> +INT16 >> +GetTimeZone ( >> + VOID >> + ) >> +{ >> + EFI_STATUS Status; >> + INT16 TimeZone; >> + UINTN Size; >> + >> + TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; >> + Size =3D sizeof (TimeZone); >> + Status =3D EfiGetVariable ( >> + (CHAR16 *)mTimeZoneVariableName, >> + &gEfiCallerIdGuid, >> + NULL, >> + &Size, >> + (VOID *)&TimeZone >> + ); >> + >> + if (EFI_ERROR (Status)) { >> + TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; >> + // The time zone variable does not exist in non-volatile storage,= so create it. >> + Status =3D EfiSetVariable ( >> + (CHAR16 *)mTimeZoneVariableName, >> + &gEfiCallerIdGuid, >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_A= CCESS | EFI_VARIABLE_RUNTIME_ACCESS, >> + Size, >> + (VOID *)&TimeZone >> + ); >> + >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_INFO, "Failed to save %s variable, Status =3D %= r\n", >> + mTimeZoneVariableName, Status)); >> + } >> + } else { >> + // Check TimeZone bounds: -1440 to 1440 or 2047 >> + if ((TimeZone < -EFI_TIMEOFFSET_TIMEZONE) || (TimeZone > EFI_TIME= OFFSET_TIMEZONE)) { >> + TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; >> + } >> + } >> + >> + return TimeZone; >> +} >> + >> +STATIC >> +UINT8 >> +GetDayLight ( >> + VOID >> + ) >> +{ >> + EFI_STATUS Status; >> + UINT8 DayLight; >> + UINTN Size; >> + >> + DayLight =3D 0; >> + // Get the current daylight information from non-volatile storage >> + Size =3D sizeof (DayLight); >> + Status =3D EfiGetVariable ( >> + (CHAR16 *)mDaylightVariableName, >> + &gEfiCallerIdGuid, >> + NULL, >> + &Size, >> + (VOID *)&DayLight >> + ); >> + >> + if (EFI_ERROR (Status)) { >> + DayLight =3D 0; >> + // The daylight variable does not exist in non-volatile storage, = so create it. >> + Status =3D EfiSetVariable ( >> + (CHAR16 *)mDaylightVariableName, >> + &gEfiCallerIdGuid, >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_A= CCESS | EFI_VARIABLE_RUNTIME_ACCESS, >> + Size, >> + (VOID *)&DayLight >> + ); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_INFO, "Failed to save %s variable, Status =3D %r\= n", >> + mDaylightVariableName, Status)); >> + } >> + } >> + >> + return DayLight; >> +} >> + >> +EFI_STATUS >> +EFIAPI >> +LibGetTime ( >> + OUT EFI_TIME *Time, >> + OUT EFI_TIME_CAPABILITIES *Capabilities >> + ) >> +{ >> + EFI_STATUS Status; >> + UINT8 Temp[7] =3D {0}; >> + UINT16 BaseYear =3D 2000; >> + UINTN EpochSeconds; >> + UINT8 TryCount =3D 0; >> + >> + // Ensure Time is a valid pointer >> + if (Time =3D=3D NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + // Initialize the hardware if not already done >> + if (!mRX8900Initialized) { >> + Status =3D InitializeRX8900 (); >> + if (EFI_ERROR (Status)) { >> + return EFI_NOT_READY; >> + } >> + } >> + >> + Status =3D SwitchRtcI2cChannelAndLock (); >> + if (EFI_ERROR (Status)) { >> + ReleaseOwnershipOfRtc (); >> + return Status; >> + } >> + >> + do { >> + Status =3D I2CRead (&gRtcDevice, RX8900_REGADDR_SECONDS, 7, Temp)= ; >> + if (EFI_ERROR (Status)) { >> + Status =3D EFI_DEVICE_ERROR; >> + goto Err; >> + } >> + >> + Time->Second =3D BcdToDecimal8 (Temp[0]); >> + Time->Minute =3D BcdToDecimal8 (Temp[1]); >> + Time->Hour =3D BcdToDecimal8 (Temp[2]); >> + Time->Day =3D BcdToDecimal8 (Temp[4]); >> + Time->Month =3D BcdToDecimal8 (Temp[5]); >> + Time->Year =3D BaseYear + BcdToDecimal8 (Temp[6]); >> + Time->Nanosecond =3D 0; >> + >> + EpochSeconds =3D EfiTimeToEpoch (Time); >> + >> + Time->TimeZone =3D GetTimeZone (); >> + // Adjust for the correct time zone >> + if (Time->TimeZone !=3D EFI_UNSPECIFIED_TIMEZONE) { >> + EpochSeconds +=3D Time->TimeZone * SEC_PER_MIN; >> + } >> + >> + Time->Daylight =3D GetDayLight (); >> + // Adjust for the correct period >> + if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) =3D=3D EFI_TIME_IN_DA= YLIGHT) { >> + // Convert to adjusted time, i.e. spring forwards one hour >> + EpochSeconds +=3D SEC_PER_HOUR; >> + } >> + >> + // Convert from internal 32-bit time to UEFI time >> + EpochToEfiTime (EpochSeconds, Time); >> + if ((!IsTimeValid (Time)) || ((Time->Year - BaseYear) > 99) || (T= ime->Year < 2000)) { >> + DEBUG ((DEBUG_INFO, "LibGetTime: %d-%d-%d %d-%d-%d EpochSeconds= :%llx is invalid time!\n", >> + Time->Second, Time->Minute, Time->Hour, Time->Day, Time->Mont= h, >> + Time->Year, EpochSeconds)); >> + Status =3D EFI_DEVICE_ERROR; >> + } >> + >> +Err: >> + TryCount++; >> + } while ((TryCount < 3) && (EFI_ERROR (Status))); >> + >> + ReleaseOwnershipOfRtc (); >> + return Status; >> +} >> + >> +STATIC >> +EFI_STATUS >> +SetTimeToRX8900 ( >> + IN EFI_TIME *Time >> + ) >> +{ >> + EFI_STATUS Status; >> + UINT8 Temp; >> + >> + (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); >> + Temp =3D DecimalToBcd8 (Time->Second); >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_SECONDS, 1, &Temp)= ; >> + if(EFI_ERROR (Status)) { >> + Status =3D EFI_DEVICE_ERROR; >> + return Status; >> + } >> + >> + Temp =3D DecimalToBcd8 (Time->Minute); >> + (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_MIUTES, 1, &Temp); >> + if(EFI_ERROR (Status)) { >> + Status =3D EFI_DEVICE_ERROR; >> + return Status; >> + } >> + >> + Temp =3D DecimalToBcd8 (Time->Hour); >> + (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_HOURS, 1, &Temp); >> + if(EFI_ERROR (Status)) { >> + Status =3D EFI_DEVICE_ERROR; >> + return Status; >> + } >> + >> + Temp =3D DecimalToBcd8 (Time->Day); >> + (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_DATE, 1, &Temp); >> + if(EFI_ERROR (Status)) { >> + Status =3D EFI_DEVICE_ERROR; >> + return Status; >> + } >> + >> + Temp =3D DecimalToBcd8 (Time->Month); >> + (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_MONTH, 1, &Temp); >> + if(EFI_ERROR (Status)) { >> + Status =3D EFI_DEVICE_ERROR; >> + return Status; >> + } >> + >> + Time->Year=3D Time->Year % 100; >> + Temp =3D Time->Year; >> + Temp =3D DecimalToBcd8 (Temp); >> + (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND); >> + Status =3D I2CWrite (&gRtcDevice, RX8900_REGADDR_YEAR, 1, &Temp); >> + if(EFI_ERROR (Status)) { >> + Status =3D EFI_DEVICE_ERROR; >> + return Status; >> + } >> + >> + return Status; >> +} >> + >> +EFI_STATUS >> +EFIAPI >> +LibSetTime ( >> + IN EFI_TIME *Time >> + ) >> +{ >> + EFI_STATUS Status; >> + UINTN EpochSeconds; >> + >> + // Initialize the hardware if not already done >> + if (!mRX8900Initialized) { >> + Status =3D InitializeRX8900 (); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + } >> + >> + Status =3D SwitchRtcI2cChannelAndLock (); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + >> + if(!IsTimeValid(Time)){ >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + EpochSeconds =3D EfiTimeToEpoch (Time); >> + >> + // Adjust for the correct time zone, i.e. convert to UTC time zone >> + if (Time->TimeZone !=3D EFI_UNSPECIFIED_TIMEZONE) { >> + EpochSeconds -=3D Time->TimeZone * SEC_PER_MIN; >> + } >> + >> + // Adjust for the correct period >> + if ((Time->Daylight & EFI_TIME_IN_DAYLIGHT) =3D=3D EFI_TIME_IN_DAYL= IGHT) { >> + // Convert to un-adjusted time, i.e. fall back one hour >> + EpochSeconds -=3D SEC_PER_HOUR; >> + } >> + >> + EpochToEfiTime (EpochSeconds, Time); >> + Status =3D SetTimeToRX8900 (Time); >> + if (EFI_ERROR (Status)) { >> + goto EXIT; >> + } >> + >> + // Save the current time zone information into non-volatile storage >> + Status =3D EfiSetVariable ( >> + (CHAR16 *)mTimeZoneVariableName, >> + &gEfiCallerIdGuid, >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACC= ESS | EFI_VARIABLE_RUNTIME_ACCESS, >> + sizeof (Time->TimeZone), >> + (VOID *)&(Time->TimeZone) >> + ); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_INFO, "LibSetTime: Failed to save %s variable, Stat= us =3D %r\n", >> + mTimeZoneVariableName, Status)); >> + goto EXIT; >> + } >> + >> + // Save the current daylight information into non-volatile storage >> + Status =3D EfiSetVariable ( >> + (CHAR16 *)mDaylightVariableName, >> + &gEfiCallerIdGuid, >> + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACC= ESS | EFI_VARIABLE_RUNTIME_ACCESS, >> + sizeof(Time->Daylight), >> + (VOID *)&(Time->Daylight) >> + ); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_INFO, "LibSetTime: Failed to save %s variable, Stat= us =3D %r\n", >> + mDaylightVariableName, Status)); >> + goto EXIT; >> + } >> + >> + EXIT: >> + ReleaseOwnershipOfRtc (); >> + return Status; >> +} >> + >> +EFI_STATUS >> +EFIAPI >> +LibGetWakeupTime ( >> + OUT BOOLEAN *Enabled, >> + OUT BOOLEAN *Pending, >> + OUT EFI_TIME *Time >> + ) >> +{ >> + // Not a required feature >> + return EFI_UNSUPPORTED; >> +} >> + >> +EFI_STATUS >> +EFIAPI >> +LibSetWakeupTime ( >> + IN BOOLEAN Enabled, >> + OUT EFI_TIME *Time >> + ) >> +{ >> + // Not a required feature >> + return EFI_UNSUPPORTED; >> +} >> + >> + >> +EFI_STATUS >> +EFIAPI >> +LibRtcInitialize ( >> + IN EFI_HANDLE ImageHandle, >> + IN EFI_SYSTEM_TABLE *SystemTable >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_HANDLE Handle; >> + EFI_TIME EfiTime; >> + >> + // Setup the setters and getters >> + gRT->GetTime =3D LibGetTime; >> + gRT->SetTime =3D LibSetTime; >> + gRT->GetWakeupTime =3D LibGetWakeupTime; >> + gRT->SetWakeupTime =3D LibSetWakeupTime; >> + >> + Status =3D gRT->GetTime (&EfiTime, NULL); >> + if (EFI_ERROR (Status) || (EfiTime.Year < 2000) || (EfiTime.Year > = 2099) || >> + (!IsTimeValid (&EfiTime))) { >> + EfiTime.Year =3D 2000; >> + EfiTime.Month =3D 1; >> + EfiTime.Day =3D 1; >> + EfiTime.Hour =3D 0; >> + EfiTime.Minute =3D 0; >> + EfiTime.Second =3D 0; >> + EfiTime.Nanosecond =3D 0; >> + EfiTime.Daylight =3D 0; >> + EfiTime.TimeZone =3D EFI_UNSPECIFIED_TIMEZONE; >> + >> + Status =3D gRT->SetTime (&EfiTime); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_ERROR, "SetTime Status : %r\n", Status)); >> + } >> + } >> + >> + Handle =3D NULL; >> + Status =3D gBS->InstallMultipleProtocolInterfaces ( >> + &Handle, >> + &gEfiRealTimeClockArchProtocolGuid, >> + NULL, >> + NULL >> + ); >> + >> + return Status; >> +} >> + >> + >> +VOID >> +EFIAPI >> +LibRtcVirtualNotifyEvent ( >> + IN EFI_EVENT Event, >> + IN VOID *Context >> + ) >> +{ >> + return; >> +} >> diff --git a/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900Re= alTimeClockLib.inf b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8= 900RealTimeClockLib.inf >> new file mode 100644 >> index 0000000..aa07a06 >> --- /dev/null >> +++ b/Silicon/Hisilicon/Library/RX8900RealTimeClockLib/RX8900RealTimeC= lockLib.inf >> @@ -0,0 +1,33 @@ >> +/** @file >> + >> + Copyright (c) 2020, Hisilicon Limited. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +[Defines] >> + INF_VERSION =3D 0x0001001A >> + BASE_NAME =3D RX8900RealTimeClockLib >> + FILE_GUID =3D 55BBD010-EA76-4836-8FEA-99CBAA66= 64F4 >> + MODULE_TYPE =3D BASE >> + VERSION_STRING =3D 1.0 >> + LIBRARY_CLASS =3D RealTimeClockLib >> + >> +[Sources.common] >> + RX8900RealTimeClockLib.c >> + >> +[Packages] >> + EmbeddedPkg/EmbeddedPkg.dec >> + MdePkg/MdePkg.dec >> + Silicon/Hisilicon/HisiPkg.dec >> + >> +[LibraryClasses] >> + DebugLib >> + I2CLib >> + IoLib >> + RtcHelperLib >> + TimeBaseLib >> + TimerLib >> + UefiLib >> + UefiRuntimeLib >> --=20 >> 2.8.1 >> >=20 > . >=20