[edk2] [PATCH edk2-platforms 28/41] Silicon/Maxim: DS3232 RTC Library Support

Leif Lindholm leif.lindholm at linaro.org
Fri Dec 21 01:56:08 PST 2018


On Wed, Nov 28, 2018 at 08:31:42PM +0530, Meenakshi Aggarwal wrote:
> From: Wasim Khan <wasim.khan at nxp.com>
> 
> Add Maxim DS3232 RTC Library support
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Wasim Khan <wasim.khan at nxp.com>
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal at nxp.com>
> Reviewed-by: Leif Lindholm <leif.lindholm at linaro.org>
> ---
>  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.<BR>
> +*  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 <PiDxe.h>
> +#include <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/RealTimeClockLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +#include <Protocol/I2cMaster.h>
> +
> +#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.

> +    // 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
> 


More information about the edk2-devel mailing list