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_SMON_SMON_REVA_H_
22 #define LIBRARIES_PERIPHDRIVERS_SOURCE_SMON_SMON_REVA_H_
23 
24 #include <stddef.h>
25 #include "mxc_assert.h"
26 #include "mxc_pins.h"
27 #include "mxc_lock.h"
28 #include "mxc_delay.h"
29 #include "mxc_device.h"
30 #include "smon.h"
31 #include "smon_reva_regs.h"
32 
33 /**
34  * @brief   External Sensor Number
35  *
36  */
37 typedef enum {
38     SMON_REVA_EXTSENSOR_0 = MXC_F_SMON_REVA_EXTSCN_EXTS_EN0,
39     SMON_REVA_EXTSENSOR_1 = MXC_F_SMON_REVA_EXTSCN_EXTS_EN1,
40     SMON_REVA_EXTSENSOR_2 = MXC_F_SMON_REVA_EXTSCN_EXTS_EN2,
41     SMON_REVA_EXTSENSOR_3 = MXC_F_SMON_REVA_EXTSCN_EXTS_EN3,
42     SMON_REVA_EXTSENSOR_4 = MXC_F_SMON_REVA_EXTSCN_EXTS_EN4,
43     SMON_REVA_EXTSENSOR_5 = MXC_F_SMON_REVA_EXTSCN_EXTS_EN5,
44 } mxc_smon_reva_ext_sensor_t;
45 
46 /**
47  * @brief   Enum for Clock Divider
48  *
49  */
50 typedef enum {
51     SMON_REVA_CLK_DIVIDE_1 = MXC_S_SMON_REVA_EXTSCN_DIVCLK_DIV1,
52     SMON_REVA_CLK_DIVIDE_2 = MXC_S_SMON_REVA_EXTSCN_DIVCLK_DIV2,
53     SMON_REVA_CLK_DIVIDE_4 = MXC_S_SMON_REVA_EXTSCN_DIVCLK_DIV4,
54     SMON_REVA_CLK_DIVIDE_8 = MXC_S_SMON_REVA_EXTSCN_DIVCLK_DIV8,
55     SMON_REVA_CLK_DIVIDE_16 = MXC_S_SMON_REVA_EXTSCN_DIVCLK_DIV16,
56     SMON_REVA_CLK_DIVIDE_32 = MXC_S_SMON_REVA_EXTSCN_DIVCLK_DIV32,
57     SMON_REVA_CLK_DIVIDE_64 = MXC_S_SMON_REVA_EXTSCN_DIVCLK_DIV64,
58 } mxc_smon_reva_clk_divide_t;
59 
60 /**
61  * @brief   Enum for Frequency Divider
62  *
63  */
64 typedef enum {
65     SMON_REVA_FREQ_DIVIDE_4 = MXC_S_SMON_REVA_EXTSCN_EXTFRQ_FREQ2000HZ,
66     SMON_REVA_FREQ_DIVIDE_8 = MXC_S_SMON_REVA_EXTSCN_EXTFRQ_FREQ1000HZ,
67     SMON_REVA_FREQ_DIVIDE_16 = MXC_S_SMON_REVA_EXTSCN_EXTFRQ_FREQ500HZ,
68     SMON_REVA_FREQ_DIVIDE_32 = MXC_S_SMON_REVA_EXTSCN_EXTFRQ_FREQ250HZ,
69     SMON_REVA_FREQ_DIVIDE_64 = MXC_S_SMON_REVA_EXTSCN_EXTFRQ_FREQ125HZ,
70     SMON_REVA_FREQ_DIVIDE_128 = MXC_S_SMON_REVA_EXTSCN_EXTFRQ_FREQ63HZ,
71     SMON_REVA_FREQ_DIVIDE_256 = MXC_S_SMON_REVA_EXTSCN_EXTFRQ_FREQ31HZ,
72 } mxc_smon_reva_freq_divide_t;
73 
74 /**
75  * @brief   Voltage Monitor Thresholds
76  *
77  */
78 typedef enum {
79     SMON_REVA_VTM_THRESHOLD_1_6, ///< 1.6 V
80     SMON_REVA_VTM_THRESHOLD_2_2, ///< 2.2 V
81     SMON_REVA_VTM_THRESHOLD_2_8, ///< 2.8 V
82 } mxc_smon_reva_vtm_t;
83 
84 /**
85  * @brief   Temperature Sensor Thresholds
86  *
87  */
88 typedef enum {
89     SMON_REVA_TEMP_THRESHOLD_NEG_50, ///< -50 *C
90     SMON_REVA_TEMP_THRESHOLD_NEG_30, ///< -30 *C
91 } mxc_smon_reva_temp_t;
92 
93 /**
94  * @brief   Digital Fault Interrupt mode
95  *
96  */
97 typedef enum {
98     SMON_REVA_DFD_INTERRUPT_NMI, ///< DRS/NMI
99     SMON_REVA_DFD_INTERRUPT_PFW, ///< PFW IRQ
100 } mxc_smon_reva_interrupt_mode_t;
101 
102 /**
103  * @brief   Digital Fault Low Power mode
104  *
105  */
106 typedef enum {
107     SMON_REVA_DFD_LOWPOWER_ENABLE, ///< DFD enabled during LowPower mode
108     SMON_REVA_DFD_LOWPOWER_DISABLE, ///< DFD disabled during LowPower mode
109 } mxc_smon_reva_lowpower_mode_t;
110 
111 /**
112  * @brief   Register to check if busy
113  *
114  */
115 typedef enum {
116     SMON_REVA_EXTSENSOR = MXC_F_SMON_REVA_SECST_EXTSRS,
117     SMON_REVA_INTSENSOR = MXC_F_SMON_REVA_SECST_INTSRS,
118     SMON_REVA_SECALARM = MXC_F_SMON_REVA_SECST_SECALRS,
119 } mxc_smon_reva_busy_t;
120 
121 /**
122  * @brief   The information required to configure an external sensor
123  *
124  */
125 typedef struct {
126     mxc_smon_reva_ext_sensor_t sensorNumber;
127     mxc_smon_reva_clk_divide_t clockDivide;
128     mxc_smon_reva_freq_divide_t freqDivide;
129     uint8_t errorCount;
130     uint8_t data;
131 } mxc_smon_reva_ext_cfg_t;
132 
133 int MXC_SMON_RevA_ExtSensorEnable(mxc_smon_reva_regs_t *smon, mxc_smon_reva_ext_cfg_t *cfg,
134                                   uint32_t delay);
135 
136 int MXC_SMON_RevA_SetSensorFrequency(mxc_smon_reva_regs_t *smon, mxc_smon_reva_ext_cfg_t *cfg);
137 
138 int MXC_SMON_RevA_SetErrorCount(mxc_smon_reva_regs_t *smon, uint8_t errorCount);
139 
140 int MXC_SMON_RevA_TempSensorEnable(mxc_smon_reva_regs_t *smon, mxc_smon_reva_temp_t threshold,
141                                    uint32_t delay);
142 
143 int MXC_SMON_RevA_SetTempThreshold(mxc_smon_reva_regs_t *smon, mxc_smon_reva_temp_t threshold);
144 
145 int MXC_SMON_RevA_VoltageMonitorEnable(mxc_smon_reva_regs_t *smon, mxc_smon_reva_vtm_t threshold,
146                                        uint32_t delay);
147 
148 int MXC_SMON_RevA_SetVTMThreshold(mxc_smon_reva_regs_t *smon, mxc_smon_reva_vtm_t threshold);
149 
150 int MXC_SMON_RevA_ActiveDieShieldEnable(mxc_smon_reva_regs_t *smon, uint32_t delay);
151 
152 int MXC_SMON_RevA_SelfDestructByteEnable(mxc_smon_reva_regs_t *smon, mxc_smon_reva_ext_cfg_t *cfg,
153                                          uint32_t delay);
154 
155 void MXC_SMON_RevA_EnablePUFTrimErase(mxc_smon_reva_regs_t *smon);
156 
157 void MXC_SMON_RevA_DisablePUFTrimErase(mxc_smon_reva_regs_t *smon);
158 
159 int MXC_SMON_RevA_DigitalFaultDetectorEnable(mxc_smon_reva_regs_t *smon,
160                                              mxc_smon_reva_interrupt_mode_t interruptMode,
161                                              mxc_smon_reva_lowpower_mode_t lowPowerMode,
162                                              uint32_t delay);
163 
164 uint32_t MXC_SMON_RevA_GetFlags(mxc_smon_reva_regs_t *smon);
165 
166 void MXC_SMON_RevA_ClearFlags(mxc_smon_reva_regs_t *smon, uint32_t flags);
167 
168 void MXC_SMON_RevA_ExtSensorLock(mxc_smon_reva_regs_t *smon);
169 
170 void MXC_SMON_RevA_IntSensorLock(mxc_smon_reva_regs_t *smon);
171 
172 int MXC_SMON_RevA_isBusy(mxc_smon_reva_regs_t *smon, mxc_smon_reva_busy_t reg, uint32_t delay);
173 
174 #endif // LIBRARIES_PERIPHDRIVERS_SOURCE_SMON_SMON_REVA_H_
175