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 freq, mod = 0, clkdiv = 0;
134 
135     if (MXC_UART_GET_IDX(uart) < 0) {
136         return E_BAD_PARAM;
137     }
138 
139     // check if the uart is LPUART
140     if (uart == MXC_UART3) {
141         // OSR default value
142         uart->osr = 5;
143 
144         switch (clock) {
145         case MXC_UART_APB_CLK:
146         case MXC_UART_IBRO_CLK:
147             clkdiv = ((IBRO_FREQ) / baud);
148             mod = ((IBRO_FREQ) % baud);
149             break;
150 
151         case MXC_UART_ERTCO_CLK:
152             uart->ctrl |= MXC_S_UART_CTRL_BCLKSRC_EXTERNAL_CLOCK;
153             uart->ctrl |= MXC_F_UART_CTRL_FDM;
154             clkdiv = ((ERTCO_FREQ * 2) / baud);
155             mod = ((ERTCO_FREQ * 2) % baud);
156 
157             if (baud > 2400) {
158                 uart->osr = 0;
159             } else {
160                 uart->osr = 1;
161             }
162             break;
163 
164         default:
165             return E_BAD_PARAM;
166         }
167 
168         if (!clkdiv || mod > (baud / 2)) {
169             clkdiv++;
170         }
171         uart->clkdiv = clkdiv;
172 
173         freq = MXC_UART_GetFrequency(uart);
174     } else {
175         if (clock == MXC_UART_ERTCO_CLK) {
176             return E_BAD_PARAM;
177         }
178 
179         freq = MXC_UART_RevB_SetFrequency((mxc_uart_revb_regs_t *)uart, baud, clock);
180     }
181 
182     if (freq > 0) {
183         // Enable baud clock and wait for it to become ready.
184         uart->ctrl |= MXC_F_UART_CTRL_BCLKEN;
185         while (((uart->ctrl & MXC_F_UART_CTRL_BCLKRDY) >> MXC_F_UART_CTRL_BCLKRDY_POS) == 0) {}
186     }
187 
188     return freq;
189 }
190 
MXC_UART_GetFrequency(mxc_uart_regs_t * uart)191 int MXC_UART_GetFrequency(mxc_uart_regs_t *uart)
192 {
193     int periphClock = 0;
194 
195     if (MXC_UART_GET_IDX(uart) < 0) {
196         return E_BAD_PARAM;
197     }
198 
199     // check if UARt is LP UART
200     if (uart == MXC_UART3) {
201         if ((uart->ctrl & MXC_F_UART_CTRL_BCLKSRC) == MXC_S_UART_CTRL_BCLKSRC_PERIPHERAL_CLOCK) {
202             periphClock = IBRO_FREQ;
203         } else if ((uart->ctrl & MXC_F_UART_CTRL_BCLKSRC) ==
204                    MXC_S_UART_CTRL_BCLKSRC_EXTERNAL_CLOCK) {
205             periphClock = ERTCO_FREQ * 2;
206         } else {
207             return E_BAD_PARAM;
208         }
209         return (periphClock / uart->clkdiv);
210     } else {
211         return MXC_UART_RevB_GetFrequency((mxc_uart_revb_regs_t *)uart);
212     }
213 }
214 
MXC_UART_SetDataSize(mxc_uart_regs_t * uart,int dataSize)215 int MXC_UART_SetDataSize(mxc_uart_regs_t *uart, int dataSize)
216 {
217     return MXC_UART_RevB_SetDataSize((mxc_uart_revb_regs_t *)uart, dataSize);
218 }
219 
MXC_UART_SetStopBits(mxc_uart_regs_t * uart,mxc_uart_stop_t stopBits)220 int MXC_UART_SetStopBits(mxc_uart_regs_t *uart, mxc_uart_stop_t stopBits)
221 {
222     return MXC_UART_RevB_SetStopBits((mxc_uart_revb_regs_t *)uart, stopBits);
223 }
224 
MXC_UART_SetParity(mxc_uart_regs_t * uart,mxc_uart_parity_t parity)225 int MXC_UART_SetParity(mxc_uart_regs_t *uart, mxc_uart_parity_t parity)
226 {
227     return MXC_UART_RevB_SetParity((mxc_uart_revb_regs_t *)uart, parity);
228 }
229 
MXC_UART_SetFlowCtrl(mxc_uart_regs_t * uart,mxc_uart_flow_t flowCtrl,int rtsThreshold)230 int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rtsThreshold)
231 {
232     if (flowCtrl == MXC_UART_FLOW_EN) {
233         switch (MXC_UART_GET_IDX(uart)) {
234         case 0:
235             MXC_GPIO_Config(&gpio_cfg_uart0_flow);
236             break;
237 
238         case 1:
239             MXC_GPIO_Config(&gpio_cfg_uart1_flow);
240             break;
241 
242         case 2:
243             MXC_GPIO_Config(&gpio_cfg_uart2_flow);
244             break;
245 
246         default:
247             return E_BAD_PARAM;
248         }
249     } else {
250         switch (MXC_UART_GET_IDX(uart)) {
251         case 0:
252             MXC_GPIO_Config(&gpio_cfg_uart0_flow_disable);
253             break;
254 
255         case 1:
256             MXC_GPIO_Config(&gpio_cfg_uart1_flow_disable);
257             break;
258 
259         case 2:
260             MXC_GPIO_Config(&gpio_cfg_uart2_flow_disable);
261             break;
262 
263         default:
264             return E_BAD_PARAM;
265         }
266     }
267 
268     return MXC_UART_RevB_SetFlowCtrl((mxc_uart_revb_regs_t *)uart, flowCtrl, rtsThreshold);
269 }
270 
MXC_UART_SetClockSource(mxc_uart_regs_t * uart,mxc_uart_clock_t clock)271 int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, mxc_uart_clock_t clock)
272 {
273     return MXC_UART_RevB_SetClockSource((mxc_uart_revb_regs_t *)uart, clock);
274 }
275 
MXC_UART_GetActive(mxc_uart_regs_t * uart)276 int MXC_UART_GetActive(mxc_uart_regs_t *uart)
277 {
278     return MXC_UART_RevB_GetActive((mxc_uart_revb_regs_t *)uart);
279 }
280 
MXC_UART_AbortTransmission(mxc_uart_regs_t * uart)281 int MXC_UART_AbortTransmission(mxc_uart_regs_t *uart)
282 {
283     return MXC_UART_RevB_AbortTransmission((mxc_uart_revb_regs_t *)uart);
284 }
285 
MXC_UART_ReadCharacterRaw(mxc_uart_regs_t * uart)286 int MXC_UART_ReadCharacterRaw(mxc_uart_regs_t *uart)
287 {
288     return MXC_UART_RevB_ReadCharacterRaw((mxc_uart_revb_regs_t *)uart);
289 }
290 
MXC_UART_WriteCharacterRaw(mxc_uart_regs_t * uart,uint8_t character)291 int MXC_UART_WriteCharacterRaw(mxc_uart_regs_t *uart, uint8_t character)
292 {
293     return MXC_UART_RevB_WriteCharacterRaw((mxc_uart_revb_regs_t *)uart, character);
294 }
295 
MXC_UART_ReadCharacter(mxc_uart_regs_t * uart)296 int MXC_UART_ReadCharacter(mxc_uart_regs_t *uart)
297 {
298     return MXC_UART_Common_ReadCharacter(uart);
299 }
300 
MXC_UART_WriteCharacter(mxc_uart_regs_t * uart,uint8_t character)301 int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character)
302 {
303     return MXC_UART_Common_WriteCharacter(uart, character);
304 }
305 
MXC_UART_Read(mxc_uart_regs_t * uart,uint8_t * buffer,int * len)306 int MXC_UART_Read(mxc_uart_regs_t *uart, uint8_t *buffer, int *len)
307 {
308     return MXC_UART_RevB_Read((mxc_uart_revb_regs_t *)uart, buffer, len);
309 }
310 
MXC_UART_Write(mxc_uart_regs_t * uart,const uint8_t * byte,int * len)311 int MXC_UART_Write(mxc_uart_regs_t *uart, const uint8_t *byte, int *len)
312 {
313     return MXC_UART_RevB_Write((mxc_uart_revb_regs_t *)uart, byte, len);
314 }
315 
MXC_UART_ReadRXFIFO(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len)316 unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len)
317 {
318     return MXC_UART_RevB_ReadRXFIFO((mxc_uart_revb_regs_t *)uart, bytes, len);
319 }
320 
MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)321 int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len,
322                            mxc_uart_dma_complete_cb_t callback)
323 {
324     mxc_dma_config_t config;
325 
326     int uart_num = MXC_UART_GET_IDX(uart);
327 
328     switch (uart_num) {
329     case 0:
330         config.reqsel = MXC_DMA_REQUEST_UART0RX;
331         break;
332 
333     case 1:
334         config.reqsel = MXC_DMA_REQUEST_UART1RX;
335         break;
336 
337     case 2:
338         config.reqsel = MXC_DMA_REQUEST_UART2RX;
339         break;
340 
341     default:
342         return E_BAD_PARAM;
343         break;
344     }
345 
346     return MXC_UART_RevB_ReadRXFIFODMA((mxc_uart_revb_regs_t *)uart, bytes, len, callback, config);
347 }
348 
MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t * uart)349 unsigned int MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t *uart)
350 {
351     return MXC_UART_RevB_GetRXFIFOAvailable((mxc_uart_revb_regs_t *)uart);
352 }
353 
MXC_UART_WriteTXFIFO(mxc_uart_regs_t * uart,const unsigned char * bytes,unsigned int len)354 unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, const unsigned char *bytes,
355                                   unsigned int len)
356 {
357     return MXC_UART_RevB_WriteTXFIFO((mxc_uart_revb_regs_t *)uart, bytes, len);
358 }
359 
MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t * uart,const unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)360 int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, const unsigned char *bytes, unsigned int len,
361                             mxc_uart_dma_complete_cb_t callback)
362 {
363     mxc_dma_config_t config;
364 
365     int uart_num = MXC_UART_GET_IDX(uart);
366 
367     switch (uart_num) {
368     case 0:
369         config.reqsel = MXC_DMA_REQUEST_UART0TX;
370         break;
371 
372     case 1:
373         config.reqsel = MXC_DMA_REQUEST_UART1TX;
374         break;
375 
376     case 2:
377         config.reqsel = MXC_DMA_REQUEST_UART2TX;
378         break;
379 
380     default:
381         return E_BAD_PARAM;
382         break;
383     }
384 
385     return MXC_UART_RevB_WriteTXFIFODMA((mxc_uart_revb_regs_t *)uart, bytes, len, callback, config);
386 }
387 
MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t * uart)388 unsigned int MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t *uart)
389 {
390     return MXC_UART_RevB_GetTXFIFOAvailable((mxc_uart_revb_regs_t *)uart);
391 }
392 
MXC_UART_ClearRXFIFO(mxc_uart_regs_t * uart)393 int MXC_UART_ClearRXFIFO(mxc_uart_regs_t *uart)
394 {
395     return MXC_UART_RevB_ClearRXFIFO((mxc_uart_revb_regs_t *)uart);
396 }
397 
MXC_UART_ClearTXFIFO(mxc_uart_regs_t * uart)398 int MXC_UART_ClearTXFIFO(mxc_uart_regs_t *uart)
399 {
400     return MXC_UART_RevB_ClearTXFIFO((mxc_uart_revb_regs_t *)uart);
401 }
402 
MXC_UART_SetRXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)403 int MXC_UART_SetRXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
404 {
405     return MXC_UART_RevB_SetRXThreshold((mxc_uart_revb_regs_t *)uart, numBytes);
406 }
407 
MXC_UART_GetRXThreshold(mxc_uart_regs_t * uart)408 unsigned int MXC_UART_GetRXThreshold(mxc_uart_regs_t *uart)
409 {
410     return MXC_UART_RevB_GetRXThreshold((mxc_uart_revb_regs_t *)uart);
411 }
412 
MXC_UART_SetTXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)413 int MXC_UART_SetTXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
414 {
415     return E_NOT_SUPPORTED;
416 }
417 
MXC_UART_GetTXThreshold(mxc_uart_regs_t * uart)418 unsigned int MXC_UART_GetTXThreshold(mxc_uart_regs_t *uart)
419 {
420     return E_NOT_SUPPORTED;
421 }
422 
MXC_UART_GetFlags(mxc_uart_regs_t * uart)423 unsigned int MXC_UART_GetFlags(mxc_uart_regs_t *uart)
424 {
425     return MXC_UART_RevB_GetFlags((mxc_uart_revb_regs_t *)uart);
426 }
427 
MXC_UART_ClearFlags(mxc_uart_regs_t * uart,unsigned int flags)428 int MXC_UART_ClearFlags(mxc_uart_regs_t *uart, unsigned int flags)
429 {
430     return MXC_UART_RevB_ClearFlags((mxc_uart_revb_regs_t *)uart, flags);
431 }
432 
MXC_UART_EnableInt(mxc_uart_regs_t * uart,unsigned int intEn)433 int MXC_UART_EnableInt(mxc_uart_regs_t *uart, unsigned int intEn)
434 {
435     return MXC_UART_RevB_EnableInt((mxc_uart_revb_regs_t *)uart, intEn);
436 }
437 
MXC_UART_DisableInt(mxc_uart_regs_t * uart,unsigned int intDis)438 int MXC_UART_DisableInt(mxc_uart_regs_t *uart, unsigned int intDis)
439 {
440     return MXC_UART_RevB_DisableInt((mxc_uart_revb_regs_t *)uart, intDis);
441 }
442 
MXC_UART_GetStatus(mxc_uart_regs_t * uart)443 unsigned int MXC_UART_GetStatus(mxc_uart_regs_t *uart)
444 {
445     return MXC_UART_RevB_GetStatus((mxc_uart_revb_regs_t *)uart);
446 }
447 
MXC_UART_Transaction(mxc_uart_req_t * req)448 int MXC_UART_Transaction(mxc_uart_req_t *req)
449 {
450     return MXC_UART_RevB_Transaction((mxc_uart_revb_req_t *)req);
451 }
452 
MXC_UART_TransactionAsync(mxc_uart_req_t * req)453 int MXC_UART_TransactionAsync(mxc_uart_req_t *req)
454 {
455     return MXC_UART_RevB_TransactionAsync((mxc_uart_revb_req_t *)req);
456 }
457 
MXC_UART_TransactionDMA(mxc_uart_req_t * req)458 int MXC_UART_TransactionDMA(mxc_uart_req_t *req)
459 {
460     return MXC_UART_RevB_TransactionDMA((mxc_uart_revb_req_t *)req);
461 }
462 
MXC_UART_AbortAsync(mxc_uart_regs_t * uart)463 int MXC_UART_AbortAsync(mxc_uart_regs_t *uart)
464 {
465     return MXC_UART_RevB_AbortAsync((mxc_uart_revb_regs_t *)uart);
466 }
467 
MXC_UART_AsyncHandler(mxc_uart_regs_t * uart)468 int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart)
469 {
470     return MXC_UART_RevB_AsyncHandler((mxc_uart_revb_regs_t *)uart);
471 }
472 
MXC_UART_GetAsyncTXCount(mxc_uart_req_t * req)473 uint32_t MXC_UART_GetAsyncTXCount(mxc_uart_req_t *req)
474 {
475     return req->txCnt;
476 }
477 
MXC_UART_GetAsyncRXCount(mxc_uart_req_t * req)478 uint32_t MXC_UART_GetAsyncRXCount(mxc_uart_req_t *req)
479 {
480     return req->rxCnt;
481 }
482 
MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t * uart,bool enable)483 int MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t *uart, bool enable)
484 {
485     return MXC_UART_RevB_SetAutoDMAHandlers((mxc_uart_revb_regs_t *)uart, enable);
486 }
487 
MXC_UART_SetTXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)488 int MXC_UART_SetTXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
489 {
490     return MXC_UART_RevB_SetTXDMAChannel((mxc_uart_revb_regs_t *)uart, channel);
491 }
492 
MXC_UART_GetTXDMAChannel(mxc_uart_regs_t * uart)493 int MXC_UART_GetTXDMAChannel(mxc_uart_regs_t *uart)
494 {
495     return MXC_UART_RevB_GetTXDMAChannel((mxc_uart_revb_regs_t *)uart);
496 }
497 
MXC_UART_SetRXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)498 int MXC_UART_SetRXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
499 {
500     return MXC_UART_RevB_SetRXDMAChannel((mxc_uart_revb_regs_t *)uart, channel);
501 }
502 
MXC_UART_GetRXDMAChannel(mxc_uart_regs_t * uart)503 int MXC_UART_GetRXDMAChannel(mxc_uart_regs_t *uart)
504 {
505     return MXC_UART_RevB_GetTXDMAChannel((mxc_uart_revb_regs_t *)uart);
506 }
507