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 #include <stdio.h>
22 #include <stddef.h>
23 #include <stdint.h>
24 #include "mxc_device.h"
25 #include "mxc_assert.h"
26 #include "mxc_lock.h"
27 #include "mxc_sys.h"
28 #include "mxc_delay.h"
29 #include "spi_reva1.h"
30 #include "dma.h"
31
32 /* **** Functions **** */
33
MXC_SPI_Init(mxc_spi_regs_t * spi,int masterMode,int quadModeUsed,int numSlaves,unsigned ssPolarity,unsigned int hz)34 int MXC_SPI_Init(mxc_spi_regs_t *spi, int masterMode, int quadModeUsed, int numSlaves,
35 unsigned ssPolarity, unsigned int hz)
36 {
37 int spi_num;
38
39 spi_num = MXC_SPI_GET_IDX(spi);
40 MXC_ASSERT(spi_num >= 0);
41
42 if (numSlaves > MXC_SPI_SS_INSTANCES) {
43 return E_BAD_PARAM;
44 }
45
46 // Check if frequency is too high
47 if (hz > PeripheralClock) {
48 return E_BAD_PARAM;
49 }
50
51 #ifndef MSDK_NO_GPIO_CLK_INIT
52 // Configure GPIO for spi
53 if (spi == MXC_SPI0) {
54 #if TARGET_NUM != 32675
55 MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPI0);
56 MXC_SYS_Reset_Periph(MXC_SYS_RESET0_SPI0);
57 MXC_GPIO_Config(&gpio_cfg_spi0);
58 #endif
59 } else if (spi == MXC_SPI1) {
60 MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPI1);
61 MXC_SYS_Reset_Periph(MXC_SYS_RESET0_SPI1);
62 MXC_GPIO_Config(&gpio_cfg_spi1);
63 } else if (spi == MXC_SPI2) {
64 MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPI2);
65 MXC_SYS_Reset_Periph(MXC_SYS_RESET0_SPI2);
66 MXC_GPIO_Config(&gpio_cfg_spi2);
67 } else {
68 return E_NO_DEVICE;
69 }
70 #endif // MSDK_NO_GPIO_CLK_INIT
71
72 return MXC_SPI_RevA1_Init((mxc_spi_reva_regs_t *)spi, masterMode, quadModeUsed, numSlaves,
73 ssPolarity, hz);
74 }
75
MXC_SPI_Shutdown(mxc_spi_regs_t * spi)76 int MXC_SPI_Shutdown(mxc_spi_regs_t *spi)
77 {
78 int spi_num;
79 spi_num = MXC_SPI_GET_IDX(spi);
80 MXC_ASSERT(spi_num >= 0);
81
82 MXC_SPI_RevA1_Shutdown((mxc_spi_reva_regs_t *)spi);
83
84 if (spi == MXC_SPI0) {
85 MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_SPI0);
86 } else if (spi == MXC_SPI1) {
87 MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_SPI1);
88 } else if (spi == MXC_SPI2) {
89 MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_SPI2);
90 } else {
91 return E_INVALID;
92 }
93
94 return E_NO_ERROR;
95 }
96
MXC_SPI_ReadyForSleep(mxc_spi_regs_t * spi)97 int MXC_SPI_ReadyForSleep(mxc_spi_regs_t *spi)
98 {
99 return MXC_SPI_RevA1_ReadyForSleep((mxc_spi_reva_regs_t *)spi);
100 }
101
MXC_SPI_GetPeripheralClock(mxc_spi_regs_t * spi)102 int MXC_SPI_GetPeripheralClock(mxc_spi_regs_t *spi)
103 {
104 if (MXC_SPI_GET_IDX(spi) != -1) {
105 return PeripheralClock;
106 } else {
107 return E_BAD_PARAM;
108 }
109 return E_NO_ERROR;
110 }
111
MXC_SPI_SetFrequency(mxc_spi_regs_t * spi,unsigned int hz)112 int MXC_SPI_SetFrequency(mxc_spi_regs_t *spi, unsigned int hz)
113 {
114 return MXC_SPI_RevA1_SetFrequency((mxc_spi_reva_regs_t *)spi, hz);
115 }
116
MXC_SPI_GetFrequency(mxc_spi_regs_t * spi)117 unsigned int MXC_SPI_GetFrequency(mxc_spi_regs_t *spi)
118 {
119 return MXC_SPI_RevA1_GetFrequency((mxc_spi_reva_regs_t *)spi);
120 }
121
MXC_SPI_SetDataSize(mxc_spi_regs_t * spi,int dataSize)122 int MXC_SPI_SetDataSize(mxc_spi_regs_t *spi, int dataSize)
123 {
124 return MXC_SPI_RevA1_SetDataSize((mxc_spi_reva_regs_t *)spi, dataSize);
125 }
126
MXC_SPI_GetDataSize(mxc_spi_regs_t * spi)127 int MXC_SPI_GetDataSize(mxc_spi_regs_t *spi)
128 {
129 return MXC_SPI_RevA1_GetDataSize((mxc_spi_reva_regs_t *)spi);
130 }
131
MXC_SPI_SetSlave(mxc_spi_regs_t * spi,int ssIdx)132 int MXC_SPI_SetSlave(mxc_spi_regs_t *spi, int ssIdx)
133 {
134 return MXC_SPI_RevA1_SetSlave((mxc_spi_reva_regs_t *)spi, ssIdx);
135 }
136
MXC_SPI_GetSlave(mxc_spi_regs_t * spi)137 int MXC_SPI_GetSlave(mxc_spi_regs_t *spi)
138 {
139 return MXC_SPI_RevA1_GetSlave((mxc_spi_reva_regs_t *)spi);
140 }
141
MXC_SPI_SetWidth(mxc_spi_regs_t * spi,mxc_spi_width_t spiWidth)142 int MXC_SPI_SetWidth(mxc_spi_regs_t *spi, mxc_spi_width_t spiWidth)
143 {
144 return MXC_SPI_RevA1_SetWidth((mxc_spi_reva_regs_t *)spi, (mxc_spi_reva_width_t)spiWidth);
145 }
146
MXC_SPI_GetWidth(mxc_spi_regs_t * spi)147 mxc_spi_width_t MXC_SPI_GetWidth(mxc_spi_regs_t *spi)
148 {
149 return ((mxc_spi_width_t)MXC_SPI_RevA1_GetWidth((mxc_spi_reva_regs_t *)spi));
150 }
151
MXC_SPI_SetMode(mxc_spi_regs_t * spi,mxc_spi_mode_t spiMode)152 int MXC_SPI_SetMode(mxc_spi_regs_t *spi, mxc_spi_mode_t spiMode)
153 {
154 return MXC_SPI_RevA1_SetMode((mxc_spi_reva_regs_t *)spi, (mxc_spi_reva_mode_t)spiMode);
155 }
156
MXC_SPI_GetMode(mxc_spi_regs_t * spi)157 mxc_spi_mode_t MXC_SPI_GetMode(mxc_spi_regs_t *spi)
158 {
159 return ((mxc_spi_mode_t)MXC_SPI_RevA1_GetMode((mxc_spi_reva_regs_t *)spi));
160 }
161
MXC_SPI_StartTransmission(mxc_spi_regs_t * spi)162 int MXC_SPI_StartTransmission(mxc_spi_regs_t *spi)
163 {
164 return MXC_SPI_RevA1_StartTransmission((mxc_spi_reva_regs_t *)spi);
165 }
166
MXC_SPI_GetActive(mxc_spi_regs_t * spi)167 int MXC_SPI_GetActive(mxc_spi_regs_t *spi)
168 {
169 return MXC_SPI_RevA1_GetActive((mxc_spi_reva_regs_t *)spi);
170 }
171
MXC_SPI_AbortTransmission(mxc_spi_regs_t * spi)172 int MXC_SPI_AbortTransmission(mxc_spi_regs_t *spi)
173 {
174 return MXC_SPI_RevA1_AbortTransmission((mxc_spi_reva_regs_t *)spi);
175 }
176
MXC_SPI_ReadRXFIFO(mxc_spi_regs_t * spi,unsigned char * bytes,unsigned int len)177 unsigned int MXC_SPI_ReadRXFIFO(mxc_spi_regs_t *spi, unsigned char *bytes, unsigned int len)
178 {
179 return MXC_SPI_RevA1_ReadRXFIFO((mxc_spi_reva_regs_t *)spi, bytes, len);
180 }
181
MXC_SPI_GetRXFIFOAvailable(mxc_spi_regs_t * spi)182 unsigned int MXC_SPI_GetRXFIFOAvailable(mxc_spi_regs_t *spi)
183 {
184 return MXC_SPI_RevA1_GetRXFIFOAvailable((mxc_spi_reva_regs_t *)spi);
185 }
186
MXC_SPI_WriteTXFIFO(mxc_spi_regs_t * spi,unsigned char * bytes,unsigned int len)187 unsigned int MXC_SPI_WriteTXFIFO(mxc_spi_regs_t *spi, unsigned char *bytes, unsigned int len)
188 {
189 return MXC_SPI_RevA1_WriteTXFIFO((mxc_spi_reva_regs_t *)spi, bytes, len);
190 }
191
MXC_SPI_GetTXFIFOAvailable(mxc_spi_regs_t * spi)192 unsigned int MXC_SPI_GetTXFIFOAvailable(mxc_spi_regs_t *spi)
193 {
194 return MXC_SPI_RevA1_GetTXFIFOAvailable((mxc_spi_reva_regs_t *)spi);
195 }
196
MXC_SPI_ClearRXFIFO(mxc_spi_regs_t * spi)197 void MXC_SPI_ClearRXFIFO(mxc_spi_regs_t *spi)
198 {
199 MXC_SPI_RevA1_ClearRXFIFO((mxc_spi_reva_regs_t *)spi);
200 }
201
MXC_SPI_ClearTXFIFO(mxc_spi_regs_t * spi)202 void MXC_SPI_ClearTXFIFO(mxc_spi_regs_t *spi)
203 {
204 MXC_SPI_RevA1_ClearTXFIFO((mxc_spi_reva_regs_t *)spi);
205 }
206
MXC_SPI_SetRXThreshold(mxc_spi_regs_t * spi,unsigned int numBytes)207 int MXC_SPI_SetRXThreshold(mxc_spi_regs_t *spi, unsigned int numBytes)
208 {
209 return MXC_SPI_RevA1_SetRXThreshold((mxc_spi_reva_regs_t *)spi, numBytes);
210 }
211
MXC_SPI_GetRXThreshold(mxc_spi_regs_t * spi)212 unsigned int MXC_SPI_GetRXThreshold(mxc_spi_regs_t *spi)
213 {
214 return MXC_SPI_RevA1_GetRXThreshold((mxc_spi_reva_regs_t *)spi);
215 }
216
MXC_SPI_SetTXThreshold(mxc_spi_regs_t * spi,unsigned int numBytes)217 int MXC_SPI_SetTXThreshold(mxc_spi_regs_t *spi, unsigned int numBytes)
218 {
219 return MXC_SPI_RevA1_SetTXThreshold((mxc_spi_reva_regs_t *)spi, numBytes);
220 }
221
MXC_SPI_GetTXThreshold(mxc_spi_regs_t * spi)222 unsigned int MXC_SPI_GetTXThreshold(mxc_spi_regs_t *spi)
223 {
224 return MXC_SPI_RevA1_GetTXThreshold((mxc_spi_reva_regs_t *)spi);
225 }
226
MXC_SPI_GetFlags(mxc_spi_regs_t * spi)227 unsigned int MXC_SPI_GetFlags(mxc_spi_regs_t *spi)
228 {
229 return MXC_SPI_RevA1_GetFlags((mxc_spi_reva_regs_t *)spi);
230 }
231
MXC_SPI_ClearFlags(mxc_spi_regs_t * spi)232 void MXC_SPI_ClearFlags(mxc_spi_regs_t *spi)
233 {
234 MXC_SPI_RevA1_ClearFlags((mxc_spi_reva_regs_t *)spi);
235 }
236
MXC_SPI_EnableInt(mxc_spi_regs_t * spi,unsigned int mask)237 void MXC_SPI_EnableInt(mxc_spi_regs_t *spi, unsigned int mask)
238 {
239 MXC_SPI_RevA1_EnableInt((mxc_spi_reva_regs_t *)spi, mask);
240 }
241
MXC_SPI_DisableInt(mxc_spi_regs_t * spi,unsigned int mask)242 void MXC_SPI_DisableInt(mxc_spi_regs_t *spi, unsigned int mask)
243 {
244 MXC_SPI_RevA1_DisableInt((mxc_spi_reva_regs_t *)spi, mask);
245 }
246
MXC_SPI_MasterTransaction(mxc_spi_req_t * req)247 int MXC_SPI_MasterTransaction(mxc_spi_req_t *req)
248 {
249 return MXC_SPI_RevA1_MasterTransaction((mxc_spi_reva_req_t *)req);
250 }
251
MXC_SPI_MasterTransactionAsync(mxc_spi_req_t * req)252 int MXC_SPI_MasterTransactionAsync(mxc_spi_req_t *req)
253 {
254 return MXC_SPI_RevA1_MasterTransactionAsync((mxc_spi_reva_req_t *)req);
255 }
256
MXC_SPI_MasterTransactionDMA(mxc_spi_req_t * req)257 int MXC_SPI_MasterTransactionDMA(mxc_spi_req_t *req)
258 {
259 int reqselTx = -1;
260 int reqselRx = -1;
261
262 int spi_num;
263
264 spi_num = MXC_SPI_GET_IDX(req->spi);
265 MXC_ASSERT(spi_num >= 0);
266
267 if (req->txData != NULL) {
268 switch (spi_num) {
269 case 0:
270 reqselTx = MXC_DMA_REQUEST_SPI0TX;
271 break;
272
273 case 1:
274 reqselTx = MXC_DMA_REQUEST_SPI1TX;
275 break;
276
277 case 2:
278 reqselTx = MXC_DMA_REQUEST_SPI2TX;
279 break;
280
281 default:
282 return E_BAD_PARAM;
283 }
284 }
285
286 if (req->rxData != NULL) {
287 switch (spi_num) {
288 case 0:
289 reqselRx = MXC_DMA_REQUEST_SPI0RX;
290 break;
291
292 case 1:
293 reqselRx = MXC_DMA_REQUEST_SPI1RX;
294 break;
295
296 case 2:
297 reqselRx = MXC_DMA_REQUEST_SPI2RX;
298 break;
299
300 default:
301 return E_BAD_PARAM;
302 }
303 }
304
305 return MXC_SPI_RevA1_MasterTransactionDMA((mxc_spi_reva_req_t *)req, reqselTx, reqselRx,
306 MXC_DMA);
307 }
308
MXC_SPI_SlaveTransaction(mxc_spi_req_t * req)309 int MXC_SPI_SlaveTransaction(mxc_spi_req_t *req)
310 {
311 return MXC_SPI_RevA1_SlaveTransaction((mxc_spi_reva_req_t *)req);
312 }
313
MXC_SPI_SlaveTransactionAsync(mxc_spi_req_t * req)314 int MXC_SPI_SlaveTransactionAsync(mxc_spi_req_t *req)
315 {
316 return MXC_SPI_RevA1_SlaveTransactionAsync((mxc_spi_reva_req_t *)req);
317 }
318
MXC_SPI_SlaveTransactionDMA(mxc_spi_req_t * req)319 int MXC_SPI_SlaveTransactionDMA(mxc_spi_req_t *req)
320 {
321 int reqselTx = -1;
322 int reqselRx = -1;
323
324 int spi_num;
325
326 spi_num = MXC_SPI_GET_IDX(req->spi);
327 MXC_ASSERT(spi_num >= 0);
328
329 if (req->txData != NULL) {
330 switch (spi_num) {
331 case 0:
332 reqselTx = MXC_DMA_REQUEST_SPI0TX;
333 break;
334
335 case 1:
336 reqselTx = MXC_DMA_REQUEST_SPI1TX;
337 break;
338
339 case 2:
340 reqselTx = MXC_DMA_REQUEST_SPI2TX;
341 break;
342
343 default:
344 return E_BAD_PARAM;
345 }
346 }
347
348 if (req->rxData != NULL) {
349 switch (spi_num) {
350 case 0:
351 reqselRx = MXC_DMA_REQUEST_SPI0RX;
352 break;
353
354 case 1:
355 reqselRx = MXC_DMA_REQUEST_SPI1RX;
356 break;
357
358 case 2:
359 reqselRx = MXC_DMA_REQUEST_SPI2RX;
360 break;
361
362 default:
363 return E_BAD_PARAM;
364 }
365 }
366 return MXC_SPI_RevA1_SlaveTransactionDMA((mxc_spi_reva_req_t *)req, reqselTx, reqselRx,
367 MXC_DMA);
368 }
369
MXC_SPI_SetDefaultTXData(mxc_spi_regs_t * spi,unsigned int defaultTXData)370 int MXC_SPI_SetDefaultTXData(mxc_spi_regs_t *spi, unsigned int defaultTXData)
371 {
372 return MXC_SPI_RevA1_SetDefaultTXData((mxc_spi_reva_regs_t *)spi, defaultTXData);
373 }
374
MXC_SPI_AbortAsync(mxc_spi_regs_t * spi)375 void MXC_SPI_AbortAsync(mxc_spi_regs_t *spi)
376 {
377 MXC_SPI_RevA1_AbortAsync((mxc_spi_reva_regs_t *)spi);
378 }
379
MXC_SPI_AsyncHandler(mxc_spi_regs_t * spi)380 void MXC_SPI_AsyncHandler(mxc_spi_regs_t *spi)
381 {
382 MXC_SPI_RevA1_AsyncHandler((mxc_spi_reva_regs_t *)spi);
383 }
384
MXC_SPI_HWSSControl(mxc_spi_regs_t * spi,int state)385 void MXC_SPI_HWSSControl(mxc_spi_regs_t *spi, int state)
386 {
387 MXC_SPI_RevA1_HWSSControl((mxc_spi_reva_regs_t *)spi, state);
388 }
389