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