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