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