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