From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4001:c06::244; helo=mail-io0-x244.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-io0-x244.google.com (mail-io0-x244.google.com [IPv6:2607:f8b0:4001:c06::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id C01E2202E611D for ; Wed, 8 Nov 2017 09:40:15 -0800 (PST) Received: by mail-io0-x244.google.com with SMTP id h70so6822619ioi.4 for ; Wed, 08 Nov 2017 09:44:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=5yA9LJUDQVD/17+mfIR+Oh43WN/atqN4pft02+obVSc=; b=LAvg9veNztrLeVFAcraD/FnoEVEwobqBuurNT8sZ4e5IHSsCW2brN9qEn75BqlcrAi tVz12Qip0qQ55uuQYZCcfk1uTSdEMBD+J2Q3CakqDoX5m+W9k5urJqPdIFh3HiMSibt7 tcHPPPgZz+gFH1oCUGuSRp2M/S4UAJKz9ZrUQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=5yA9LJUDQVD/17+mfIR+Oh43WN/atqN4pft02+obVSc=; b=caaw0yXSzYQwcDlS6HMOmIoZwnluqpgPHIpDBRqTO/JpDrxdd8NAUw3IAqqGxTfEaM wH+o8N4VaVHloF/GsAOUKWc5Me0sOBT9VtF+8baqf/f2ahl9KpTsyiIlvuYiyxlXznxT vyqlU7ooNoUc3ytIxbH7qN8kPtzxvMgMoxQrXviGWD//IWFtik+I5fF2A04GDr69tVOd ZKQq2SRJhuVFfyiSmovRQigOkHVXvm6FGd6W2hlN6npdHBJH5meinyMuxgoXrwLNnszL o+u/UeJVEemZ5hYloUqwgmndPLsD3u+5pWHobiau1vO4b5P+crWqoAtWHvKEyHxMM0fG CfyA== X-Gm-Message-State: AJaThX7a2A2I0Y3uMDNUEJarHnYszelpIrN8CRGXEp+2XKXSvFrb3FCF JTZsMJC081Z7MTzQfjbWnL4JN+nsHNwNuu40XB11Cg== X-Google-Smtp-Source: AGs4zMZhACaLP+Q5Buw8wSY3n6WA5gjwMJClp/C0xVADIyfSyYK1YrMkfl7THC5C0TO1FuInx2tiJcAkM5wAvVpHxr4= X-Received: by 10.107.174.206 with SMTP id n75mr1641472ioo.43.1510163055181; Wed, 08 Nov 2017 09:44:15 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.131.167 with HTTP; Wed, 8 Nov 2017 09:44:14 -0800 (PST) In-Reply-To: <20171108164355.bkxnx3mlf65e6zwk@bivouac.eciton.net> References: <20171103101654.30973-1-ard.biesheuvel@linaro.org> <20171103101654.30973-2-ard.biesheuvel@linaro.org> <20171108164355.bkxnx3mlf65e6zwk@bivouac.eciton.net> From: Ard Biesheuvel Date: Wed, 8 Nov 2017 17:44:14 +0000 Message-ID: To: Leif Lindholm Cc: "edk2-devel@lists.01.org" , Daniel Thompson Subject: Re: [RFC PATCH edk2-platforms 1/3] Silicon/NXP: add RTC support library for PCF8563 I2C IP X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Nov 2017 17:40:16 -0000 Content-Type: text/plain; charset="UTF-8" On 8 November 2017 at 16:43, Leif Lindholm wrote: > On Fri, Nov 03, 2017 at 10:16:52AM +0000, Ard Biesheuvel wrote: >> Add a RealTimeClockLib implementation for the NXP PCF8563 as used on >> the Socionext Developer Box board. Note that the standard I2C protocol >> stack does not support runtime use, so this driver invokes the I2C master >> protocol directly. This requires support from the platform side as well, >> and so this driver will only attach to a I2C master that has the >> gPcf8563RealTimeClockLibI2cMasterProtolGuid protocol installed on its >> handle. It is up to the platform to ensure that the driver producing >> the I2C master protocol in question is runtime capable, and is not >> shared with the I2C protocol stack (i.e., it should not have the I2C >> Bus Configuration Management protocol installed as well). >> >> Contributed-under: TianoCore Contribution Agreement 1.1 >> Signed-off-by: Ard Biesheuvel >> --- >> Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c | 385 ++++++++++++++++++++ >> Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.dec | 29 ++ >> Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.inf | 52 +++ >> 3 files changed, 466 insertions(+) >> >> diff --git a/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c >> new file mode 100644 >> index 000000000000..fea65a225d7f >> --- /dev/null >> +++ b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.c >> @@ -0,0 +1,385 @@ >> +/** @file >> + >> + Copyright (c) 2017, Linaro, Ltd. All rights reserved.
>> + >> + This program and the accompanying materials >> + are licensed and made available under the terms and conditions of the BSD License >> + which accompanies this distribution. The full text of the license may be found at >> + http://opensource.org/licenses/bsd-license.php >> + >> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, >> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. >> + >> +**/ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#define SLAVE_ADDRESS (FixedPcdGet8 (PcdI2cSlaveAddress)) >> +#define PCF8563_DATA_REG_OFFSET 0x2 >> + >> +#define PCF8563_SECONDS_MASK 0x7f >> +#define PCF8563_MINUTES_MASK 0x7f >> +#define PCF8563_HOURS_MASK 0x3f >> +#define PCF8563_DAYS_MASK 0x3f >> +#define PCF8563_WEEKDAYS_MASK 0x07 >> +#define PCF8563_MONTHS_MASK 0x1f >> +#define PCF8563_CENTURY_MASK 0x80 >> + >> +#define EPOCH_BASE 2000 >> + >> +STATIC EFI_HANDLE mI2cMasterHandle; >> +STATIC VOID *mDriverEventRegistration; >> +STATIC EFI_I2C_MASTER_PROTOCOL *mI2cMaster; >> +STATIC EFI_EVENT mRtcVirtualAddrChangeEvent; >> + >> +typedef struct { >> + UINTN OperationCount; >> + EFI_I2C_OPERATION SetAddressOp; >> + EFI_I2C_OPERATION GetSetDateTimeOp; >> +} RTC_I2C_REQUEST; >> + >> +#pragma pack(1) >> +typedef struct { >> + UINT8 VL_seconds; >> + UINT8 Minutes; >> + UINT8 Hours; >> + UINT8 Days; >> + UINT8 Weekdays; >> + UINT8 Century_months; >> + UINT8 Years; >> +} RTC_DATETIME; >> +#pragma pack() >> + >> +/** >> + Returns the current time and date information, and the time-keeping >> + capabilities of the hardware platform. >> + >> + @param Time A pointer to storage to receive a snapshot of >> + the current time. >> + @param Capabilities An optional pointer to a buffer to receive the >> + real time clock device's capabilities. >> + >> + @retval EFI_SUCCESS The operation completed successfully. >> + @retval EFI_INVALID_PARAMETER Time is NULL. >> + @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware >> + error. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +LibGetTime ( >> + OUT EFI_TIME *Time, >> + OUT EFI_TIME_CAPABILITIES *Capabilities >> + ) >> +{ >> + RTC_I2C_REQUEST Op; >> + RTC_DATETIME DateTime; >> + EFI_STATUS Status; >> + UINT8 Reg; >> + >> + if (Time == NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + if (mI2cMaster == NULL) { >> + return EFI_DEVICE_ERROR; >> + } >> + >> + Reg = PCF8563_DATA_REG_OFFSET; >> + >> + Op.OperationCount = 2; >> + >> + Op.SetAddressOp.Flags = 0; >> + Op.SetAddressOp.LengthInBytes = 1; >> + Op.SetAddressOp.Buffer = &Reg; >> + >> + Op.GetSetDateTimeOp.Flags = I2C_FLAG_READ; >> + Op.GetSetDateTimeOp.LengthInBytes = sizeof (RTC_DATETIME); >> + Op.GetSetDateTimeOp.Buffer = (VOID *)&DateTime; >> + >> + Status = mI2cMaster->StartRequest (mI2cMaster, SLAVE_ADDRESS, >> + (VOID *)&Op, NULL, NULL); >> + if (EFI_ERROR (Status)) { >> + return EFI_DEVICE_ERROR; >> + } >> + >> + Time->Second = BcdToDecimal8 (DateTime.VL_seconds & PCF8563_SECONDS_MASK); >> + Time->Minute = BcdToDecimal8 (DateTime.Minutes & PCF8563_MINUTES_MASK); >> + Time->Hour = BcdToDecimal8 (DateTime.Hours & PCF8563_HOURS_MASK); >> + Time->Day = BcdToDecimal8 (DateTime.Days & PCF8563_DAYS_MASK); >> + Time->Month = BcdToDecimal8 (DateTime.Century_months & PCF8563_MONTHS_MASK); >> + Time->Year = BcdToDecimal8 (DateTime.Years) + EPOCH_BASE; >> + >> + if (DateTime.Century_months & PCF8563_CENTURY_MASK) { >> + Time->Year += 100; > > Guess we'd better retire all these platforms before the year 2100 > then... (Or, given EPOCH_BASE, is it 2070? (Or given EPOCH_BASE being > set to 2000, is it 2200?)) > > Could you add a small comment next to the EPOCH_BASE definition > explaining the constrainst? > Well, ultimately it doesn't really matter, given that this IP treats all years divisible by 4 as leap years, so regardless of which base we choose, it is going to jump to 29/2/2100 no matter what. So the EPOCH_BASE could even be 2016: UEFI fully owns the RTC so it can do whatever it wants. 2000 just seemed the least arbitrary. >> + } >> + >> + Time->Daylight = EFI_TIME_ADJUST_DAYLIGHT; >> + Time->TimeZone = 0; /* UTC */ >> + >> + if (Capabilities != NULL) { >> + Capabilities->Resolution = 1; >> + Capabilities->Accuracy = 0; >> + Capabilities->SetsToZero = TRUE; >> + } >> + return EFI_SUCCESS; >> +} >> + >> + >> +/** >> + 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 >> +LibSetTime ( >> + IN EFI_TIME *Time >> + ) >> +{ >> + RTC_I2C_REQUEST Op; >> + RTC_DATETIME DateTime; >> + EFI_STATUS Status; >> + UINT8 Reg; >> + >> + if (mI2cMaster == NULL) { >> + return EFI_DEVICE_ERROR; >> + } >> + >> + DateTime.VL_seconds = DecimalToBcd8 (Time->Second); >> + DateTime.Minutes = DecimalToBcd8 (Time->Minute); >> + DateTime.Hours = DecimalToBcd8 (Time->Hour); >> + DateTime.Days = DecimalToBcd8 (Time->Day); >> + DateTime.Century_months = DecimalToBcd8 (Time->Month); >> + DateTime.Years = DecimalToBcd8 (Time->Year % 100); >> + if (Time->Year >= EPOCH_BASE + 100) { >> + DateTime.Century_months |= PCF8563_CENTURY_MASK; > > Are you going to slap me if I ask for this to return error if > Time->Year >= EPOCH_BASE + 200? > Actually, I think it would be better to treat the century bit as a toggle, depending on whether (year % 200) >= 100 >> + } >> + >> + Reg = PCF8563_DATA_REG_OFFSET; >> + >> + Op.OperationCount = 2; >> + >> + Op.SetAddressOp.Flags = 0; >> + Op.SetAddressOp.LengthInBytes = 1; >> + Op.SetAddressOp.Buffer = &Reg; >> + >> + Op.GetSetDateTimeOp.Flags = 0; >> + Op.GetSetDateTimeOp.LengthInBytes = sizeof (RTC_DATETIME); >> + Op.GetSetDateTimeOp.Buffer = (VOID *)&DateTime; >> + >> + Status = mI2cMaster->StartRequest (mI2cMaster, SLAVE_ADDRESS, >> + (VOID *)&Op, NULL, NULL); >> + if (EFI_ERROR (Status)) { >> + return EFI_DEVICE_ERROR; >> + } >> + return EFI_SUCCESS; >> +} >> + >> + >> +/** >> + Returns the current wakeup alarm clock setting. >> + >> + @param Enabled Indicates if the alarm is currently enabled or >> + disabled. >> + @param Pending Indicates if the alarm signal is pending and >> + requires acknowledgement. >> + @param Time The current alarm setting. >> + >> + @retval EFI_SUCCESS The alarm settings were returned. >> + @retval EFI_INVALID_PARAMETER Any parameter is NULL. >> + @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a >> + hardware error. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +LibGetWakeupTime ( >> + OUT BOOLEAN *Enabled, >> + OUT BOOLEAN *Pending, >> + OUT EFI_TIME *Time >> + ) >> +{ >> + return EFI_UNSUPPORTED; > > For now, unsupported by current platforms, or unsupportable by this > RTC device? > Well, getting and setting the wakeup time should be fairly trivial to implement, but I can't really test it on the hardware we have (the INT line is not connected), so I didn't bother. I'll add a comment to that effect. >> +} >> + >> + >> +/** >> + Sets the system wakeup alarm clock time. >> + >> + @param Enabled Enable or disable the wakeup alarm. >> + @param Time If Enable is TRUE, the time to set the wakeup >> + alarm for. >> + >> + @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was >> + enabled. If Enable is FALSE, then the wakeup >> + alarm was disabled. >> + @retval EFI_INVALID_PARAMETER A time field is out of range. >> + @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a >> + hardware error. >> + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this >> + platform. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +LibSetWakeupTime ( >> + IN BOOLEAN Enabled, >> + OUT EFI_TIME *Time >> + ) >> +{ >> + return EFI_UNSUPPORTED; > > Same question. > Same answer. Trivial to implement, impossible to test fully atm (especially because I fried my board today) >> +} >> + >> +STATIC >> +VOID >> +DriverRegistrationEvent ( >> + IN EFI_EVENT Event, >> + IN VOID *Context >> + ) >> +{ >> + EFI_HANDLE Handle[2]; >> + UINTN BufferSize; >> + EFI_STATUS Status; >> + EFI_I2C_MASTER_PROTOCOL *I2cMaster; >> + UINTN BusFrequency; >> + >> + // >> + // Try to connect the newly registered driver to our handle. >> + // >> + do { >> + BufferSize = sizeof (EFI_HANDLE); >> + Status = gBS->LocateHandle (ByRegisterNotify, >> + &gEfiDriverBindingProtocolGuid, >> + mDriverEventRegistration, >> + &BufferSize, >> + Handle); >> + if (EFI_ERROR (Status)) { >> + if (Status != EFI_NOT_FOUND) { >> + DEBUG ((DEBUG_WARN, "%a: gBS->LocateHandle () returned %r\n", >> + __FUNCTION__, Status)); >> + } >> + break; >> + } >> + >> + // >> + // Check if we can connect our handle to this driver. >> + // >> + Handle[1] = NULL; >> + Status = gBS->ConnectController (mI2cMasterHandle, Handle, NULL, FALSE); >> + if (EFI_ERROR (Status)) { >> + continue; >> + } >> + >> + DEBUG ((DEBUG_INFO, "%a: found I2C master!\n", __FUNCTION__)); >> + >> + gBS->CloseEvent (Event); >> + >> + Status = gBS->OpenProtocol (mI2cMasterHandle, &gEfiI2cMasterProtocolGuid, >> + (VOID **)&I2cMaster, gImageHandle, NULL, >> + EFI_OPEN_PROTOCOL_EXCLUSIVE); >> + ASSERT_EFI_ERROR (Status); >> + >> + Status = I2cMaster->Reset (I2cMaster); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_ERROR, "%a: I2CMaster->Reset () failed - %r\n", >> + __FUNCTION__, Status)); >> + break; >> + } >> + >> + BusFrequency = FixedPcdGet16 (PcdI2cBusFrequency); >> + Status = I2cMaster->SetBusFrequency (I2cMaster, &BusFrequency); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_ERROR, "%a: I2CMaster->SetBusFrequency () failed - %r\n", >> + __FUNCTION__, Status)); >> + break; >> + } >> + >> + mI2cMaster = I2cMaster; >> + break; >> + } while (TRUE); >> +} >> + >> +/** >> + Fixup internal data so that EFI can be call in virtual mode. >> + Call the passed in Child Notify event and convert any pointers in >> + lib to virtual mode. >> + >> + @param[in] Event The Event that is being processed >> + @param[in] Context Event Context >> +**/ >> +VOID >> +EFIAPI >> +LibRtcVirtualNotifyEvent ( >> + IN EFI_EVENT Event, >> + IN VOID *Context >> + ) >> +{ >> + EfiConvertPointer (0x0, (VOID **)&mI2cMaster); >> +} >> + >> +/** >> + Library entry point >> + >> + @param ImageHandle Handle that identifies the loaded image. >> + @param SystemTable System Table for this image. >> + >> + @retval EFI_SUCCESS The operation completed successfully. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +LibRtcInitialize ( >> + IN EFI_HANDLE ImageHandle, >> + IN EFI_SYSTEM_TABLE *SystemTable >> + ) >> +{ >> + EFI_STATUS Status; >> + UINTN BufferSize; >> + >> + // >> + // Find the handle that marks the controller >> + // that will provide the I2C master protocol. >> + // >> + BufferSize = sizeof (EFI_HANDLE); >> + Status = gBS->LocateHandle (ByProtocol, >> + &gPcf8563RealTimeClockLibI2cMasterProtolGuid, NULL, >> + &BufferSize, &mI2cMasterHandle); >> + ASSERT_EFI_ERROR (Status); >> + >> + // >> + // Register a protocol registration notification callback on the driver >> + // binding protocol so we can attempt to connect our I2C master to it >> + // as soon as it appears. >> + // >> + EfiCreateProtocolNotifyEvent ( >> + &gEfiDriverBindingProtocolGuid, >> + TPL_CALLBACK, >> + DriverRegistrationEvent, >> + NULL, >> + &mDriverEventRegistration); >> + >> + // >> + // Register for the virtual address change event >> + // >> + Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_NOTIFY, >> + LibRtcVirtualNotifyEvent, NULL, >> + &gEfiEventVirtualAddressChangeGuid, >> + &mRtcVirtualAddrChangeEvent); >> + ASSERT_EFI_ERROR (Status); >> + >> + return EFI_SUCCESS; >> +} >> diff --git a/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.dec b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.dec >> new file mode 100644 >> index 000000000000..bc8fc60c0602 >> --- /dev/null >> +++ b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.dec >> @@ -0,0 +1,29 @@ >> +#/** @file >> +# >> +# Copyright (c) 2017, Linaro, Ltd. All rights reserved.
>> +# >> +# This program and the accompanying materials >> +# are licensed and made available under the terms and conditions of the BSD License >> +# which accompanies this distribution. The full text of the license may be found at >> +# http://opensource.org/licenses/bsd-license.php >> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, >> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. >> +# >> +# >> +#**/ >> + >> +[Defines] >> + DEC_SPECIFICATION = 0x0001001A >> + PACKAGE_NAME = Pcf8563RealTimeClockLib >> + PACKAGE_GUID = 44d63668-c86b-446a-b303-f3a5176702aa >> + PACKAGE_VERSION = 0.1 >> + >> +[Guids] >> + gPcf8563RealTimeClockLibTokenSpaceGuid = { 0xaaf5b169, 0x93a0, 0x4d60, { 0xba, 0xe4, 0x06, 0x07, 0x92, 0x8e, 0x63, 0xdd }} >> + >> +[Protocols] >> + gPcf8563RealTimeClockLibI2cMasterProtolGuid = { 0xa6af18ae, 0x3bd5, 0x4af9, { 0xbb, 0x6a, 0xdb, 0x85, 0x07, 0x62, 0x81, 0x38 }} >> + >> +[PcdsFixedAtBuild] >> + gPcf8563RealTimeClockLibTokenSpaceGuid.PcdI2cSlaveAddress|0x51|UINT8|0x00000001 >> + gPcf8563RealTimeClockLibTokenSpaceGuid.PcdI2cBusFrequency|400|UINT16|0x00000002 > > Could you add a comment clarifying unit? > Yep, and actually this is wrong. It should be in Hz not kHz >> diff --git a/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.inf b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.inf >> new file mode 100644 >> index 000000000000..e1e001162144 >> --- /dev/null >> +++ b/Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.inf >> @@ -0,0 +1,52 @@ >> +#/** @file >> +# >> +# Copyright (c) 2017, Linaro, Ltd. All rights reserved.
>> +# >> +# This program and the accompanying materials >> +# are licensed and made available under the terms and conditions of the BSD License >> +# which accompanies this distribution. The full text of the license may be found at >> +# http://opensource.org/licenses/bsd-license.php >> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, >> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. >> +# >> +# >> +#**/ >> + >> +[Defines] >> + INF_VERSION = 0x0001001A >> + BASE_NAME = Pcf8563RealTimeClockLib >> + FILE_GUID = 1e3d33f3-a671-4116-bd81-6b435296c1e0 >> + MODULE_TYPE = DXE_DRIVER >> + VERSION_STRING = 1.0 >> + LIBRARY_CLASS = RealTimeClockLib >> + >> +[Sources.common] >> + Pcf8563RealTimeClockLib.c >> + >> +[Packages] >> + MdePkg/MdePkg.dec >> + EmbeddedPkg/EmbeddedPkg.dec >> + Silicon/NXP/Library/Pcf8563RealTimeClockLib/Pcf8563RealTimeClockLib.dec >> + >> +[LibraryClasses] >> + BaseMemoryLib >> + DebugLib >> + IoLib >> + UefiBootServicesTableLib >> + UefiLib >> + UefiRuntimeLib >> + >> +[Guids] >> + gEfiEventVirtualAddressChangeGuid >> + >> +[Protocols] >> + gEfiDriverBindingProtocolGuid ## CONSUMES >> + gEfiI2cMasterProtocolGuid ## CONSUMES >> + gPcf8563RealTimeClockLibI2cMasterProtolGuid ## CONSUMES >> + >> +[FixedPcd] >> + gPcf8563RealTimeClockLibTokenSpaceGuid.PcdI2cSlaveAddress >> + gPcf8563RealTimeClockLibTokenSpaceGuid.PcdI2cBusFrequency >> + >> +[Depex] >> + gPcf8563RealTimeClockLibI2cMasterProtolGuid >> -- >> 2.11.0 >>