| /****************************************************************************** |
| * |
| * Copyright (C) 2015 - 2017 Xilinx, Inc. All rights reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy |
| * of this software and associated documentation files (the "Software"), to deal |
| * in the Software without restriction, including without limitation the rights |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| * copies of the Software, and to permit persons to whom the Software is |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * Use of the Software is limited solely to applications: |
| * (a) running on a Xilinx device, or |
| * (b) that interact with a Xilinx device through a bus or interconnect. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF |
| * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| * |
| * Except as contained in this notice, the name of the Xilinx shall not be used |
| * in advertising or otherwise to promote the sale, use or other dealings in |
| * this Software without prior written authorization from Xilinx. |
| * |
| ******************************************************************************/ |
| /*****************************************************************************/ |
| /** |
| * @file xrtcpsu.h |
| * @addtogroup rtcpsu_v1_5 |
| * @{ |
| * @details |
| * |
| * The Xilinx RTC driver component. This component supports the Xilinx |
| * RTC Controller. RTC Core and RTC controller are the two main important sub- |
| * components for this RTC module. RTC core can run even in the battery powered |
| * domain when the power from auxiliary source is down. Because of this, RTC core |
| * latches the calibration,programmed time. This core interfaces with the crystal |
| * oscillator and maintains current time in seconds.Calibration circuitry |
| * calculates a second with maximum 1 PPM inaccuracy using a crystal oscillator |
| * with arbitrary static inaccuracy. Core also responsible to maintain control |
| * value used by the oscillator and power switching circuitry. |
| * |
| * RTC controller includes an APB interface responsible for register access with |
| * in controller and core. It contains alarm generation logic including the alarm |
| * register to hold alarm time in seconds.Interrupt management using Interrupt |
| * status, Interrupt mask, Interrupt enable, Interrupt disable registers are |
| * included to manage alarm and seconds interrupts. Address Slave error interrupts |
| * are not being handled by this driver component. |
| * |
| * This driver supports the following features: |
| * - Setting the RTC time. |
| * - Setting the Alarm value that can be one-time alarm or a periodic alarm. |
| * - Modifying the calibration value. |
| * |
| * <b>Initialization & Configuration</b> |
| * |
| * The XRtcPsu_Config structure is used by the driver to configure itself. |
| * Fields inside this structure are properties of XRtcPsu based on its hardware |
| * build. |
| * |
| * To support multiple runtime loading and initialization strategies employed |
| * by various operating systems, the driver instance can be initialized in the |
| * following way: |
| * |
| * - XRtcPsu_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a |
| * configuration structure provided by the caller. If running in a system |
| * with address translation, the parameter EffectiveAddr should be the |
| * virtual address. |
| * |
| * <b>Interrupts</b> |
| * |
| * The driver defaults to no interrupts at initialization such that interrupts |
| * must be enabled if desired. An interrupt is generated for one of the |
| * following conditions. |
| * |
| * - Alarm is generated. |
| * - A new second is generated. |
| * |
| * The application can control which interrupts are enabled using the |
| * XRtcPsu_SetInterruptMask() function. |
| * |
| * In order to use interrupts, it is necessary for the user to connect the |
| * driver interrupt handler, XRtcPsu_InterruptHandler(), to the interrupt |
| * system of the application. A separate handler should be provided by the |
| * application to communicate with the interrupt system, and conduct |
| * application specific interrupt handling. An application registers its own |
| * handler through the XRtcPsu_SetHandler() function. |
| * |
| * <pre> |
| * MODIFICATION HISTORY: |
| * |
| * Ver Who Date Changes |
| * ----- ----- -------- ----------------------------------------------- |
| * 1.00 kvn 04/21/15 First release |
| * 1.1 kvn 09/25/15 Modify control register to enable battery |
| * switching when vcc_psaux is not available. |
| * 1.3 vak 04/25/16 Corrected the RTC read and write time logic(cr#948833). |
| * 1.4 MNK 01/27/17 Corrected calibration and frequency macros based on |
| * rtc input oscillator frequency ( 32.768Khz). |
| * ms 03/17/17 Added readme.txt file in examples folder for doxygen |
| * generation. |
| * ms 04/10/17 Modified filename tag in examples to include them in |
| * doxygen examples. |
| * 1.5 ms 08/27/17 Fixed compilation warnings in xrtcpsu.c file. |
| * ms 08/29/17 Updated the code as per source code style. |
| * </pre> |
| * |
| ******************************************************************************/ |
| |
| |
| #ifndef XRTC_H_ /* prevent circular inclusions */ |
| #define XRTC_H_ /* by using protection macros */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /***************************** Include Files *********************************/ |
| |
| #include "xstatus.h" |
| #include "xil_assert.h" |
| #include "xil_io.h" |
| #include "xrtcpsu_hw.h" |
| #include "xil_types.h" |
| |
| /************************** Constant Definitions *****************************/ |
| |
| /** @name Callback events |
| * |
| * These constants specify the handler events that an application can handle |
| * using its specific handler function. Note that these constants are not bit |
| * mask, so only one event can be passed to an application at a time. |
| * |
| * @{ |
| */ |
| #define XRTCPSU_EVENT_ALARM_GEN 1U /**< Alarm generated event */ |
| #define XRTCPSU_EVENT_SECS_GEN 2U /**< A new second generated event */ |
| /*@}*/ |
| |
| #define XRTCPSU_CRYSTAL_OSC_EN (u32)1 << XRTC_CTL_OSC_SHIFT |
| /**< Separate Mask for Crystal oscillator bit Enable */ |
| |
| /**************************** Type Definitions *******************************/ |
| |
| /******************************************************************************/ |
| /** |
| * This data type defines a handler that an application defines to communicate |
| * with interrupt system to retrieve state information about an application. |
| * |
| * @param CallBackRef is a callback reference passed in by the upper layer |
| * when setting the handler, and is passed back to the upper layer |
| * when the handler is called. It is used to find the device driver |
| * instance. |
| * @param Event contains one of the event constants indicating events that |
| * have occurred. |
| * @param EventData contains the number of bytes sent or received at the |
| * time of the call for send and receive events and contains the |
| * modem status for modem events. |
| * |
| ******************************************************************************/ |
| typedef void (*XRtcPsu_Handler) (void *CallBackRef, u32 Event); |
| |
| /** |
| * This typedef contains configuration information for a device. |
| */ |
| typedef struct { |
| u16 DeviceId; /**< Unique ID of device */ |
| u32 BaseAddr; /**< Register base address */ |
| } XRtcPsu_Config; |
| |
| /** |
| * The XRtcPsu driver instance data. The user is required to allocate a |
| * variable of this type for the RTC device in the system. A pointer |
| * to a variable of this type is then passed to the driver API functions. |
| */ |
| typedef struct { |
| XRtcPsu_Config RtcConfig; /**< Device configuration */ |
| u32 IsReady; /**< Device is initialized and ready */ |
| u32 PeriodicAlarmTime; |
| u8 IsPeriodicAlarm; |
| u32 OscillatorFreq; |
| u32 CalibrationValue; |
| XRtcPsu_Handler Handler; |
| void *CallBackRef; /**< Callback reference for event handler */ |
| u32 TimeUpdated; |
| u32 CurrTimeUpdated; |
| } XRtcPsu; |
| |
| /** |
| * This typedef contains DateTime format structure. |
| */ |
| typedef struct { |
| u32 Year; |
| u32 Month; |
| u32 Day; |
| u32 Hour; |
| u32 Min; |
| u32 Sec; |
| u32 WeekDay; |
| } XRtcPsu_DT; |
| |
| |
| /************************* Variable Definitions ******************************/ |
| |
| |
| /***************** Macros (Inline Functions) Definitions *********************/ |
| |
| #define XRTC_CALIBRATION_VALUE 0x8000U |
| #define XRTC_TYPICAL_OSC_FREQ 32768U |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro updates the current time of RTC device. |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * @param Time is the desired time for RTC in seconds. |
| * |
| * @return None. |
| * |
| * @note C-Style signature: |
| * void XRtcPsu_SetTime(XRtcPsu *InstancePtr, u32 Time) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_WriteSetTime(InstancePtr,Time) \ |
| XRtcPsu_WriteReg(((InstancePtr)->RtcConfig.BaseAddr + \ |
| XRTC_SET_TIME_WR_OFFSET),(Time)) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro returns the last set time of RTC device. Whenever a reset |
| * happens, the last set time will be zeroth day first sec. |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * |
| * @return The last set time in seconds. |
| * |
| * @note C-Style signature: |
| * u32 XRtcPsu_GetLastSetTime(XRtcPsu *InstancePtr) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_GetLastSetTime(InstancePtr) \ |
| XRtcPsu_ReadReg((InstancePtr)->RtcConfig.BaseAddr + XRTC_SET_TIME_RD_OFFSET) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro returns the calibration value of RTC device. |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * |
| * @return Calibration value for RTC. |
| * |
| * @note C-Style signature: |
| * u32 XRtcPsu_GetCalibration(XRtcPsu *InstancePtr) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_GetCalibration(InstancePtr) \ |
| XRtcPsu_ReadReg((InstancePtr)->RtcConfig.BaseAddr+XRTC_CALIB_RD_OFFSET) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro returns the current time of RTC device. |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * |
| * @return Current Time. This current time will be in seconds. |
| * |
| * @note C-Style signature: |
| * u32 XRtcPsu_ReadCurrentTime(XRtcPsu *InstancePtr) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_ReadCurrentTime(InstancePtr) \ |
| XRtcPsu_ReadReg((InstancePtr)->RtcConfig.BaseAddr+XRTC_CUR_TIME_OFFSET) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro sets the control register value of RTC device. |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * @param Value is the desired control register value for RTC. |
| * |
| * @return None. |
| * |
| * @note C-Style signature: |
| * void XRtcPsu_SetControlRegister(XRtcPsu *InstancePtr, u32 Value) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_SetControlRegister(InstancePtr, Value) \ |
| XRtcPsu_WriteReg((InstancePtr)->RtcConfig.BaseAddr + \ |
| XRTC_CTL_OFFSET,(Value)) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro returns the safety check register value of RTC device. |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * |
| * @return Safety check register value. |
| * |
| * @note C-Style signature: |
| * u32 XRtcPsu_GetSafetyCheck(XRtcPsu *InstancePtr) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_GetSafetyCheck(InstancePtr) \ |
| XRtcPsu_ReadReg((InstancePtr)->RtcConfig.BaseAddr+XRTC_SFTY_CHK_OFFSET) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro sets the safety check register value of RTC device. |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * @param Value is a safety check value to be written in register. |
| * |
| * @return None. |
| * |
| * @note C-Style signature: |
| * void XRtcPsu_SetSafetyCheck(XRtcPsu *InstancePtr, u32 Value) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_SetSafetyCheck(InstancePtr, Value) \ |
| XRtcPsu_WriteReg((InstancePtr)->RtcConfig.BaseAddr + \ |
| XRTC_SFTY_CHK_OFFSET,(Value)) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro resets the alarm register |
| * |
| * @param InstancePtr is a pointer to the XRtcPsu instance. |
| * |
| * @return None. |
| * |
| * @note C-Style signature: |
| * u32 XRtcPsu_ResetAlarm(XRtcPsu *InstancePtr) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_ResetAlarm(InstancePtr) \ |
| XRtcPsu_WriteReg((InstancePtr)->RtcConfig.BaseAddr + \ |
| XRTC_ALRM_OFFSET,XRTC_ALRM_RSTVAL) |
| |
| /****************************************************************************/ |
| /** |
| * |
| * This macro rounds off the given number |
| * |
| * @param Number is the one that needs to be rounded off.. |
| * |
| * @return The rounded off value of the input number. |
| * |
| * @note C-Style signature: |
| * u32 XRtcPsu_RoundOff(float Number) |
| * |
| *****************************************************************************/ |
| #define XRtcPsu_RoundOff(Number) \ |
| (u32)(((Number) < (u32)0) ? ((Number) - (u32)0.5) : ((Number) + (u32)0.5)) |
| |
| /************************** Function Prototypes ******************************/ |
| |
| /* Functions in xrtcpsu.c */ |
| s32 XRtcPsu_CfgInitialize(XRtcPsu *InstancePtr, XRtcPsu_Config *ConfigPtr, |
| u32 EffectiveAddr); |
| |
| void XRtcPsu_SetAlarm(XRtcPsu *InstancePtr, u32 Alarm, u32 Periodic); |
| void XRtcPsu_SecToDateTime(u32 Seconds, XRtcPsu_DT *dt); |
| u32 XRtcPsu_DateTimeToSec(XRtcPsu_DT *dt); |
| void XRtcPsu_CalculateCalibration(XRtcPsu *InstancePtr,u32 TimeReal, |
| u32 CrystalOscFreq); |
| u32 XRtcPsu_IsSecondsEventGenerated(XRtcPsu *InstancePtr); |
| u32 XRtcPsu_IsAlarmEventGenerated(XRtcPsu *InstancePtr); |
| u32 XRtcPsu_GetCurrentTime(XRtcPsu *InstancePtr); |
| void XRtcPsu_SetTime(XRtcPsu *InstancePtr,u32 Time); |
| |
| /* interrupt functions in xrtcpsu_intr.c */ |
| void XRtcPsu_SetInterruptMask(XRtcPsu *InstancePtr, u32 Mask); |
| void XRtcPsu_ClearInterruptMask(XRtcPsu *InstancePtr, u32 Mask); |
| void XRtcPsu_InterruptHandler(XRtcPsu *InstancePtr); |
| void XRtcPsu_SetHandler(XRtcPsu *InstancePtr, XRtcPsu_Handler FuncPtr, |
| void *CallBackRef); |
| |
| /* Functions in xrtcpsu_selftest.c */ |
| s32 XRtcPsu_SelfTest(XRtcPsu *InstancePtr); |
| |
| /* Functions in xrtcpsu_sinit.c */ |
| XRtcPsu_Config *XRtcPsu_LookupConfig(u16 DeviceId); |
| |
| |
| #endif /* XRTC_H_ */ |
| /** @} */ |