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