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_revb.h"
26 #include "uart_common.h"
27 #include "lpgcr_regs.h"
28 #include "dma.h"
29 
MXC_UART_DMACallback(int ch,int error)30 void MXC_UART_DMACallback(int ch, int error)
31 {
32     MXC_UART_RevB_DMACallback(ch, error);
33 }
34 
MXC_UART_AsyncCallback(mxc_uart_regs_t * uart,int retVal)35 int MXC_UART_AsyncCallback(mxc_uart_regs_t *uart, int retVal)
36 {
37     return MXC_UART_RevB_AsyncCallback((mxc_uart_revb_regs_t *)uart, retVal);
38 }
39 
MXC_UART_AsyncStop(mxc_uart_regs_t * uart)40 int MXC_UART_AsyncStop(mxc_uart_regs_t *uart)
41 {
42     return MXC_UART_RevB_AsyncStop((mxc_uart_revb_regs_t *)uart);
43 }
44 
MXC_UART_Init(mxc_uart_regs_t * uart,unsigned int baud,mxc_uart_clock_t clock)45 int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clock)
46 {
47     int retval;
48 
49     retval = MXC_UART_Shutdown(uart);
50 
51     if (retval) {
52         return retval;
53     }
54 
55     switch (clock) {
56     case MXC_UART_ERTCO_CLK:
57         MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_ERTCO);
58         break;
59 
60     case MXC_UART_IBRO_CLK:
61         MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_IBRO);
62         break;
63 
64     default:
65         break;
66     }
67 
68     switch (MXC_UART_GET_IDX(uart)) {
69     case 0:
70         MXC_GPIO_Config(&gpio_cfg_uart0);
71         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART0);
72         break;
73 
74     case 1:
75         MXC_GPIO_Config(&gpio_cfg_uart1);
76         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART1);
77         break;
78 
79     case 2:
80         MXC_GPIO_Config(&gpio_cfg_uart2);
81         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART2);
82         break;
83 
84     case 3:
85         MXC_GPIO_Config(&gpio_cfg_uart3);
86         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART3);
87         break;
88 
89     default:
90         return E_BAD_PARAM;
91     }
92 
93     return MXC_UART_RevB_Init((mxc_uart_revb_regs_t *)uart, baud, clock);
94 }
95 
MXC_UART_Shutdown(mxc_uart_regs_t * uart)96 int MXC_UART_Shutdown(mxc_uart_regs_t *uart)
97 {
98     switch (MXC_UART_GET_IDX(uart)) {
99     case 0:
100         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART0);
101         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART0);
102         break;
103 
104     case 1:
105         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART1);
106         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART1);
107         break;
108 
109     case 2:
110         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART2);
111         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART2);
112         break;
113 
114     case 3:
115         MXC_SYS_Reset_Periph(MXC_SYS_RESET_UART3);
116         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART3);
117         break;
118 
119     default:
120         return E_BAD_PARAM;
121     }
122 
123     return E_NO_ERROR;
124 }
125 
MXC_UART_ReadyForSleep(mxc_uart_regs_t * uart)126 int MXC_UART_ReadyForSleep(mxc_uart_regs_t *uart)
127 {
128     return MXC_UART_RevB_ReadyForSleep((mxc_uart_revb_regs_t *)uart);
129 }
130 
MXC_UART_SetFrequency(mxc_uart_regs_t * uart,unsigned int baud,mxc_uart_clock_t clock)131 int MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clock)
132 {
133     int frequency, clkDiv = 0, mod = 0;
134     if (MXC_UART_GET_IDX(uart) < 0) {
135         return E_BAD_PARAM;
136     }
137 
138     // check if the uart is LPUART
139     if (uart == MXC_UART3) {
140         // OSR default value
141         uart->osr = 5;
142 
143         switch (clock) {
144         case MXC_UART_APB_CLK:
145         case MXC_UART_IBRO_CLK:
146             clkDiv = ((IBRO_FREQ) / baud);
147             mod = ((IBRO_FREQ) % baud);
148             break;
149 
150         case MXC_UART_ERTCO_CLK:
151             uart->ctrl |= MXC_S_UART_CTRL_BCLKSRC_EXTERNAL_CLOCK;
152             uart->ctrl |= MXC_F_UART_CTRL_FDM;
153             clkDiv = ((ERTCO_FREQ * 2) / baud);
154             mod = ((ERTCO_FREQ * 2) % baud);
155 
156             if (baud > 2400) {
157                 uart->osr = 0;
158             } else {
159                 uart->osr = 1;
160             }
161             break;
162 
163         default:
164             return E_BAD_PARAM;
165         }
166         if (!clkDiv || mod > (baud / 2)) {
167             clkDiv++;
168         }
169         uart->clkdiv = clkDiv;
170         frequency = MXC_UART_GetFrequency(uart);
171     } else {
172         if (clock == MXC_UART_ERTCO_CLK) {
173             return E_BAD_PARAM;
174         }
175 
176         frequency = MXC_UART_RevB_SetFrequency((mxc_uart_revb_regs_t *)uart, baud, clock);
177     }
178 
179     if (frequency > 0) {
180         // Enable baud clock and wait for it to become ready.
181         uart->ctrl |= MXC_F_UART_CTRL_BCLKEN;
182         while (((uart->ctrl & MXC_F_UART_CTRL_BCLKRDY) >> MXC_F_UART_CTRL_BCLKRDY_POS) == 0) {}
183     }
184 
185     return frequency;
186 }
187 
MXC_UART_GetFrequency(mxc_uart_regs_t * uart)188 int MXC_UART_GetFrequency(mxc_uart_regs_t *uart)
189 {
190     int periphClock = 0;
191 
192     if (MXC_UART_GET_IDX(uart) < 0) {
193         return E_BAD_PARAM;
194     }
195 
196     // check if UARt is LP UART
197     if (uart == MXC_UART3) {
198         if ((uart->ctrl & MXC_F_UART_CTRL_BCLKSRC) == MXC_S_UART_CTRL_BCLKSRC_EXTERNAL_CLOCK) {
199             periphClock = ERTCO_FREQ * 2;
200         } else if ((uart->ctrl & MXC_F_UART_CTRL_BCLKSRC) ==
201                    MXC_S_UART_CTRL_BCLKSRC_PERIPHERAL_CLOCK) {
202             periphClock = IBRO_FREQ;
203         } else {
204             return E_BAD_PARAM;
205         }
206         return (periphClock / uart->clkdiv);
207     } else {
208         return MXC_UART_RevB_GetFrequency((mxc_uart_revb_regs_t *)uart);
209     }
210 }
211 
MXC_UART_SetDataSize(mxc_uart_regs_t * uart,int dataSize)212 int MXC_UART_SetDataSize(mxc_uart_regs_t *uart, int dataSize)
213 {
214     return MXC_UART_RevB_SetDataSize((mxc_uart_revb_regs_t *)uart, dataSize);
215 }
216 
MXC_UART_SetStopBits(mxc_uart_regs_t * uart,mxc_uart_stop_t stopBits)217 int MXC_UART_SetStopBits(mxc_uart_regs_t *uart, mxc_uart_stop_t stopBits)
218 {
219     return MXC_UART_RevB_SetStopBits((mxc_uart_revb_regs_t *)uart, stopBits);
220 }
221 
MXC_UART_SetParity(mxc_uart_regs_t * uart,mxc_uart_parity_t parity)222 int MXC_UART_SetParity(mxc_uart_regs_t *uart, mxc_uart_parity_t parity)
223 {
224     return MXC_UART_RevB_SetParity((mxc_uart_revb_regs_t *)uart, parity);
225 }
226 
MXC_UART_SetFlowCtrl(mxc_uart_regs_t * uart,mxc_uart_flow_t flowCtrl,int rtsThreshold)227 int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rtsThreshold)
228 {
229     if (flowCtrl == MXC_UART_FLOW_EN) {
230         switch (MXC_UART_GET_IDX(uart)) {
231         case 0:
232             MXC_GPIO_Config(&gpio_cfg_uart0_flow);
233             break;
234 
235         default:
236             return E_BAD_PARAM;
237         }
238     } else {
239         switch (MXC_UART_GET_IDX(uart)) {
240         case 0:
241             MXC_GPIO_Config(&gpio_cfg_uart0_flow_disable);
242             break;
243 
244         default:
245             return E_BAD_PARAM;
246         }
247     }
248 
249     return MXC_UART_RevB_SetFlowCtrl((mxc_uart_revb_regs_t *)uart, flowCtrl, rtsThreshold);
250 }
251 
MXC_UART_SetClockSource(mxc_uart_regs_t * uart,mxc_uart_clock_t clock)252 int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, mxc_uart_clock_t clock)
253 {
254     return MXC_UART_RevB_SetClockSource((mxc_uart_revb_regs_t *)uart, clock);
255 }
256 
MXC_UART_GetActive(mxc_uart_regs_t * uart)257 int MXC_UART_GetActive(mxc_uart_regs_t *uart)
258 {
259     return MXC_UART_RevB_GetActive((mxc_uart_revb_regs_t *)uart);
260 }
261 
MXC_UART_AbortTransmission(mxc_uart_regs_t * uart)262 int MXC_UART_AbortTransmission(mxc_uart_regs_t *uart)
263 {
264     return MXC_UART_RevB_AbortTransmission((mxc_uart_revb_regs_t *)uart);
265 }
266 
MXC_UART_ReadCharacterRaw(mxc_uart_regs_t * uart)267 int MXC_UART_ReadCharacterRaw(mxc_uart_regs_t *uart)
268 {
269     return MXC_UART_RevB_ReadCharacterRaw((mxc_uart_revb_regs_t *)uart);
270 }
271 
MXC_UART_WriteCharacterRaw(mxc_uart_regs_t * uart,uint8_t character)272 int MXC_UART_WriteCharacterRaw(mxc_uart_regs_t *uart, uint8_t character)
273 {
274     return MXC_UART_RevB_WriteCharacterRaw((mxc_uart_revb_regs_t *)uart, character);
275 }
276 
MXC_UART_ReadCharacter(mxc_uart_regs_t * uart)277 int MXC_UART_ReadCharacter(mxc_uart_regs_t *uart)
278 {
279     return MXC_UART_Common_ReadCharacter(uart);
280 }
281 
MXC_UART_WriteCharacter(mxc_uart_regs_t * uart,uint8_t character)282 int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character)
283 {
284     return MXC_UART_Common_WriteCharacter(uart, character);
285 }
286 
MXC_UART_Read(mxc_uart_regs_t * uart,uint8_t * buffer,int * len)287 int MXC_UART_Read(mxc_uart_regs_t *uart, uint8_t *buffer, int *len)
288 {
289     return MXC_UART_RevB_Read((mxc_uart_revb_regs_t *)uart, buffer, len);
290 }
291 
MXC_UART_Write(mxc_uart_regs_t * uart,const uint8_t * byte,int * len)292 int MXC_UART_Write(mxc_uart_regs_t *uart, const uint8_t *byte, int *len)
293 {
294     return MXC_UART_RevB_Write((mxc_uart_revb_regs_t *)uart, byte, len);
295 }
296 
MXC_UART_ReadRXFIFO(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len)297 unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len)
298 {
299     return MXC_UART_RevB_ReadRXFIFO((mxc_uart_revb_regs_t *)uart, bytes, len);
300 }
301 
MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)302 int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len,
303                            mxc_uart_dma_complete_cb_t callback)
304 {
305     mxc_dma_config_t config;
306 
307     int uart_num = MXC_UART_GET_IDX(uart);
308 
309     switch (uart_num) {
310     case 0:
311         config.reqsel = MXC_DMA_REQUEST_UART0RX;
312         break;
313 
314     case 1:
315         config.reqsel = MXC_DMA_REQUEST_UART1RX;
316         break;
317 
318     case 2:
319         config.reqsel = MXC_DMA_REQUEST_UART2RX;
320         break;
321 
322     case 3:
323         config.reqsel = MXC_DMA_REQUEST_UART3RX;
324         break;
325 
326     default:
327         return E_BAD_PARAM;
328         break;
329     }
330 
331     return MXC_UART_RevB_ReadRXFIFODMA((mxc_uart_revb_regs_t *)uart, bytes, len, callback, config);
332 }
333 
MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t * uart)334 unsigned int MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t *uart)
335 {
336     return MXC_UART_RevB_GetRXFIFOAvailable((mxc_uart_revb_regs_t *)uart);
337 }
338 
MXC_UART_WriteTXFIFO(mxc_uart_regs_t * uart,const unsigned char * bytes,unsigned int len)339 unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, const unsigned char *bytes,
340                                   unsigned int len)
341 {
342     return MXC_UART_RevB_WriteTXFIFO((mxc_uart_revb_regs_t *)uart, bytes, len);
343 }
344 
MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t * uart,const unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)345 int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, const unsigned char *bytes, unsigned int len,
346                             mxc_uart_dma_complete_cb_t callback)
347 {
348     mxc_dma_config_t config;
349 
350     int uart_num = MXC_UART_GET_IDX(uart);
351 
352     switch (uart_num) {
353     case 0:
354         config.reqsel = MXC_DMA_REQUEST_UART0TX;
355         break;
356 
357     case 1:
358         config.reqsel = MXC_DMA_REQUEST_UART1TX;
359         break;
360 
361     case 2:
362         config.reqsel = MXC_DMA_REQUEST_UART2TX;
363         break;
364 
365     case 3:
366         config.reqsel = MXC_DMA_REQUEST_UART3TX;
367         break;
368 
369     default:
370         return E_BAD_PARAM;
371         break;
372     }
373 
374     return MXC_UART_RevB_WriteTXFIFODMA((mxc_uart_revb_regs_t *)uart, bytes, len, callback, config);
375 }
376 
MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t * uart)377 unsigned int MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t *uart)
378 {
379     return MXC_UART_RevB_GetTXFIFOAvailable((mxc_uart_revb_regs_t *)uart);
380 }
381 
MXC_UART_ClearRXFIFO(mxc_uart_regs_t * uart)382 int MXC_UART_ClearRXFIFO(mxc_uart_regs_t *uart)
383 {
384     return MXC_UART_RevB_ClearRXFIFO((mxc_uart_revb_regs_t *)uart);
385 }
386 
MXC_UART_ClearTXFIFO(mxc_uart_regs_t * uart)387 int MXC_UART_ClearTXFIFO(mxc_uart_regs_t *uart)
388 {
389     return MXC_UART_RevB_ClearTXFIFO((mxc_uart_revb_regs_t *)uart);
390 }
391 
MXC_UART_SetRXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)392 int MXC_UART_SetRXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
393 {
394     return MXC_UART_RevB_SetRXThreshold((mxc_uart_revb_regs_t *)uart, numBytes);
395 }
396 
MXC_UART_GetRXThreshold(mxc_uart_regs_t * uart)397 unsigned int MXC_UART_GetRXThreshold(mxc_uart_regs_t *uart)
398 {
399     return MXC_UART_RevB_GetRXThreshold((mxc_uart_revb_regs_t *)uart);
400 }
401 
MXC_UART_SetTXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)402 int MXC_UART_SetTXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
403 {
404     return E_NOT_SUPPORTED;
405 }
406 
MXC_UART_GetTXThreshold(mxc_uart_regs_t * uart)407 unsigned int MXC_UART_GetTXThreshold(mxc_uart_regs_t *uart)
408 {
409     return E_NOT_SUPPORTED;
410 }
411 
MXC_UART_GetFlags(mxc_uart_regs_t * uart)412 unsigned int MXC_UART_GetFlags(mxc_uart_regs_t *uart)
413 {
414     return MXC_UART_RevB_GetFlags((mxc_uart_revb_regs_t *)uart);
415 }
416 
MXC_UART_ClearFlags(mxc_uart_regs_t * uart,unsigned int flags)417 int MXC_UART_ClearFlags(mxc_uart_regs_t *uart, unsigned int flags)
418 {
419     return MXC_UART_RevB_ClearFlags((mxc_uart_revb_regs_t *)uart, flags);
420 }
421 
MXC_UART_EnableInt(mxc_uart_regs_t * uart,unsigned int intEn)422 int MXC_UART_EnableInt(mxc_uart_regs_t *uart, unsigned int intEn)
423 {
424     return MXC_UART_RevB_EnableInt((mxc_uart_revb_regs_t *)uart, intEn);
425 }
426 
MXC_UART_DisableInt(mxc_uart_regs_t * uart,unsigned int intDis)427 int MXC_UART_DisableInt(mxc_uart_regs_t *uart, unsigned int intDis)
428 {
429     return MXC_UART_RevB_DisableInt((mxc_uart_revb_regs_t *)uart, intDis);
430 }
431 
MXC_UART_GetStatus(mxc_uart_regs_t * uart)432 unsigned int MXC_UART_GetStatus(mxc_uart_regs_t *uart)
433 {
434     return MXC_UART_RevB_GetStatus((mxc_uart_revb_regs_t *)uart);
435 }
436 
MXC_UART_Transaction(mxc_uart_req_t * req)437 int MXC_UART_Transaction(mxc_uart_req_t *req)
438 {
439     return MXC_UART_RevB_Transaction((mxc_uart_revb_req_t *)req);
440 }
441 
MXC_UART_TransactionAsync(mxc_uart_req_t * req)442 int MXC_UART_TransactionAsync(mxc_uart_req_t *req)
443 {
444     return MXC_UART_RevB_TransactionAsync((mxc_uart_revb_req_t *)req);
445 }
446 
MXC_UART_TransactionDMA(mxc_uart_req_t * req)447 int MXC_UART_TransactionDMA(mxc_uart_req_t *req)
448 {
449     return MXC_UART_RevB_TransactionDMA((mxc_uart_revb_req_t *)req);
450 }
451 
MXC_UART_AbortAsync(mxc_uart_regs_t * uart)452 int MXC_UART_AbortAsync(mxc_uart_regs_t *uart)
453 {
454     return MXC_UART_RevB_AbortAsync((mxc_uart_revb_regs_t *)uart);
455 }
456 
MXC_UART_AsyncHandler(mxc_uart_regs_t * uart)457 int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart)
458 {
459     return MXC_UART_RevB_AsyncHandler((mxc_uart_revb_regs_t *)uart);
460 }
461 
MXC_UART_GetAsyncTXCount(mxc_uart_req_t * req)462 uint32_t MXC_UART_GetAsyncTXCount(mxc_uart_req_t *req)
463 {
464     return req->txCnt;
465 }
466 
MXC_UART_GetAsyncRXCount(mxc_uart_req_t * req)467 uint32_t MXC_UART_GetAsyncRXCount(mxc_uart_req_t *req)
468 {
469     return req->rxCnt;
470 }
471 
MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t * uart,bool enable)472 int MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t *uart, bool enable)
473 {
474     return MXC_UART_RevB_SetAutoDMAHandlers((mxc_uart_revb_regs_t *)uart, enable);
475 }
476 
MXC_UART_SetTXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)477 int MXC_UART_SetTXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
478 {
479     return MXC_UART_RevB_SetTXDMAChannel((mxc_uart_revb_regs_t *)uart, channel);
480 }
481 
MXC_UART_GetTXDMAChannel(mxc_uart_regs_t * uart)482 int MXC_UART_GetTXDMAChannel(mxc_uart_regs_t *uart)
483 {
484     return MXC_UART_RevB_GetTXDMAChannel((mxc_uart_revb_regs_t *)uart);
485 }
486 
MXC_UART_SetRXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)487 int MXC_UART_SetRXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
488 {
489     return MXC_UART_RevB_SetRXDMAChannel((mxc_uart_revb_regs_t *)uart, channel);
490 }
491 
MXC_UART_GetRXDMAChannel(mxc_uart_regs_t * uart)492 int MXC_UART_GetRXDMAChannel(mxc_uart_regs_t *uart)
493 {
494     return MXC_UART_RevB_GetTXDMAChannel((mxc_uart_revb_regs_t *)uart);
495 }
496