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