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 "uart.h"
22 #include "mxc_device.h"
23 #include "mxc_pins.h"
24 #include "mxc_assert.h"
25 #include "uart_reva.h"
26 #include "uart_common.h"
27 #include "dma.h"
28 
MXC_UART_DMACallback(int ch,int error)29 void MXC_UART_DMACallback(int ch, int error)
30 {
31     MXC_UART_RevA_DMACallback(ch, error);
32 }
33 
MXC_UART_AsyncCallback(mxc_uart_regs_t * uart,int retVal)34 int MXC_UART_AsyncCallback(mxc_uart_regs_t *uart, int retVal)
35 {
36     return MXC_UART_RevA_AsyncCallback((mxc_uart_reva_regs_t *)uart, retVal);
37 }
38 
MXC_UART_TxAsyncCallback(mxc_uart_regs_t * uart,int retVal)39 int MXC_UART_TxAsyncCallback(mxc_uart_regs_t *uart, int retVal)
40 {
41     return MXC_UART_RevA_TxAsyncCallback((mxc_uart_reva_regs_t *)uart, retVal);
42 }
43 
MXC_UART_RxAsyncCallback(mxc_uart_regs_t * uart,int retVal)44 int MXC_UART_RxAsyncCallback(mxc_uart_regs_t *uart, int retVal)
45 {
46     return MXC_UART_RevA_RxAsyncCallback((mxc_uart_reva_regs_t *)uart, retVal);
47 }
48 
MXC_UART_AsyncStop(mxc_uart_regs_t * uart)49 int MXC_UART_AsyncStop(mxc_uart_regs_t *uart)
50 {
51     return MXC_UART_RevA_AsyncStop((mxc_uart_reva_regs_t *)uart);
52 }
53 
MXC_UART_TxAsyncStop(mxc_uart_regs_t * uart)54 int MXC_UART_TxAsyncStop(mxc_uart_regs_t *uart)
55 {
56     return MXC_UART_RevA_TxAsyncStop((mxc_uart_reva_regs_t *)uart);
57 }
58 
MXC_UART_RxAsyncStop(mxc_uart_regs_t * uart)59 int MXC_UART_RxAsyncStop(mxc_uart_regs_t *uart)
60 {
61     return MXC_UART_RevA_RxAsyncStop((mxc_uart_reva_regs_t *)uart);
62 }
63 
MXC_UART_Init(mxc_uart_regs_t * uart,unsigned int baud)64 int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud)
65 {
66     int retval;
67 
68     retval = MXC_UART_Shutdown(uart);
69 
70     if (retval) {
71         return retval;
72     }
73 
74     switch (MXC_UART_GET_IDX(uart)) {
75     case 0:
76         MXC_GPIO_Config(&gpio_cfg_uart0);
77         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART0);
78         break;
79 
80     case 1:
81         MXC_GPIO_Config(&gpio_cfg_uart1);
82         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART1);
83         break;
84 
85     case 2:
86         MXC_GPIO_Config(&gpio_cfg_uart2);
87         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART2);
88         break;
89 
90     case 3:
91         MXC_GPIO_Config(&gpio_cfg_uart3);
92         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART3);
93         break;
94 
95     case 4:
96         MXC_GPIO_Config(&gpio_cfg_uart4);
97         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART4);
98         break;
99 
100     case 5:
101         MXC_GPIO_Config(&gpio_cfg_uart5);
102         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART5);
103         break;
104 
105     default:
106         return E_BAD_PARAM;
107         break;
108     }
109 
110     return MXC_UART_RevA_Init((mxc_uart_reva_regs_t *)uart, baud);
111 }
112 
MXC_UART_Shutdown(mxc_uart_regs_t * uart)113 int MXC_UART_Shutdown(mxc_uart_regs_t *uart)
114 {
115     switch (MXC_UART_GET_IDX(uart)) {
116     case 0:
117         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART0);
118         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART0);
119         break;
120 
121     case 1:
122         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART1);
123         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART1);
124         break;
125 
126     case 2:
127         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART2);
128         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART2);
129         break;
130 
131     case 3:
132         MXC_SYS_Reset_Periph(MXC_SYS_RESET1_UART3);
133         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART3);
134         break;
135 
136     case 4:
137         MXC_SYS_Reset_Periph(MXC_SYS_RESET1_UART4);
138         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART4);
139         break;
140 
141     case 5:
142         MXC_SYS_Reset_Periph(MXC_SYS_RESET1_UART5);
143         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART5);
144         break;
145 
146     default:
147         return E_BAD_PARAM;
148         break;
149     }
150 
151     return E_NO_ERROR;
152 }
153 
MXC_UART_ReadyForSleep(mxc_uart_regs_t * uart)154 int MXC_UART_ReadyForSleep(mxc_uart_regs_t *uart)
155 {
156     return MXC_UART_RevA_ReadyForSleep((mxc_uart_reva_regs_t *)uart);
157 }
158 
MXC_UART_SetFrequency(mxc_uart_regs_t * uart,unsigned int baud)159 int MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud)
160 {
161     return MXC_UART_RevA_SetFrequency((mxc_uart_reva_regs_t *)uart, baud);
162 }
163 
MXC_UART_GetFrequency(mxc_uart_regs_t * uart)164 int MXC_UART_GetFrequency(mxc_uart_regs_t *uart)
165 {
166     return MXC_UART_RevA_GetFrequency((mxc_uart_reva_regs_t *)uart);
167 }
168 
MXC_UART_SetDataSize(mxc_uart_regs_t * uart,int dataSize)169 int MXC_UART_SetDataSize(mxc_uart_regs_t *uart, int dataSize)
170 {
171     return MXC_UART_RevA_SetDataSize((mxc_uart_reva_regs_t *)uart, dataSize);
172 }
173 
MXC_UART_SetStopBits(mxc_uart_regs_t * uart,mxc_uart_stop_t stopBits)174 int MXC_UART_SetStopBits(mxc_uart_regs_t *uart, mxc_uart_stop_t stopBits)
175 {
176     return MXC_UART_RevA_SetStopBits((mxc_uart_reva_regs_t *)uart, stopBits);
177 }
178 
MXC_UART_SetParity(mxc_uart_regs_t * uart,mxc_uart_parity_t parity)179 int MXC_UART_SetParity(mxc_uart_regs_t *uart, mxc_uart_parity_t parity)
180 {
181     return MXC_UART_RevA_SetParity((mxc_uart_reva_regs_t *)uart, parity);
182 }
183 
MXC_UART_SetFlowCtrl(mxc_uart_regs_t * uart,mxc_uart_flow_t flowCtrl,int rtsThreshold)184 int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rtsThreshold)
185 {
186     switch (MXC_UART_GET_IDX(uart)) {
187     case 0:
188         MXC_GPIO_Config(&gpio_cfg_uart0_flow);
189         break;
190 
191     case 1:
192         MXC_GPIO_Config(&gpio_cfg_uart1_flow);
193         break;
194 
195     case 2:
196         MXC_GPIO_Config(&gpio_cfg_uart2_flow);
197         break;
198 
199     case 3:
200         MXC_GPIO_Config(&gpio_cfg_uart3_flow);
201         break;
202 
203     case 4:
204         MXC_GPIO_Config(&gpio_cfg_uart4_flow);
205         break;
206 
207     case 5:
208         MXC_GPIO_Config(&gpio_cfg_uart5_flow);
209         break;
210     }
211 
212     return MXC_UART_RevA_SetFlowCtrl((mxc_uart_reva_regs_t *)uart, flowCtrl, rtsThreshold);
213 }
214 
MXC_UART_SetClockSource(mxc_uart_regs_t * uart,int usePCLK)215 int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, int usePCLK)
216 {
217     return MXC_UART_RevA_SetClockSource((mxc_uart_reva_regs_t *)uart, usePCLK);
218 }
219 
MXC_UART_SetNullModem(mxc_uart_regs_t * uart,int nullModem)220 int MXC_UART_SetNullModem(mxc_uart_regs_t *uart, int nullModem)
221 {
222     return MXC_UART_RevA_SetNullModem((mxc_uart_reva_regs_t *)uart, nullModem);
223 }
224 
MXC_UART_SendBreak(mxc_uart_regs_t * uart)225 int MXC_UART_SendBreak(mxc_uart_regs_t *uart)
226 {
227     return MXC_UART_RevA_SendBreak((mxc_uart_reva_regs_t *)uart);
228 }
229 
MXC_UART_GetActive(mxc_uart_regs_t * uart)230 int MXC_UART_GetActive(mxc_uart_regs_t *uart)
231 {
232     return MXC_UART_RevA_GetActive((mxc_uart_reva_regs_t *)uart);
233 }
234 
MXC_UART_AbortTransmission(mxc_uart_regs_t * uart)235 int MXC_UART_AbortTransmission(mxc_uart_regs_t *uart)
236 {
237     return MXC_UART_RevA_AbortTransmission((mxc_uart_reva_regs_t *)uart);
238 }
239 
MXC_UART_ReadCharacterRaw(mxc_uart_regs_t * uart)240 int MXC_UART_ReadCharacterRaw(mxc_uart_regs_t *uart)
241 {
242     return MXC_UART_RevA_ReadCharacterRaw((mxc_uart_reva_regs_t *)uart);
243 }
244 
MXC_UART_WriteCharacterRaw(mxc_uart_regs_t * uart,uint8_t character)245 int MXC_UART_WriteCharacterRaw(mxc_uart_regs_t *uart, uint8_t character)
246 {
247     return MXC_UART_RevA_WriteCharacterRaw((mxc_uart_reva_regs_t *)uart, character);
248 }
249 
MXC_UART_ReadCharacter(mxc_uart_regs_t * uart)250 int MXC_UART_ReadCharacter(mxc_uart_regs_t *uart)
251 {
252     return MXC_UART_Common_ReadCharacter(uart);
253 }
254 
MXC_UART_WriteCharacter(mxc_uart_regs_t * uart,uint8_t character)255 int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character)
256 {
257     return MXC_UART_Common_WriteCharacter(uart, character);
258 }
259 
MXC_UART_Read(mxc_uart_regs_t * uart,uint8_t * buffer,int * len)260 int MXC_UART_Read(mxc_uart_regs_t *uart, uint8_t *buffer, int *len)
261 {
262     return MXC_UART_RevA_Read((mxc_uart_reva_regs_t *)uart, buffer, len);
263 }
264 
MXC_UART_Write(mxc_uart_regs_t * uart,uint8_t * byte,int * len)265 int MXC_UART_Write(mxc_uart_regs_t *uart, uint8_t *byte, int *len)
266 {
267     return MXC_UART_RevA_Write((mxc_uart_reva_regs_t *)uart, byte, len);
268 }
269 
MXC_UART_ReadRXFIFO(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len)270 unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len)
271 {
272     return MXC_UART_RevA_ReadRXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len);
273 }
274 
MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)275 int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len,
276                            mxc_uart_dma_complete_cb_t callback)
277 {
278     mxc_dma_config_t config;
279 
280     int uart_num = MXC_UART_GET_IDX(uart);
281 
282     // Only UART 0, 1 and 2 are supported for DMA transaction
283     switch (uart_num) {
284     case 0:
285         config.reqsel = MXC_DMA_REQUEST_UART0RX;
286         break;
287 
288     case 1:
289         config.reqsel = MXC_DMA_REQUEST_UART1RX;
290         break;
291 
292     case 2:
293         config.reqsel = MXC_DMA_REQUEST_UART2RX;
294         break;
295 
296     default:
297         return E_BAD_PARAM;
298         break;
299     }
300 
301     return MXC_UART_RevA_ReadRXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback,
302                                        config);
303 }
304 
MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t * uart)305 unsigned int MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t *uart)
306 {
307     return MXC_UART_RevA_GetRXFIFOAvailable((mxc_uart_reva_regs_t *)uart);
308 }
309 
MXC_UART_WriteTXFIFO(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len)310 unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len)
311 {
312     return MXC_UART_RevA_WriteTXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len);
313 }
314 
MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)315 int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len,
316                             mxc_uart_dma_complete_cb_t callback)
317 {
318     mxc_dma_config_t config;
319 
320     int uart_num = MXC_UART_GET_IDX(uart);
321 
322     // Only UART 0, 1 and 2 are supported for DMA transaction
323     switch (uart_num) {
324     case 0:
325         config.reqsel = MXC_DMA_REQUEST_UART0TX;
326         break;
327 
328     case 1:
329         config.reqsel = MXC_DMA_REQUEST_UART1TX;
330         break;
331 
332     case 2:
333         config.reqsel = MXC_DMA_REQUEST_UART2TX;
334         break;
335 
336     default:
337         return E_BAD_PARAM;
338         break;
339     }
340 
341     return MXC_UART_RevA_WriteTXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback,
342                                         config);
343 }
344 
MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t * uart)345 unsigned int MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t *uart)
346 {
347     return MXC_UART_RevA_GetTXFIFOAvailable((mxc_uart_reva_regs_t *)uart);
348 }
349 
MXC_UART_ClearRXFIFO(mxc_uart_regs_t * uart)350 int MXC_UART_ClearRXFIFO(mxc_uart_regs_t *uart)
351 {
352     return MXC_UART_RevA_ClearRXFIFO((mxc_uart_reva_regs_t *)uart);
353 }
354 
MXC_UART_ClearTXFIFO(mxc_uart_regs_t * uart)355 int MXC_UART_ClearTXFIFO(mxc_uart_regs_t *uart)
356 {
357     return MXC_UART_RevA_ClearTXFIFO((mxc_uart_reva_regs_t *)uart);
358 }
359 
MXC_UART_SetRXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)360 int MXC_UART_SetRXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
361 {
362     return MXC_UART_RevA_SetRXThreshold((mxc_uart_reva_regs_t *)uart, numBytes);
363 }
364 
MXC_UART_GetRXThreshold(mxc_uart_regs_t * uart)365 unsigned int MXC_UART_GetRXThreshold(mxc_uart_regs_t *uart)
366 {
367     return MXC_UART_RevA_GetRXThreshold((mxc_uart_reva_regs_t *)uart);
368 }
369 
MXC_UART_SetTXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)370 int MXC_UART_SetTXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
371 {
372     return MXC_UART_RevA_SetTXThreshold((mxc_uart_reva_regs_t *)uart, numBytes);
373 }
374 
MXC_UART_GetTXThreshold(mxc_uart_regs_t * uart)375 unsigned int MXC_UART_GetTXThreshold(mxc_uart_regs_t *uart)
376 {
377     return MXC_UART_RevA_GetTXThreshold((mxc_uart_reva_regs_t *)uart);
378 }
379 
MXC_UART_GetFlags(mxc_uart_regs_t * uart)380 unsigned int MXC_UART_GetFlags(mxc_uart_regs_t *uart)
381 {
382     return MXC_UART_RevA_GetFlags((mxc_uart_reva_regs_t *)uart);
383 }
384 
MXC_UART_ClearFlags(mxc_uart_regs_t * uart,unsigned int flags)385 int MXC_UART_ClearFlags(mxc_uart_regs_t *uart, unsigned int flags)
386 {
387     return MXC_UART_RevA_ClearFlags((mxc_uart_reva_regs_t *)uart, flags);
388 }
389 
MXC_UART_EnableInt(mxc_uart_regs_t * uart,unsigned int mask)390 int MXC_UART_EnableInt(mxc_uart_regs_t *uart, unsigned int mask)
391 {
392     return MXC_UART_RevA_EnableInt((mxc_uart_reva_regs_t *)uart, mask);
393 }
394 
MXC_UART_DisableInt(mxc_uart_regs_t * uart,unsigned int mask)395 int MXC_UART_DisableInt(mxc_uart_regs_t *uart, unsigned int mask)
396 {
397     return MXC_UART_RevA_DisableInt((mxc_uart_reva_regs_t *)uart, mask);
398 }
399 
MXC_UART_GetStatus(mxc_uart_regs_t * uart)400 unsigned int MXC_UART_GetStatus(mxc_uart_regs_t *uart)
401 {
402     return MXC_UART_RevA_GetStatus((mxc_uart_reva_regs_t *)uart);
403 }
404 
MXC_UART_Transaction(mxc_uart_req_t * req)405 int MXC_UART_Transaction(mxc_uart_req_t *req)
406 {
407     return MXC_UART_RevA_Transaction((mxc_uart_reva_req_t *)req);
408 }
409 
MXC_UART_TransactionAsync(mxc_uart_req_t * req)410 int MXC_UART_TransactionAsync(mxc_uart_req_t *req)
411 {
412     return MXC_UART_RevA_TransactionAsync((mxc_uart_reva_req_t *)req);
413 }
414 
MXC_UART_TransactionDMA(mxc_uart_req_t * req)415 int MXC_UART_TransactionDMA(mxc_uart_req_t *req)
416 {
417     return MXC_UART_RevA_TransactionDMA((mxc_uart_reva_req_t *)req, MXC_DMA);
418 }
419 
MXC_UART_AbortAsync(mxc_uart_regs_t * uart)420 int MXC_UART_AbortAsync(mxc_uart_regs_t *uart)
421 {
422     return MXC_UART_RevA_AbortAsync((mxc_uart_reva_regs_t *)uart);
423 }
424 
MXC_UART_TxAbortAsync(mxc_uart_regs_t * uart)425 int MXC_UART_TxAbortAsync(mxc_uart_regs_t *uart)
426 {
427     return MXC_UART_RevA_TxAbortAsync((mxc_uart_reva_regs_t *)uart);
428 }
429 
MXC_UART_RxAbortAsync(mxc_uart_regs_t * uart)430 int MXC_UART_RxAbortAsync(mxc_uart_regs_t *uart)
431 {
432     return MXC_UART_RevA_RxAbortAsync((mxc_uart_reva_regs_t *)uart);
433 }
434 
MXC_UART_AsyncHandler(mxc_uart_regs_t * uart)435 int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart)
436 {
437     return MXC_UART_RevA_AsyncHandler((mxc_uart_reva_regs_t *)uart);
438 }
439 
MXC_UART_GetAsyncTXCount(mxc_uart_req_t * req)440 uint32_t MXC_UART_GetAsyncTXCount(mxc_uart_req_t *req)
441 {
442     return req->txCnt;
443 }
444 
MXC_UART_GetAsyncRXCount(mxc_uart_req_t * req)445 uint32_t MXC_UART_GetAsyncRXCount(mxc_uart_req_t *req)
446 {
447     return req->rxCnt;
448 }
449 
MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t * uart,bool enable)450 int MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t *uart, bool enable)
451 {
452     return MXC_UART_RevA_SetAutoDMAHandlers((mxc_uart_reva_regs_t *)uart, enable);
453 }
MXC_UART_SetTXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)454 int MXC_UART_SetTXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
455 {
456     return MXC_UART_RevA_SetTXDMAChannel((mxc_uart_reva_regs_t *)uart, channel);
457 }
MXC_UART_GetTXDMAChannel(mxc_uart_regs_t * uart)458 int MXC_UART_GetTXDMAChannel(mxc_uart_regs_t *uart)
459 {
460     return MXC_UART_RevA_GetTXDMAChannel((mxc_uart_reva_regs_t *)uart);
461 }
MXC_UART_SetRXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)462 int MXC_UART_SetRXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
463 {
464     return MXC_UART_RevA_SetRXDMAChannel((mxc_uart_reva_regs_t *)uart, channel);
465 }
MXC_UART_GetRXDMAChannel(mxc_uart_regs_t * uart)466 int MXC_UART_GetRXDMAChannel(mxc_uart_regs_t *uart)
467 {
468     return MXC_UART_RevA_GetRXDMAChannel((mxc_uart_reva_regs_t *)uart);
469 }
470