From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4864:20::d44; helo=mail-io1-xd44.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-io1-xd44.google.com (mail-io1-xd44.google.com [IPv6:2607:f8b0:4864:20::d44]) (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 1D21C211A6D38 for ; Fri, 21 Dec 2018 02:01:41 -0800 (PST) Received: by mail-io1-xd44.google.com with SMTP id g17so1813344ioc.10 for ; Fri, 21 Dec 2018 02:01:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=1YD1yV39o1+JutjKyFFQly9qkJprxvTC4a0uTOB6S7U=; b=HFAurHxp9UbyasdQhSFHaTrYIAQ5bjNY9AqrmbfKlFuaU8GKs2RowIZgouyEv87Iz5 2WvOlAQPt1qjeKXT1b2PoIZFPeBHepE/MDjMGOJdInBdwj4f8wWeUnbusQvt1NAoUCBF lmThcx8/Qog8gXHL/bqDL8xBXE0uInhsPyeWo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=1YD1yV39o1+JutjKyFFQly9qkJprxvTC4a0uTOB6S7U=; b=PuzDTnHP5fXotQ4YoC9F0Nprb3Soq7MaPceWEwA1mEiYnDEg6CN0vfGaRXnXDi2Og8 I1ohgQwjIkbXQjG3mrOjDzbnt8+uKJ/NrVfvOtqvHvm0+O5/EGEx+MhTUj9vmFs3jw0/ 8D1TyE+Ei37M4ZwLcEWeHOmBGHhdPQbAWoenF+Q4Cjh1P5i2+42oQc7s9yxOxwc/i5/q /EgymnFYapLBdGVT013W/TS6MQbubM4ZWzbLECj52aI81PtjLIZT+BI/n7zFN99ZVZ59 u1HP6oW0IQjJNur5jDWTS9iUb8F9NbcpnrcO1iuHhP2YeJVT+n0TkuW5L3LK9Ev0oORe Bssw== X-Gm-Message-State: AJcUukenuo1Fm/CsJ/KQAr3LGU78niw3Nl0not7D4zFSAR1tjw8tlY+R tyZ2fAvBI9YH14/XvIN9Im57e554qIZVZWnquTOhqA== X-Google-Smtp-Source: ALg8bN46c92SaXWu1PlLL9iiGXkjtqFkH2fi5p9DI/NyOvubmWrjCD0scKqfcZIqeRpoiJRqXwZgJSr9qrublh1fkls= X-Received: by 2002:a6b:5d01:: with SMTP id r1mr1077021iob.170.1545386500817; Fri, 21 Dec 2018 02:01:40 -0800 (PST) MIME-Version: 1.0 References: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> <1543417315-5763-1-git-send-email-meenakshi.aggarwal@nxp.com> <1543417315-5763-29-git-send-email-meenakshi.aggarwal@nxp.com> <20181221095608.3mzces56c3tgmfpg@bivouac.eciton.net> In-Reply-To: <20181221095608.3mzces56c3tgmfpg@bivouac.eciton.net> From: Ard Biesheuvel Date: Fri, 21 Dec 2018 11:01:27 +0100 Message-ID: To: Leif Lindholm Cc: Meenakshi Aggarwal , "Kinney, Michael D" , "edk2-devel@lists.01.org" , Udit Kumar , Varun Sethi , Wasim Khan Subject: Re: [PATCH edk2-platforms 28/41] Silicon/Maxim: DS3232 RTC Library Support X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Dec 2018 10:01:42 -0000 Content-Type: text/plain; charset="UTF-8" On Fri, 21 Dec 2018 at 10:56, Leif Lindholm wrote: > > On Wed, Nov 28, 2018 at 08:31:42PM +0530, Meenakshi Aggarwal wrote: > > From: Wasim Khan > > > > Add Maxim DS3232 RTC Library support > > > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Wasim Khan > > Signed-off-by: Meenakshi Aggarwal > > Reviewed-by: Leif Lindholm > > --- > > Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h | 49 +++ > > Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c | 420 +++++++++++++++++++++ > > .../Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec | 34 ++ > > .../Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf | 50 +++ > > 4 files changed, 553 insertions(+) > > create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h > > create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c > > create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec > > create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf > > > > diff --git a/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h > > new file mode 100644 > > index 0000000..cd1a321 > > --- /dev/null > > +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h > > @@ -0,0 +1,49 @@ > > +/** Ds3232Rtc.h > > +* > > +* Copyright 2017 NXP > > +* > > +* 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. > > +* > > +**/ > > + > > +#ifndef __DS3232RTC_H__ > > +#define __DS3232RTC_H__ > > + > > +//RTC time register > > +#define DS3232_SEC_REG_ADDR 0x00 > > +#define DS3232_MIN_REG_ADDR 0x01 > > +#define DS3232_HR_REG_ADDR 0x02 > > +#define DS3232_DAY_REG_ADDR 0x03 > > +#define DS3232_DATE_REG_ADDR 0x04 > > +#define DS3232_MON_REG_ADDR 0x05 > > +#define DS3232_YR_REG_ADDR 0x06 > > + > > +#define DS3232_SEC_BIT_CH 0x80 // Clock Halt (in Register 0) > > + > > +//RTC control register > > +#define DS3232_CTL_REG_ADDR 0x0e > > +#define DS3232_STAT_REG_ADDR 0x0f > > + > > +#define START_YEAR 1970 > > +#define END_YEAR 2070 > > + > > +//TIME MASKS > > +#define MASK_SEC 0x7F > > +#define MASK_MIN 0x7F > > +#define MASK_HOUR 0x3F > > +#define MASK_DAY 0x3F > > +#define MASK_MONTH 0x1F > > + > > +typedef struct { > > + UINTN OperationCount; > > + EFI_I2C_OPERATION SetAddressOp; > > + EFI_I2C_OPERATION GetSetDateTimeOp; > > +} RTC_I2C_REQUEST; > > + > > +#endif // __DS3232RTC_H__ > > diff --git a/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c > > new file mode 100644 > > index 0000000..3ab94a8 > > --- /dev/null > > +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c > > @@ -0,0 +1,420 @@ > > +/** Ds3232RtcLib.c > > +* Implement EFI RealTimeClock via RTC Lib for DS3232 RTC. > > +* > > +* Based on RTC implementation available in > > +* EmbeddedPkg/Library/TemplateRealTimeClockLib/RealTimeClockLib.c > > +* > > +* Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
> > +* Copyright 2017 NXP > > +* > > +* 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 > > + > > +#include "Ds3232Rtc.h" > > + > > +STATIC VOID *mDriverEventRegistration; > > +STATIC EFI_HANDLE mI2cMasterHandle; > > +STATIC EFI_I2C_MASTER_PROTOCOL *mI2cMaster; > > + > > +/** > > + Read RTC register. > > + > > + @param SlaveDeviceAddress Slave device address offset of RTC to be read. > > + @param RtcRegAddr Register offset of RTC to be read. > > + > > + @retval Register Value read > > + > > +**/ > > +STATIC > > +UINT8 > > +RtcRead ( > > + IN UINT8 SlaveDeviceAddress, > > + IN UINT8 RtcRegAddr > > + ) > > +{ > > + RTC_I2C_REQUEST Req; > > + EFI_STATUS Status; > > + UINT8 Val; > > + > > + Val = 0; > > + > > + Req.OperationCount = 2; > > + > > + Req.SetAddressOp.Flags = 0; > > + Req.SetAddressOp.LengthInBytes = sizeof (RtcRegAddr); > > + Req.SetAddressOp.Buffer = &RtcRegAddr; > > + > > + Req.GetSetDateTimeOp.Flags = I2C_FLAG_READ; > > + Req.GetSetDateTimeOp.LengthInBytes = sizeof (Val); > > + Req.GetSetDateTimeOp.Buffer = &Val; > > + > > + Status = mI2cMaster->StartRequest (mI2cMaster, SlaveDeviceAddress, > > + (VOID *)&Req, > > + NULL, NULL); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "RTC read error at Addr:0x%x\n", RtcRegAddr)); > > + } > > + > > + return Val; > > +} > > + > > +/** > > + Write RTC register. > > + > > + @param SlaveDeviceAddress Slave device address offset of RTC to be read. > > + @param RtcRegAddr Register offset of RTC to write. > > + @param Val Value to be written > > + > > +**/ > > +STATIC > > +VOID > > +RtcWrite ( > > + IN UINT8 SlaveDeviceAddress, > > + IN UINT8 RtcRegAddr, > > + IN UINT8 Val > > + ) > > +{ > > + RTC_I2C_REQUEST Req; > > + EFI_STATUS Status; > > + > > + Req.OperationCount = 2; > > + > > + Req.SetAddressOp.Flags = 0; > > + Req.SetAddressOp.LengthInBytes = sizeof (RtcRegAddr); > > + Req.SetAddressOp.Buffer = &RtcRegAddr; > > + > > + Req.GetSetDateTimeOp.Flags = 0; > > + Req.GetSetDateTimeOp.LengthInBytes = sizeof (Val); > > + Req.GetSetDateTimeOp.Buffer = &Val; > > + > > + Status = mI2cMaster->StartRequest (mI2cMaster, SlaveDeviceAddress, > > + (VOID *)&Req, > > + NULL, NULL); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr)); > > + } > > +} > > + > > +/** > > + Configure the MUX device connected to I2C. > > + > > + @param RegValue Value to write on mux device register address > > + > > +**/ > > +VOID > > +ConfigureMuxDevice ( > > + IN UINT8 RegValue > > + ) > > +{ > > + RtcWrite (FixedPcdGet8 (PcdMuxDeviceAddress), FixedPcdGet8 (PcdMuxControlRegOffset), RegValue); > > +} > > + > > +/** > > + 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 > > + ) > > +{ > > + EFI_STATUS Status; > > + UINT8 Second; > > + UINT8 Minute; > > + UINT8 Hour; > > + UINT8 Day; > > + UINT8 Month; > > + UINT8 Year; > > + > > + if (mI2cMaster == NULL) { > > + return EFI_DEVICE_ERROR; > > + } > > + > > + Status = EFI_SUCCESS; > > + > > + // > > + // Check if the I2C device is connected though a MUX device. > > + // > > + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { > > Hmm, if this is the case, then I think we also need a RaiseTPL before > flipping the mux, and a RestoreTPL after we set it back to default. > This also needs to be done in any other modules accessing hardware > behind this mux. TPL_CALLBACK should be sufficient, as long as that's > what all of the modules use. > If this device is behind a mux that is controlled by the OS at runtime, this RTC is not usable in UEFI. > > + // Switch to the channel connected to Ds3232 RTC > > + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxRtcChannelValue)); > > + } > > + > > + Second = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR); > > + Minute = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MIN_REG_ADDR); > > + Hour = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_HR_REG_ADDR); > > + Day = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_DATE_REG_ADDR); > > + Month = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MON_REG_ADDR); > > + Year = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_YR_REG_ADDR); > > + > > Please put FixedPcdGet8 (PcdI2cSlaveAddress) into a temporary variable. > > > + if (Second & DS3232_SEC_BIT_CH) { > > + DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has stopped\n")); > > + /* clear the CH flag */ > > + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR, > > + RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR) & ~DS3232_SEC_BIT_CH); > > That should also clean up this line somewhat. > > > + Status = EFI_DEVICE_ERROR; > > + goto EXIT; > > + } > > + > > + Time->Second = BcdToDecimal8 (Second & MASK_SEC); > > + Time->Minute = BcdToDecimal8 (Minute & MASK_MIN); > > + Time->Hour = BcdToDecimal8 (Hour & MASK_HOUR); > > + Time->Day = BcdToDecimal8 (Day & MASK_DAY); > > + Time->Month = BcdToDecimal8 (Month & MASK_MONTH); > > + > > + // > > + // RTC can save year 1970 to 2069 > > + // On writing Year, save year % 100 > > + // On Reading reversing the operation e.g. 2012 > > + // write = 12 (2012 % 100) > > + // read = 2012 (12 + 2000) > > + // > > + Time->Year = BcdToDecimal8 (Year) + > > + (BcdToDecimal8 (Year) >= 70 ? START_YEAR - 70 : END_YEAR -70); > > Please break the adjustment out into its own calculation and a > temmporary variable. > > > + > > +EXIT: > > + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { > > + // Switch to the default channel > > + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxDefaultChannelValue)); > > + } > > + > > + return Status; > > +} > > + > > +/** > > + 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. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +LibSetTime ( > > + IN EFI_TIME *Time > > + ) > > +{ > > + if (mI2cMaster == NULL) { > > + return EFI_DEVICE_ERROR; > > + } > > + > > + if (Time->Year < START_YEAR || Time->Year >= END_YEAR){ > > + DEBUG ((DEBUG_ERROR, "WARNING: Year should be between 1970 and 2069!\n")); > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Check if the I2C device is connected though a MUX device. > > + // > > + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { > > + // Switch to the channel connected to Ds3232 RTC > > + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxRtcChannelValue)); > > + } > > + > > + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_YR_REG_ADDR, DecimalToBcd8 (Time->Year % 100)); > > + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MON_REG_ADDR, DecimalToBcd8 (Time->Month)); > > + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_DATE_REG_ADDR, DecimalToBcd8 (Time->Day)); > > + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_HR_REG_ADDR, DecimalToBcd8 (Time->Hour)); > > + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MIN_REG_ADDR, DecimalToBcd8 (Time->Minute)); > > + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR, DecimalToBcd8 (Time->Second)); > > FixedPcdGet8 (PcdI2cSlaveAddress) in a temporary variable, please. > > / > Leif > > > + > > + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { > > + // Switch to the default channel > > + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxDefaultChannelValue)); > > + } > > + > > + 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 > > + ) > > +{ > > + // Currently not supporting this feature. > > + return EFI_UNSUPPORTED; > > +} > > + > > +/** > > + 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 > > + ) > > +{ > > + // Currently not supporting this feature. > > + return EFI_UNSUPPORTED; > > +} > > + > > +STATIC > > +VOID > > +I2cDriverRegistrationEvent ( > > + IN EFI_EVENT Event, > > + IN VOID *Context > > + ) > > +{ > > + EFI_STATUS Status; > > + EFI_I2C_MASTER_PROTOCOL *I2cMaster; > > + UINTN BusFrequency; > > + EFI_HANDLE Handle; > > + UINTN BufferSize; > > + > > + // > > + // Try to connect the newly registered driver to our handle. > > + // > > + do { > > + BufferSize = sizeof (EFI_HANDLE); > > + Status = gBS->LocateHandle (ByRegisterNotify, > > + &gEfiI2cMasterProtocolGuid, > > + mDriverEventRegistration, > > + &BufferSize, > > + &Handle); > > + if (EFI_ERROR (Status)) { > > + if (Status != EFI_NOT_FOUND) { > > + DEBUG ((DEBUG_WARN, "%a: gBS->LocateHandle () returned %r\n", > > + __FUNCTION__, Status)); > > + } > > + break; > > + } > > + > > + if (Handle != mI2cMasterHandle) { > > + 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); > > + > > + return; > > + > > +} > > + > > +/** > > + This is the declaration of an EFI image entry point. This can be the entry point to an application > > + written to this specification, an EFI boot service driver. > > + > > + @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, > > + &gDs3232RealTimeClockLibI2cMasterProtocolGuid, > > + 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 ( > > + &gEfiI2cMasterProtocolGuid, > > + TPL_CALLBACK, > > + I2cDriverRegistrationEvent, > > + NULL, > > + &mDriverEventRegistration); > > + > > + return EFI_SUCCESS; > > +} > > diff --git a/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec > > new file mode 100644 > > index 0000000..a0033a2 > > --- /dev/null > > +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec > > @@ -0,0 +1,34 @@ > > +#/** @file > > +# > > +# Copyright 2017 NXP > > +# > > +# 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 = Ds3232RtcLib > > + PACKAGE_GUID = 0b4192f7-e404-4019-b2e5-1e6004da3313 > > + PACKAGE_VERSION = 0.1 > > + > > +[Guids] > > + gDs3232RtcLibTokenSpaceGuid = { 0x7960fc51, 0x0832, 0x4f0b, { 0xb4, 0x22, 0x53, 0x87, 0x03, 0xaa, 0x85, 0xda }} > > + > > +[Protocols] > > + gDs3232RealTimeClockLibI2cMasterProtocolGuid = { 0xa17eb2ee, 0xcadc, 0x40f1, { 0x8a, 0x45, 0x4d, 0x5a, 0xf3, 0xd6, 0xce, 0x53 }} > > + > > +[PcdsFixedAtBuild] > > + gDs3232RtcLibTokenSpaceGuid.PcdI2cSlaveAddress|0|UINT8|0x00000001 > > + gDs3232RtcLibTokenSpaceGuid.PcdI2cBusFrequency|0|UINT32|0x00000002 > > + gDs3232RtcLibTokenSpaceGuid.PcdIsRtcDeviceMuxed|FALSE|BOOLEAN|0x00000003 > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxDeviceAddress|0|UINT8|0x00000004 > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxControlRegOffset|0|UINT8|0x00000005 > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxRtcChannelValue|0|UINT8|0x00000006 > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxDefaultChannelValue|0|UINT8|0x00000007 > > diff --git a/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf > > new file mode 100644 > > index 0000000..95664c1 > > --- /dev/null > > +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf > > @@ -0,0 +1,50 @@ > > +# @Ds3232RtcLib.inf > > +# > > +# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved. > > +# Copyright 2017 NXP > > +# > > +# 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 = Ds3232RtcLib > > + FILE_GUID = 97f1f2c2-51e1-47ad-9660-70b33da1fe71 > > + MODULE_TYPE = BASE > > + VERSION_STRING = 1.0 > > + LIBRARY_CLASS = RealTimeClockLib > > + > > +[Sources.common] > > + Ds3232RtcLib.c > > + > > +[Packages] > > + EmbeddedPkg/EmbeddedPkg.dec > > + MdePkg/MdePkg.dec > > + Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec > > + > > +[LibraryClasses] > > + DebugLib > > + UefiBootServicesTableLib > > + UefiLib > > + > > +[Protocols] > > + gEfiI2cMasterProtocolGuid ## CONSUMES > > + gDs3232RealTimeClockLibI2cMasterProtocolGuid ## CONSUMES > > + > > +[FixedPcd] > > + gDs3232RtcLibTokenSpaceGuid.PcdI2cSlaveAddress > > + gDs3232RtcLibTokenSpaceGuid.PcdI2cBusFrequency > > + gDs3232RtcLibTokenSpaceGuid.PcdIsRtcDeviceMuxed > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxDeviceAddress > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxControlRegOffset > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxRtcChannelValue > > + gDs3232RtcLibTokenSpaceGuid.PcdMuxDefaultChannelValue > > + > > +[Depex] > > + gDs3232RealTimeClockLibI2cMasterProtocolGuid > > -- > > 1.9.1 > >