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 /* **** Includes **** */
22 #include <stdint.h>
23 #include <stdio.h>
24 #include "mxc_errors.h"
25 #include "mxc_sys.h"
26 #include "adc_regs.h"
27 #include "adc.h"
28 #include "adc_reva.h"
29 
30 /* **** Functions **** */
31 // ********************************************************************************
MXC_ADC_Init(void)32 int MXC_ADC_Init(void)
33 {
34 #ifndef MSDK_NO_GPIO_CLK_INIT
35     MXC_SYS_Reset_Periph(MXC_SYS_RESET_ADC);
36     MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_ADC);
37 #endif
38 
39     return MXC_ADC_RevA_Init((mxc_adc_reva_regs_t *)MXC_ADC);
40 }
41 
42 // **************************************************************************
MXC_ADC_Shutdown(void)43 int MXC_ADC_Shutdown(void)
44 {
45     MXC_ADC_RevA_Shutdown((mxc_adc_reva_regs_t *)MXC_ADC);
46 
47     MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_ADC);
48 
49     return E_NO_ERROR;
50 }
51 
52 // **************************************************************************
MXC_ADC_Busy(void)53 int MXC_ADC_Busy(void)
54 {
55     return MXC_ADC_RevA_Busy((mxc_adc_reva_regs_t *)MXC_ADC);
56 }
57 
58 // **************************************************************************
MXC_ADC_EnableInt(uint32_t flags)59 void MXC_ADC_EnableInt(uint32_t flags)
60 {
61     MXC_ADC_RevA_EnableInt((mxc_adc_reva_regs_t *)MXC_ADC, flags);
62 }
63 
64 // **************************************************************************
MXC_ADC_DisableInt(uint32_t flags)65 void MXC_ADC_DisableInt(uint32_t flags)
66 {
67     MXC_ADC_RevA_DisableInt((mxc_adc_reva_regs_t *)MXC_ADC, flags);
68 }
69 
70 // **************************************************************************
MXC_ADC_GetFlags(void)71 uint32_t MXC_ADC_GetFlags(void)
72 {
73     return MXC_ADC_RevA_GetFlags((mxc_adc_reva_regs_t *)MXC_ADC);
74 }
75 
76 // **************************************************************************
MXC_ADC_ClearFlags(uint32_t flags)77 void MXC_ADC_ClearFlags(uint32_t flags)
78 {
79     MXC_ADC_RevA_ClearFlags((mxc_adc_reva_regs_t *)MXC_ADC, flags);
80 }
81 
82 // **************************************************************************
MXC_ADC_SetConversionSpeed(uint32_t hz)83 int MXC_ADC_SetConversionSpeed(uint32_t hz)
84 {
85     //check for overflow
86     MXC_ASSERT(hz < ((uint32_t)((1U << 31) - 1) / 1024));
87     uint32_t adc_clock_freq = 1024 * hz;
88 
89     if (adc_clock_freq > MXC_ADC_MAX_CLOCK) {
90         return E_BAD_PARAM;
91     }
92 
93     uint8_t divider = PeripheralClock / adc_clock_freq;
94 
95     if (divider > 0xf || divider < 2) {
96         return E_BAD_PARAM;
97     }
98 
99     //disable clock
100     MXC_ADC->ctrl &= ~MXC_F_ADC_CTRL_CLK_EN;
101     //clear clock divisor
102     MXC_GCR->pclk_div &= ~MXC_F_GCR_PCLK_DIV_ADCFRQ;
103     //load in new clock divisor
104     MXC_GCR->pclk_div |= (divider << MXC_F_GCR_PCLK_DIV_ADCFRQ_POS);
105 
106     //enable clock
107     MXC_ADC_RevA_SetConversionSpeed((mxc_adc_reva_regs_t *)MXC_ADC, hz);
108 
109     return MXC_ADC_GetConversionSpeed();
110 }
111 
112 // **************************************************************************
MXC_ADC_GetConversionSpeed(void)113 int MXC_ADC_GetConversionSpeed(void)
114 {
115     uint8_t divider;
116     divider = (MXC_GCR->pclk_div & MXC_F_GCR_PCLK_DIV_ADCFRQ) >> MXC_F_GCR_PCLK_DIV_ADCFRQ_POS;
117 
118     return MXC_ADC_RevA_GetConversionSpeed(divider);
119 }
120 
121 // **************************************************************************
MXC_ADC_SetDataAlignment(int msbJustify)122 void MXC_ADC_SetDataAlignment(int msbJustify)
123 {
124     MXC_ADC_RevA_SetDataAlignment((mxc_adc_reva_regs_t *)MXC_ADC, msbJustify);
125 }
126 
127 // **************************************************************************
MXC_ADC_SetExtScale(mxc_adc_scale_t scale)128 void MXC_ADC_SetExtScale(mxc_adc_scale_t scale)
129 {
130     MXC_ADC_RevA_SetExtScale((mxc_adc_reva_regs_t *)MXC_ADC, scale);
131 }
132 
133 // **************************************************************************
MXC_ADC_EnableMonitor(mxc_adc_monitor_t monitor)134 void MXC_ADC_EnableMonitor(mxc_adc_monitor_t monitor)
135 {
136     MXC_ADC_RevA_EnableMonitor((mxc_adc_reva_regs_t *)MXC_ADC, monitor);
137 }
138 
139 // **************************************************************************
MXC_ADC_DisableMonitor(mxc_adc_monitor_t monitor)140 void MXC_ADC_DisableMonitor(mxc_adc_monitor_t monitor)
141 {
142     MXC_ADC_RevA_DisableMonitor((mxc_adc_reva_regs_t *)MXC_ADC, monitor);
143 }
144 
145 // **************************************************************************
MXC_ADC_SetMonitorHighThreshold(mxc_adc_monitor_t monitor,uint32_t threshold)146 void MXC_ADC_SetMonitorHighThreshold(mxc_adc_monitor_t monitor, uint32_t threshold)
147 {
148     MXC_ADC_RevA_SetMonitorHighThreshold((mxc_adc_reva_regs_t *)MXC_ADC, monitor, threshold);
149 }
150 
151 // **************************************************************************
MXC_ADC_GetMonitorHighThreshold(mxc_adc_monitor_t monitor)152 int MXC_ADC_GetMonitorHighThreshold(mxc_adc_monitor_t monitor)
153 {
154     return MXC_ADC_RevA_GetMonitorHighThreshold((mxc_adc_reva_regs_t *)MXC_ADC, monitor);
155 }
156 
157 // **************************************************************************
MXC_ADC_SetMonitorLowThreshold(mxc_adc_monitor_t monitor,uint32_t threshold)158 void MXC_ADC_SetMonitorLowThreshold(mxc_adc_monitor_t monitor, uint32_t threshold)
159 {
160     MXC_ADC_RevA_SetMonitorLowThreshold((mxc_adc_reva_regs_t *)MXC_ADC, monitor, threshold);
161 }
162 
163 // **************************************************************************
MXC_ADC_GetMonitorLowThreshold(mxc_adc_monitor_t monitor)164 int MXC_ADC_GetMonitorLowThreshold(mxc_adc_monitor_t monitor)
165 {
166     return MXC_ADC_RevA_GetMonitorLowThreshold((mxc_adc_reva_regs_t *)MXC_ADC, monitor);
167 }
168 
169 // **************************************************************************
MXC_ADC_SetMonitorChannel(mxc_adc_monitor_t monitor,mxc_adc_chsel_t channel)170 void MXC_ADC_SetMonitorChannel(mxc_adc_monitor_t monitor, mxc_adc_chsel_t channel)
171 {
172     MXC_ADC_RevA_SetMonitorChannel((mxc_adc_reva_regs_t *)MXC_ADC, monitor, channel);
173 }
174 
175 // **************************************************************************
MXC_ADC_GetMonitorChannel(mxc_adc_monitor_t monitor)176 int MXC_ADC_GetMonitorChannel(mxc_adc_monitor_t monitor)
177 {
178     return MXC_ADC_RevA_GetMonitorChannel((mxc_adc_reva_regs_t *)MXC_ADC, monitor);
179 }
180 
181 // **************************************************************************
MXC_ADC_EnableMonitorAsync(mxc_adc_monitor_t monitor,mxc_adc_monitor_cb_t callback)182 void MXC_ADC_EnableMonitorAsync(mxc_adc_monitor_t monitor, mxc_adc_monitor_cb_t callback)
183 {
184     MXC_ADC_RevA_EnableMonitorAsync(monitor, callback);
185 }
186 
187 // **************************************************************************
MXC_ADC_DisableMonitorAsync(mxc_adc_monitor_t monitor)188 void MXC_ADC_DisableMonitorAsync(mxc_adc_monitor_t monitor)
189 {
190     MXC_ADC_RevA_DisableMonitorAsync(monitor);
191 }
192 
193 // **************************************************************************
MXC_ADC_StartConversion(mxc_adc_chsel_t channel)194 int MXC_ADC_StartConversion(mxc_adc_chsel_t channel)
195 {
196     return MXC_ADC_RevA_StartConversion((mxc_adc_reva_regs_t *)MXC_ADC, channel);
197 }
198 
199 // **************************************************************************
MXC_ADC_StartConversionAsync(mxc_adc_chsel_t channel,mxc_adc_complete_cb_t callback)200 int MXC_ADC_StartConversionAsync(mxc_adc_chsel_t channel, mxc_adc_complete_cb_t callback)
201 {
202     return MXC_ADC_RevA_StartConversionAsync((mxc_adc_reva_regs_t *)MXC_ADC, channel, callback);
203 }
204 
205 // **************************************************************************
MXC_ADC_StartConversionDMA(mxc_adc_chsel_t channel,uint16_t * data,void (* callback)(int,int))206 int MXC_ADC_StartConversionDMA(mxc_adc_chsel_t channel, uint16_t *data, void (*callback)(int, int))
207 {
208     return MXC_ADC_RevA_StartConversionDMA((mxc_adc_reva_regs_t *)MXC_ADC, channel, MXC_DMA, data,
209                                            callback);
210 }
211 
212 // **************************************************************************
MXC_ADC_Handler(void)213 int MXC_ADC_Handler(void)
214 {
215     return MXC_ADC_RevA_Handler((mxc_adc_reva_regs_t *)MXC_ADC);
216 }
217 
218 // **************************************************************************
MXC_ADC_Convert(mxc_adc_conversion_req_t * req)219 int MXC_ADC_Convert(mxc_adc_conversion_req_t *req)
220 {
221     return MXC_ADC_RevA_Convert((mxc_adc_reva_regs_t *)MXC_ADC, req);
222 }
223 
224 // **************************************************************************
MXC_ADC_ConvertAsync(mxc_adc_conversion_req_t * req)225 int MXC_ADC_ConvertAsync(mxc_adc_conversion_req_t *req)
226 {
227     return MXC_ADC_RevA_ConvertAsync((mxc_adc_reva_regs_t *)MXC_ADC, req);
228 }
229 
230 // **************************************************************************
MXC_ADC_Monitor(mxc_adc_monitor_req_t req)231 void MXC_ADC_Monitor(mxc_adc_monitor_req_t req)
232 {
233     MXC_ADC_RevA_Monitor((mxc_adc_reva_regs_t *)MXC_ADC, req);
234 }
235 
236 // **************************************************************************
MXC_ADC_MonitorAsync(mxc_adc_monitor_req_t req)237 void MXC_ADC_MonitorAsync(mxc_adc_monitor_req_t req)
238 {
239     MXC_ADC_RevA_MonitorAsync((mxc_adc_reva_regs_t *)MXC_ADC, req);
240 }
241 
242 // **************************************************************************
MXC_ADC_GetData(uint16_t * outdata)243 int MXC_ADC_GetData(uint16_t *outdata)
244 {
245     return MXC_ADC_RevA_GetData((mxc_adc_reva_regs_t *)MXC_ADC, outdata);
246 }
247