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