From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg0-x236.google.com (mail-pg0-x236.google.com [IPv6:2607:f8b0:400e:c05::236]) (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 78C962095B9CD for ; Thu, 17 Aug 2017 08:41:22 -0700 (PDT) Received: by mail-pg0-x236.google.com with SMTP id v189so45321310pgd.2 for ; Thu, 17 Aug 2017 08:43:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=oAIKKrwkURYbckMn6d8QVmxJkfpGpoGREa1iNsYjY10=; b=G6iPX0krlDgHIJM87vUtOIqeQ1ozq0leWu9EEblIfONxJH/OlklzmO8eNBKzC/8/vB wbPdKHzQS509dAT2tJ5lbJKqXurOiD+WktFmYuPaYxwOVppwIMxEssb3rXxMZDRsykPQ yw3KA2RLdKbd/zmfLj5+WBNQCWwuDZSh0wV1o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=oAIKKrwkURYbckMn6d8QVmxJkfpGpoGREa1iNsYjY10=; b=rVb/9PcO29VD2Wj5buzgR/Es052NwIdReKejGEMBqrwK08wsT7uKyPqNaCpQKiDOFm 0hgPik4Z9LkhtvehxASBXftQ5GaBXBNwck66OQPIn/WYBc0wtd0id7ZJIvr1A2rsbj/a fIAzKLoKeNSWhxbqJ3xkXUSGKAQP+/B0FzlYKdpgOaVtQ4oPu6c7wivZQ+bOvHZwXB2B wH2YIKWJIrjRS3L0j+H6KAws8CHQ6igJK7eELOomaisMCRt+ubUy2O41qfjJYOnVawZy TrfitBFLFrHB/IKQoyn0y64NtaDXaNHLefSORPultB7GBHkAaC9+JNn7hE+mR/NO+Awg vjdg== X-Gm-Message-State: AHYfb5gv8gHtRFR1zVlqcqwLsfAEK6CPrYMq9DXAWxX+xuXhFye9R9zd hxUyXGeQP6+Cab2vbH1bsw== X-Received: by 10.99.123.26 with SMTP id w26mr4419137pgc.11.1502984628619; Thu, 17 Aug 2017 08:43:48 -0700 (PDT) Received: from [10.54.2.254] ([113.53.228.78]) by smtp.googlemail.com with ESMTPSA id z8sm7875118pfk.130.2017.08.17.08.43.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 Aug 2017 08:43:47 -0700 (PDT) To: Leif Lindholm Cc: haojian.zhuang@linaro.org, ard.biesheuvel@linaro.org, linaro-uefi@lists.linaro.org, shawn.guo@linaro.org, jason.liu@linaro.org, edk2-devel@lists.01.org References: <1502287959-16806-1-git-send-email-jun.nie@linaro.org> <1502287959-16806-2-git-send-email-jun.nie@linaro.org> <20170810140314.jqqtcspfizqhhntf@bivouac.eciton.net> From: Jun Nie Message-ID: <09ad9459-9cbe-ea49-53f0-e7ce1ba74302@linaro.org> Date: Thu, 17 Aug 2017 23:43:37 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <20170810140314.jqqtcspfizqhhntf@bivouac.eciton.net> Subject: Re: [PATCH 2/4] Platforms: Add ZX RTC driver for Sanchip SoC 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: Thu, 17 Aug 2017 15:41:22 -0000 Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit On 2017年08月10日 22:03, Leif Lindholm wrote: > On Wed, Aug 09, 2017 at 10:12:37PM +0800, Jun Nie wrote: >> Runtime service is not supported yet. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Jun Nie >> --- >> .../Zx6718RealTimeClockLib/Zx296718RealTimeClock.c | 376 +++++++++++++++++++++ >> .../Zx6718RealTimeClockLib/Zx296718RealTimeClock.h | 102 ++++++ >> .../Zx296718RealTimeClock.inf | 42 +++ >> 3 files changed, 520 insertions(+) >> create mode 100644 Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.c >> create mode 100644 Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.h >> create mode 100644 Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.inf >> >> diff --git a/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.c b/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.c >> new file mode 100644 >> index 0000000..af6e5bd >> --- /dev/null >> +++ b/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.c >> @@ -0,0 +1,376 @@ >> +/** @file >> + Implement EFI RealTimeClock runtime services via RTC Lib. >> + >> + Currently this driver does not support runtime virtual calling. >> + >> + Copyright (C) 2017 Sanechips Technology Co., Ltd. >> + Copyright (c) 2017, Linaro Limited. >> + >> + 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. >> + >> + Based on the files under ArmPlatformPkg/Library/PL031RealTimeClockLib/PL031RealTimeClockLib.inf >> + >> +**/ >> + >> +#include >> +#include > > P before U. > >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +// Use EfiAtRuntime to check stage >> +#include > > L (UefiRuntimeLib) before S (UefiRuntimeServices...). > No need for a comment explaining why we include headers. > >> +#include >> +#include "Zx296718RealTimeClock.h" >> + >> +STATIC UINTN RtcBase; > > mRtcBase. > >> +STATIC BOOLEAN RTCInitialized = FALSE; > > mRTCInitialized. > >> + >> +BOOLEAN >> +EFIAPI >> +IsTimeValid( >> + IN EFI_TIME *Time >> + ) >> +{ >> + // Check the input parameters are within the range specified by UEFI >> + if ((Time->Year < 2000) || >> + (Time->Year > 2099) || >> + (Time->Month < 1 ) || >> + (Time->Month > 12 ) || >> + (Time->Day < 1 ) || >> + (Time->Day > 31 ) || >> + (Time->Hour > 23 ) || >> + (Time->Minute > 59 ) || >> + (Time->Second > 59 ) || >> + (Time->Nanosecond > 999999999) || >> + (!((Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) || ((Time->TimeZone >= -1440) && (Time->TimeZone <= 1440)))) || >> + (Time->Daylight & (~(EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT))) >> + ) { >> + return FALSE; >> + } >> + >> + return TRUE; >> +} > > This appears a direct copy of the version in > EmbeddedPkg/Library/TimeBaseLib. Can you add that TimeBaseLib library > dependency to decrease duplication? > (This may not have existed as a standalone library at the time you > started this port.) > >> + >> +VOID > > A lot of the functions in this file could do with a STATIC prefix, > since they are only used internally. > >> +Wait4Busy ( > > Semantically, this name is incorrect. > The function is waiting _while_ the state is RTC_BUSY, so seems to me > it should be called WaitBusy. > >> + VOID >> + ) >> +{ >> + UINT32 Val, Retry = 1000; >> + do { >> + MicroSecondDelay (200); > > Why 200? It is just a suggested delay time according to RTC clock frequency. You want a RTC_WAIT_DELAY macro here for better understanding, right? > >> + Val = MmioRead32 (RtcBase + RTCSTS); > > MmioRead32 does not imply any barrier semantics. > If this component will only ever be supported on ARM platforms, you > could insert an ArmDataMemoryBarrier (). Otherwise, MemoryFence (). > >> + } while(Val & RTC_BUSY && Retry--); > > Space before (. > >> + >> + if (!Retry) >> + DEBUG((DEBUG_ERROR, "%a Rtc busy retry timeout\n", __func__)); > > Space after DEBUG. > >> +} >> + >> +VOID >> +RTCWriteReg ( >> + IN UINT32 Reg, >> + IN UINT32 Val >> + ) >> +{ >> + Wait4Busy (); >> + MmioWrite32 (RtcBase + RTCCFGID, CONFIG_PARMETER); >> + Wait4Busy (); >> + MmioWrite32 (RtcBase + Reg, Val); >> +} >> + >> +UINT32 >> +RTCReadReg ( >> + IN UINT32 Reg >> + ) >> +{ >> + Wait4Busy (); >> + return MmioRead32 (RtcBase + Reg); >> +} >> + >> +VOID >> +InitializeRTC ( >> + VOID >> + ) >> +{ >> + UINTN Val = (UINTN)FixedPcdGet64 (PcdZxRtcClockFreq); >> + >> + RTCWriteReg (RTCCLKCNT, Val - 1); >> + Val = RTCReadReg (RTCPOWERINIT1); >> + if (RTC_POWER_INI1_PARA != Val) { >> + RTCWriteReg (RTCCTL, 0); >> + MicroSecondDelay (INIT_DELAY); >> + Val = RTCReadReg (RTCCTL); >> + Val |= RTC_CTRL_BIT6_1; >> + RTCWriteReg (RTCCTL, Val); >> + Val = RTCReadReg (RTCCTL); >> + Val &= RTC_CTRL_MODULE24 | RTC_CTRL_STOP; >> + RTCWriteReg (RTCCTL, Val); >> + } >> + Val = RTCReadReg (RTCINT); >> + Val &= ~RTC_IT_MASK; >> + RTCWriteReg (RTCINT, Val); >> + Val = RTCReadReg (RTCSTS); >> + Val |= (RTC_POWER_UP | RTC_ALARM | RTC_TIMER); >> + RTCWriteReg (RTCSTS, Val); >> + //Wait4Busy (); > > No disabled code, please. > >> + // TODO: write 0x6 to AON int clear > > TODO is fine for early pass of review to get some overall feedback, > but this needs to be resolved before anything is merged. > >> + RTCWriteReg (RTCPOWERINIT1, RTC_POWER_INI1_PARA); >> + RTCWriteReg (RTCPOWERINIT2, RTC_POWER_INI2_PARA); >> + Val = RTC_CTRL_MODULE24 | RTC_CTRL_RUN | RTC_CTRL_CLK_32K_OUTEN >> + | RTC_CTRL_BIT6_1; > > Could there be a more human readable alias for RTC_CTRL_BIT6_1 > (describing what setting that bit actually does)? sure. > >> + RTCWriteReg (RTCCTL, Val); >> + >> + RTCInitialized = TRUE; >> +} >> + >> +/** >> + 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. >> + @retval EFI_SECURITY_VIOLATION The time could not be retrieved due to an authentication failure. >> +**/ >> +EFI_STATUS >> +EFIAPI >> +LibGetTime ( >> + OUT EFI_TIME *Time, >> + OUT EFI_TIME_CAPABILITIES *Capabilities >> + ) >> +{ >> + EFI_STATUS Status = EFI_SUCCESS; >> + >> + // Ensure Time is a valid pointer >> + if (NULL == Time) { > > No jeopardy comparisons please. > if (Time == NULL) > >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + // Initialize the hardware if not already done >> + if (!RTCInitialized) { >> + InitializeRTC (); >> + } >> + >> +#if 0 >> + /* fake time */ >> + Time->Year = 2015; >> + Time->Month = 1; >> + Time->Day = 1; >> + Time->Hour = 0; >> + Time->Minute = 0; >> + Time->Second = 0; >> + Time->Nanosecond = 0; >> +#endif > > No disabled code blocks, please. > >> + >> + RTCWriteReg (RTCGETTIME, 0); >> + Time->Year = BCD4_2_BIN (RTCReadReg (RTCYEAR)); >> + Time->Year += TM_YEAR_START; >> + >> + Time->Month = BCD4_2_BIN (RTCReadReg (RTCMONT)); >> + Time->Day = BCD4_2_BIN (RTCReadReg (RTCDAY)); >> + Time->Hour = BCD4_2_BIN (RTCReadReg (RTCHOUR)); >> + Time->Minute = BCD4_2_BIN (RTCReadReg (RTCMIN)); >> + Time->Second = BCD4_2_BIN (RTCReadReg (RTCSEC)); >> + Time->Nanosecond = 0; >> + Time->Daylight = 0; >> + Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE; >> + >> + if(!IsTimeValid (Time)) { >> + Status = EFI_UNSUPPORTED; >> + } >> + >> + 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. >> + @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +LibSetTime ( >> + IN EFI_TIME *Time >> + ) >> +{ >> + EFI_STATUS Status = EFI_SUCCESS; >> + >> + // Check the input parameters are within the range specified by UEFI >> + if(!IsTimeValid (Time)){ >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + // Initialize the hardware if not already done >> + if (!RTCInitialized) { >> + InitializeRTC (); >> + } >> + >> + RTCWriteReg (RTCSEC, BIN2BCD (Time->Second)); >> + RTCWriteReg (RTCMIN, BIN2BCD (Time->Minute)); >> + RTCWriteReg (RTCHOUR, BIN2BCD (Time->Hour)); >> + RTCWriteReg (RTCDAY, BIN2BCD (Time->Day)); >> + RTCWriteReg (RTCMONT, BIN2BCD (Time->Month)); >> + RTCWriteReg (RTCYEAR, BIN2BCD (Time->Year - TM_YEAR_START)); >> + return Status; >> +} >> + >> + >> +/** >> + 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 >> + ) >> +{ >> + // Not a required 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 >> + ) >> +{ >> + // Not a required feature >> + return EFI_UNSUPPORTED; >> +} >> + >> + >> + >> +/** >> + 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, or an EFI runtime 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; >> + EFI_HANDLE Handle; >> + >> + > > Why blank lines? > >> + EFI_TIME EfiTime; >> + >> + // Setup the setters and getters >> + gRT->GetTime = LibGetTime; >> + gRT->SetTime = LibSetTime; >> + gRT->GetWakeupTime = LibGetWakeupTime; >> + gRT->SetWakeupTime = LibSetWakeupTime; >> + >> + > > Just one blank line is fine. > >> + RtcBase = (UINTN)FixedPcdGet64 (PcdZxRtcClockBase); >> + >> + (VOID)gRT->GetTime (&EfiTime, NULL); >> + if ((EfiTime.Year < 2015) || (EfiTime.Year > 2099)){ >> + EfiTime.Year = 2015; >> + EfiTime.Month = 1; >> + EfiTime.Day = 1; >> + EfiTime.Hour = 0; >> + EfiTime.Minute = 0; >> + EfiTime.Second = 0; >> + EfiTime.Nanosecond = 0; >> + Status = gRT->SetTime (&EfiTime); >> + if (EFI_ERROR (Status)) >> + { >> + DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n", __FUNCTION__, >> + __LINE__, Status)); >> + } >> + } >> + >> + // Install the protocol >> + Handle = NULL; >> + Status = gBS->InstallMultipleProtocolInterfaces ( >> + &Handle, >> + &gEfiRealTimeClockArchProtocolGuid, NULL, >> + NULL >> + ); >> + >> + return Status; >> +} >> + >> + >> +/** >> + 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 >> + ) >> +{ >> + // >> + // Only needed if you are going to support the OS calling RTC functions in virtual mode. >> + // You will need to call EfiConvertPointer (). To convert any stored physical addresses >> + // to virtual address. After the OS transitions to calling in virtual mode, all future >> + // runtime calls will be made in virtual mode. >> + // >> + return; >> +} >> diff --git a/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.h b/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.h >> new file mode 100644 >> index 0000000..3b5a4d4 >> --- /dev/null >> +++ b/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.h >> @@ -0,0 +1,102 @@ >> +/** @file >> +* >> +* Copyright (C) 2017 Sanechips Technology Co., Ltd. >> +* Copyright (c) 2017, Linaro Ltd. >> +* >> +* 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. >> +* >> +* Based on the files under ArmPlatformPkg/Library/PL031RealTimeClockLib/PL031RealTimeClockLib.inf >> +**/ >> + >> + >> +#ifndef __DS3231_REAL_TIME_CLOCK_H__ >> +#define __DS3231_REAL_TIME_CLOCK_H__ >> + >> +#define RTC_POWER_INI1_PARA (0xCDBC) >> +#define RTC_POWER_INI2_PARA (0xCFCC) >> +#define CONFIG_PARMETER (0xC1CD) >> + >> +#define ZX_RTC_CMP_VALUE (0x3FFF) >> +#define WAIT_FOR_COUNT (2000) >> +#define INIT_DELAY (100) >> + >> + >> +/* RTC Control register description */ >> +#define RTC_CTRL_STOP (~(0x1 << 0)) >> +#define RTC_CTRL_RUN (0x1 << 0) >> +#define RTC_CTRL_ROUND30S (0x1 << 1) >> +#define RTC_CTRL_AUTO_COMPENSATION (0x1 << 2) >> +#define RTC_CTRL_MODULE12 (0x1 << 3) >> +#define RTC_CTRL_MODULE24 (~(0x1 << 3)) >> +#define RTC_CTRL_SET_32_COUNTER (0x1 << 5) >> +#define RTC_CTRL_SOFT_RESET (0x1 << 6) >> +#define RTC_CTRL_CLK_32K_OUTEN (0x1 << 8) >> + >> +#define RTC_CTRL_BIT6_0 ( ~(0x1 << 6)) >> +#define RTC_CTRL_BIT6_1 (0x1 << 6) >> + >> + >> + >> +/* RTC Interrupt register description */ >> +#define RTC_EVERY_MASK (0x3 << 0) >> +#define RTC_EVERY_SEC 0x00 /* second periodic intrrupt */ >> +#define RTC_EVERY_MIN 0x01 /* minute periodic interrupt */ >> +#define RTC_EVERY_HR 0x02 /* hour periodic interrupt */ >> +#define RTC_EVERY_DAY 0x03 /* day periodic interrupt */ >> +#define RTC_IT_TIMER (0x1 << 2) /* Enable periodic interrupt */ >> +#define RTC_IT_ALARM (0x1 << 3) /* Enable alarm clock interrupt */ >> +#define RTC_IT_MASK (0x3 << 2) >> + >> +/* RTC Status register description */ >> +#define RTC_BUSY (0x1 << 0) /* Read-only, indicate refresh*/ >> +#define RTC_RUN (0x1 << 1) /* Read-only, RTC is running */ >> +#define RTC_ALARM (0x1 << 6) /* Read/Write, Alarm interrupt has been generated */ >> +#define RTC_TIMER (0x1 << 7) /* Read/Write, Timer interrupt has been generated */ >> +#define RTC_POWER_UP (0x1 << 8) /* Read/Write, Reset */ >> + >> +#define TM_YEAR_START 1900 >> + >> +#define TM_MONTH_OFFSET 1 >> + >> +#define TM_WDAY_SUNDAY 0 >> +#define ZX_RTC_SUNDAY 7 >> + >> +#define BCD2BIN(val) (((val) & 0x0f) + ((val) >> 4) * 10) >> +#define BIN2BCD(val) ((((val) / 10) << 4) + (val) % 10) >> + >> +#define BCD4_2_BIN(x) (( (x) & 0x0F) + \ >> + ((((x) & 0x0F0) >> 4) * 10) + \ >> + ((((x) & 0xF00) >> 8) * 100) + \ >> + ((((x) & 0xF000) >> 12) * 1000)) >> + >> + >> +#define BIN_2_BCD4(x) (((x % 10) & 0x0F) | \ >> + (((x /10 ) % 10) << 4) | \ >> + (((x /100) % 10) << 8) | \ >> + (((x /1000) % 10) << 12)) >> + >> +/* RTC register offset */ >> +#define RTCVER 0 >> +#define RTCSEC 4 >> +#define RTCMIN 8 >> +#define RTCHOUR 0xc >> +#define RTCDAY 0x10 >> +#define RTCMONT 0x14 >> +#define RTCYEAR 0x18 >> +#define RTCWEEK 0x1c >> +#define RTCCTL 0x38 >> +#define RTCSTS 0x3c >> +#define RTCINT 0x40 >> +#define RTCCFGID 0x48 >> +#define RTCPOWERINIT1 0x4c >> +#define RTCPOWERINIT2 0x50 >> +#define RTCGETTIME 0x54 >> +#define RTCCLKCNT 0x58 >> + >> +#endif >> diff --git a/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.inf b/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.inf >> new file mode 100644 >> index 0000000..0a6852b >> --- /dev/null >> +++ b/Silicon/Sanchip/Library/Zx6718RealTimeClockLib/Zx296718RealTimeClock.inf >> @@ -0,0 +1,42 @@ >> +#/** @file >> +# >> +# Copyright (c) 2017, Linaro Limited. 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 = 0x00010005 > > 0x00010019. > (Or 1.25.) > >> + BASE_NAME = Zx296718RealTimeClockLib >> + FILE_GUID = 4e1aaa26-597c-4f01-a8fc-fdf1adc1400f >> + MODULE_TYPE = BASE >> + VERSION_STRING = 1.0 >> + LIBRARY_CLASS = RealTimeClockLib >> + >> +[Sources.common] >> + Zx296718RealTimeClock.c >> + >> +[Packages] >> + MdePkg/MdePkg.dec >> + EmbeddedPkg/EmbeddedPkg.dec >> + Silicon/Sanchip/SanchipPkg.dec > > Please sort alphabetically. > >> + >> +[LibraryClasses] >> + IoLib >> + UefiLib >> + DebugLib >> + PcdLib >> + TimerLib >> +# Use EFiAtRuntime to check stage >> + UefiRuntimeLib > > Please sort alphabetically > >> + >> +[FixedPcd] >> + gSanchipTokenSpaceGuid.PcdZxRtcClockBase >> + gSanchipTokenSpaceGuid.PcdZxRtcClockFreq >> -- >> 1.9.1 >> All other coding style and inf version comments will be addressed.