On Fri, Feb 16, 2018 at 02:20:02PM +0530, Meenakshi wrote:
> From: Meenakshi Aggarwal <[email protected]>
> 
> Real time clock Apis on top of I2C Apis
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Meenakshi Aggarwal <[email protected]>
> ---
>  Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h     |  59 ++++
>  Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c  | 329 
> +++++++++++++++++++++
>  .../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec    |  26 ++
>  .../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf    |  45 +++

This isn't part of the review, but in future can you try to follow
Laszlo's guide when generating patches:
https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt-git-guide-for-edk2-contributors-and-maintainers#contrib-23
?

For this patch:
Reviewed-by: Leif Lindholm <[email protected]>

>  4 files changed, 459 insertions(+)
>  create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h
>  create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c
>  create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
>  create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> 
> diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h 
> b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h
> new file mode 100644
> index 0000000..96271f8
> --- /dev/null
> +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h
> @@ -0,0 +1,59 @@
> +/** Ds1307Rtc.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 __DS1307RTC_H__
> +#define __DS1307RTC_H__
> +
> +/*
> + * RTC time register
> + */
> +#define DS1307_SEC_REG_ADDR        0x00
> +#define DS1307_MIN_REG_ADDR        0x01
> +#define DS1307_HR_REG_ADDR         0x02
> +#define DS1307_DAY_REG_ADDR        0x03
> +#define DS1307_DATE_REG_ADDR       0x04
> +#define DS1307_MON_REG_ADDR        0x05
> +#define DS1307_YR_REG_ADDR         0x06
> +
> +#define DS1307_SEC_BIT_CH          0x80  /* Clock Halt (in Register 0)   */
> +
> +/*
> + * RTC control register
> + */
> +#define DS1307_CTL_REG_ADDR        0x07
> +
> +#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
> +
> +/*
> + * I2C FLAGS
> + */
> +#define I2C_REG_ADDRESS            0x2
> +
> +typedef struct {
> +  UINTN                           OperationCount;
> +  EFI_I2C_OPERATION               SetAddressOp;
> +  EFI_I2C_OPERATION               GetSetDateTimeOp;
> +} RTC_I2C_REQUEST;
> +
> +#endif // __DS1307RTC_H__
> diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c 
> b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c
> new file mode 100644
> index 0000000..cf45d49
> --- /dev/null
> +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c
> @@ -0,0 +1,329 @@
> +/** Ds1307RtcLib.c
> +  Implement EFI RealTimeClock via RTC Lib for DS1307 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 "Ds1307Rtc.h"
> +
> +STATIC VOID                       *mDriverEventRegistration;
> +STATIC EFI_I2C_MASTER_PROTOCOL    *mI2cMaster;
> +
> +/**
> +  Read RTC register.
> +
> +  @param  RtcRegAddr       Register offset of RTC to be read.
> +
> +  @retval                  Register Value read
> +
> +**/
> +
> +STATIC
> +UINT8
> +RtcRead (
> +  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, FixedPcdGet8 
> (PcdI2cSlaveAddress),
> +                                     (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  RtcRegAddr       Register offset of RTC to write.
> +  @param  Val              Value to be written
> +
> +**/
> +
> +STATIC
> +VOID
> +RtcWrite (
> +  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, FixedPcdGet8 
> (PcdI2cSlaveAddress),
> +                                     (VOID *)&Req,
> +                                     NULL,  NULL);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr));
> +  }
> +}
> +
> +/**
> +  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;
> +
> +  Second = RtcRead (DS1307_SEC_REG_ADDR);
> +  Minute = RtcRead (DS1307_MIN_REG_ADDR);
> +  Hour = RtcRead (DS1307_HR_REG_ADDR);
> +  Day = RtcRead (DS1307_DATE_REG_ADDR);
> +  Month = RtcRead (DS1307_MON_REG_ADDR);
> +  Year = RtcRead (DS1307_YR_REG_ADDR);
> +
> +  if (Second & DS1307_SEC_BIT_CH) {
> +    DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has stopped\n"));
> +    /* clear the CH flag */
> +    RtcWrite (DS1307_SEC_REG_ADDR,
> +              RtcRead (DS1307_SEC_REG_ADDR) & ~DS1307_SEC_BIT_CH);
> +    Status = EFI_DEVICE_ERROR;
> +  }
> +
> +  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);
> +
> +  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;
> +  }
> +
> +  RtcWrite (DS1307_YR_REG_ADDR, DecimalToBcd8 (Time->Year % 100));
> +  RtcWrite (DS1307_MON_REG_ADDR, DecimalToBcd8 (Time->Month));
> +  RtcWrite (DS1307_DATE_REG_ADDR, DecimalToBcd8 (Time->Day));
> +  RtcWrite (DS1307_HR_REG_ADDR, DecimalToBcd8 (Time->Hour));
> +  RtcWrite (DS1307_MIN_REG_ADDR, DecimalToBcd8 (Time->Minute));
> +  RtcWrite (DS1307_SEC_REG_ADDR, DecimalToBcd8 (Time->Second));
> +
> +  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.
> +  @retval EFI_UNSUPPORTED       A wakeup timer is not supported on this
> +                                platform.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibGetWakeupTime (
> +  OUT  BOOLEAN                  *Enabled,
> +  OUT  BOOLEAN                  *Pending,
> +  OUT  EFI_TIME                 *Time
> +  )
> +{
> +  // The DS1307 does not support setting the alarm
> +  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
> +  )
> +{
> +  // The DS1307 does not support setting the alarm
> +  return EFI_UNSUPPORTED;
> +}
> +
> +STATIC
> +VOID
> +I2cDriverRegistrationEvent (
> +  IN  EFI_EVENT                 Event,
> +  IN  VOID                      *Context
> +  )
> +{
> +  EFI_STATUS                    Status;
> +  EFI_I2C_MASTER_PROTOCOL       *I2cMaster;
> +  UINTN                         BusFrequency;
> +
> +  Status = gBS->LocateProtocol (&gEfiI2cMasterProtocolGuid, NULL, (VOID 
> **)&I2cMaster);
> +
> +  gBS->CloseEvent (Event);
> +
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = I2cMaster->Reset (I2cMaster);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a: I2CMaster->Reset () failed - %r\n",
> +      __FUNCTION__, Status));
> +    return;
> +  }
> +
> +  BusFrequency = FixedPcdGet16 (PcdI2cBusFrequency);
> +  Status = I2cMaster->SetBusFrequency (I2cMaster, &BusFrequency);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a: I2CMaster->SetBusFrequency () failed - %r\n",
> +      __FUNCTION__, Status));
> +    return;
> +  }
> +
> +  mI2cMaster = I2cMaster;
> +}
> +
> +/**
> +  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
> +  )
> +{
> +  //
> +  // 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/Ds1307RtcLib/Ds1307RtcLib.dec 
> b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
> new file mode 100644
> index 0000000..1aaf897
> --- /dev/null
> +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
> @@ -0,0 +1,26 @@
> +#/** @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                   = Ds1307RtcLib
> +  PACKAGE_GUID                   = 0c095cf6-834d-4fa2-a5a0-31ac35591ad2
> +  PACKAGE_VERSION                = 0.1
> +
> +[Guids]
> +  gDs1307RtcLibTokenSpaceGuid = { 0xd939eb84, 0xa95a, 0x46a0, { 0xa8, 0x2b, 
> 0xb9, 0x64, 0x30, 0xcf, 0xf5, 0x99 }}
> +
> +[PcdsFixedAtBuild]
> +  gDs1307RtcLibTokenSpaceGuid.PcdI2cSlaveAddress|0|UINT8|0x00000001
> +  gDs1307RtcLibTokenSpaceGuid.PcdI2cBusFrequency|0|UINT32|0x00000002
> diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf 
> b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> new file mode 100644
> index 0000000..268873b
> --- /dev/null
> +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf
> @@ -0,0 +1,45 @@
> +#  @Ds1307RtcLib.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                      = Ds1307RtcLib
> +  FILE_GUID                      = 7112fb46-8dda-4a41-ac40-bf212fedfc08
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = RealTimeClockLib
> +
> +[Sources.common]
> +  Ds1307RtcLib.c
> +
> +[Packages]
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  MdePkg/MdePkg.dec
> +  Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec
> +
> +[LibraryClasses]
> +  DebugLib
> +  UefiBootServicesTableLib
> +  UefiLib
> +
> +[Protocols]
> +  gEfiDriverBindingProtocolGuid        ## CONSUMES
> +  gEfiI2cMasterProtocolGuid            ## CONSUMES
> +
> +[FixedPcd]
> +  gDs1307RtcLibTokenSpaceGuid.PcdI2cSlaveAddress
> +  gDs1307RtcLibTokenSpaceGuid.PcdI2cBusFrequency
> +
> +[Depex]
> +  gEfiI2cMasterProtocolGuid
> -- 
> 1.9.1
> 
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to