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