1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 #ifndef LIBRARIES_PERIPHDRIVERS_SOURCE_RTC_RTC_REVA_H_
22 #define LIBRARIES_PERIPHDRIVERS_SOURCE_RTC_RTC_REVA_H_
23 
24 #include "gpio.h"
25 #include "mxc_delay.h"
26 #include "mxc_device.h"
27 #include "mxc_errors.h"
28 #include "mxc_sys.h"
29 #include "rtc_reva_regs.h"
30 #include "rtc.h"
31 #include "tmr.h"
32 
33 typedef enum {
34     MXC_RTC_REVA_SQUARE_WAVE_DISABLED, ///< Sq. wave output disabled
35     MXC_RTC_REVA_SQUARE_WAVE_ENABLED, ///< Sq. wave output enabled
36 } mxc_rtc_reva_sqwave_en_t;
37 
38 #define MXC_RTC_REVA_CTRL_RESET_DEFAULT (0x0000UL)
39 #define MXC_RTC_REVA_IS_BUSY (MXC_F_RTC_REVA_CTRL_BUSY & MXC_RTC->ctrl)
40 #define MXC_RTC_REVA_IS_ENABLED (MXC_F_RTC_REVA_CTRL_RTCE & MXC_RTC->ctrl)
41 
42 #define MXC_RTC_REVA_TRIM_PERIODS 5
43 #define MXC_RTC_REVA_TICKS_PER_PERIOD (MXC_RTC_MAX_SSEC / MXC_RTC_REVA_TRIM_PERIODS)
44 #define PPM(ppm) ((ppm * 1000000) / 4096)
45 
46 #define MXC_BUSY_TIMEOUT 1000 // Timeout counts for the Busy bit
47 
48 int MXC_RTC_RevA_Init(mxc_rtc_reva_regs_t *rtc, uint32_t sec, uint32_t ssec);
49 int MXC_RTC_RevA_EnableInt(mxc_rtc_reva_regs_t *rtc, uint32_t mask);
50 int MXC_RTC_RevA_DisableInt(mxc_rtc_reva_regs_t *rtc, uint32_t mask);
51 int MXC_RTC_RevA_SetTimeofdayAlarm(mxc_rtc_reva_regs_t *rtc, uint32_t ras);
52 int MXC_RTC_RevA_SetSubsecondAlarm(mxc_rtc_reva_regs_t *rtc, uint32_t rssa);
53 int MXC_RTC_RevA_Start(mxc_rtc_reva_regs_t *rtc);
54 int MXC_RTC_RevA_Stop(mxc_rtc_reva_regs_t *rtc);
55 int MXC_RTC_RevA_SquareWave(mxc_rtc_reva_regs_t *rtc, mxc_rtc_reva_sqwave_en_t sqe,
56                             mxc_rtc_freq_sel_t ft);
57 int MXC_RTC_RevA_Trim(mxc_rtc_reva_regs_t *rtc, int8_t trm);
58 int MXC_RTC_RevA_GetFlags(mxc_rtc_reva_regs_t *rtc);
59 int MXC_RTC_RevA_ClearFlags(mxc_rtc_reva_regs_t *rtc, int flags);
60 int MXC_RTC_RevA_GetSubSecond(mxc_rtc_reva_regs_t *rtc);
61 int MXC_RTC_RevA_GetSecond(mxc_rtc_reva_regs_t *rtc);
62 int MXC_RTC_RevA_GetSubSeconds(mxc_rtc_reva_regs_t *rtc, uint32_t *ssec);
63 int MXC_RTC_RevA_GetSeconds(mxc_rtc_reva_regs_t *rtc, uint32_t *sec);
64 int MXC_RTC_RevA_GetTime(mxc_rtc_reva_regs_t *rtc, uint32_t *sec, uint32_t *subsec);
65 int MXC_RTC_RevA_GetBusyFlag(mxc_rtc_reva_regs_t *rtc);
66 int MXC_RTC_RevA_TrimCrystal(mxc_rtc_reva_regs_t *rtc, mxc_tmr_regs_t *tmr);
67 
68 #endif // LIBRARIES_PERIPHDRIVERS_SOURCE_RTC_RTC_REVA_H_
69