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,sys_map_t map)64 int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud, sys_map_t map)
65 {
66 #ifndef MSDK_NO_GPIO_CLK_INIT
67     int retval;
68 
69     retval = MXC_UART_Shutdown(uart);
70 
71     if (retval) {
72         return retval;
73     }
74 
75     switch (MXC_UART_GET_IDX(uart)) {
76     case 0:
77         MXC_GPIO_Config(&gpio_cfg_uart0);
78         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART0);
79         break;
80 
81     case 1:
82         switch (map) {
83         case MAP_A:
84             MXC_GPIO_Config(&gpio_cfg_uart1a);
85             break;
86         case MAP_B:
87             MXC_GPIO_Config(&gpio_cfg_uart1b);
88             break;
89         case MAP_C:
90             MXC_GPIO_Config(&gpio_cfg_uart1c);
91             break;
92         }
93         MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART1);
94         break;
95 
96     default:
97         return E_BAD_PARAM;
98         break;
99     }
100 #else
101     (void)map;
102 #endif
103 
104     return MXC_UART_RevA_Init(((mxc_uart_reva_regs_t *)uart), baud);
105 }
106 
MXC_UART_Shutdown(mxc_uart_regs_t * uart)107 int MXC_UART_Shutdown(mxc_uart_regs_t *uart)
108 {
109     switch (MXC_UART_GET_IDX(uart)) {
110     case 0:
111         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART0);
112         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART0);
113         break;
114 
115     case 1:
116         MXC_SYS_Reset_Periph(MXC_SYS_RESET0_UART1);
117         MXC_SYS_ClockDisable(MXC_SYS_PERIPH_CLOCK_UART1);
118         break;
119 
120     default:
121         return E_BAD_PARAM;
122         break;
123     }
124 
125     return E_NO_ERROR;
126 }
127 
MXC_UART_ReadyForSleep(mxc_uart_regs_t * uart)128 int MXC_UART_ReadyForSleep(mxc_uart_regs_t *uart)
129 {
130     return MXC_UART_RevA_ReadyForSleep((mxc_uart_reva_regs_t *)uart);
131 }
132 
MXC_UART_SetFrequency(mxc_uart_regs_t * uart,unsigned int baud)133 int MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud)
134 {
135     return MXC_UART_RevA_SetFrequency((mxc_uart_reva_regs_t *)uart, baud);
136 }
137 
MXC_UART_GetFrequency(mxc_uart_regs_t * uart)138 int MXC_UART_GetFrequency(mxc_uart_regs_t *uart)
139 {
140     return MXC_UART_RevA_GetFrequency((mxc_uart_reva_regs_t *)uart);
141 }
142 
MXC_UART_SetDataSize(mxc_uart_regs_t * uart,int dataSize)143 int MXC_UART_SetDataSize(mxc_uart_regs_t *uart, int dataSize)
144 {
145     return MXC_UART_RevA_SetDataSize((mxc_uart_reva_regs_t *)uart, dataSize);
146 }
147 
MXC_UART_SetStopBits(mxc_uart_regs_t * uart,mxc_uart_stop_t stopBits)148 int MXC_UART_SetStopBits(mxc_uart_regs_t *uart, mxc_uart_stop_t stopBits)
149 {
150     return MXC_UART_RevA_SetStopBits((mxc_uart_reva_regs_t *)uart, stopBits);
151 }
152 
MXC_UART_SetParity(mxc_uart_regs_t * uart,mxc_uart_parity_t parity)153 int MXC_UART_SetParity(mxc_uart_regs_t *uart, mxc_uart_parity_t parity)
154 {
155     return MXC_UART_RevA_SetParity((mxc_uart_reva_regs_t *)uart, parity);
156 }
157 
MXC_UART_SetFlowCtrl(mxc_uart_regs_t * uart,mxc_uart_flow_t flowCtrl,int rtsThreshold)158 int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rtsThreshold)
159 {
160     switch (MXC_UART_GET_IDX(uart)) {
161     case 0:
162         MXC_GPIO_Config(&gpio_cfg_uart0_flow);
163         break;
164 
165     case 1:
166         MXC_GPIO_Config(&gpio_cfg_uart1_flow);
167         break;
168     }
169 
170     return MXC_UART_RevA_SetFlowCtrl((mxc_uart_reva_regs_t *)uart, flowCtrl, rtsThreshold);
171 }
172 
MXC_UART_SetClockSource(mxc_uart_regs_t * uart,int usePCLK)173 int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, int usePCLK)
174 {
175     return MXC_UART_RevA_SetClockSource((mxc_uart_reva_regs_t *)uart, usePCLK);
176 }
177 
MXC_UART_SetNullModem(mxc_uart_regs_t * uart,int nullModem)178 int MXC_UART_SetNullModem(mxc_uart_regs_t *uart, int nullModem)
179 {
180     return MXC_UART_RevA_SetNullModem((mxc_uart_reva_regs_t *)uart, nullModem);
181 }
182 
MXC_UART_SendBreak(mxc_uart_regs_t * uart)183 int MXC_UART_SendBreak(mxc_uart_regs_t *uart)
184 {
185     return MXC_UART_RevA_SendBreak((mxc_uart_reva_regs_t *)uart);
186 }
187 
MXC_UART_GetActive(mxc_uart_regs_t * uart)188 int MXC_UART_GetActive(mxc_uart_regs_t *uart)
189 {
190     return MXC_UART_RevA_GetActive((mxc_uart_reva_regs_t *)uart);
191 }
192 
MXC_UART_AbortTransmission(mxc_uart_regs_t * uart)193 int MXC_UART_AbortTransmission(mxc_uart_regs_t *uart)
194 {
195     return MXC_UART_RevA_AbortTransmission((mxc_uart_reva_regs_t *)uart);
196 }
197 
MXC_UART_ReadCharacterRaw(mxc_uart_regs_t * uart)198 int MXC_UART_ReadCharacterRaw(mxc_uart_regs_t *uart)
199 {
200     return MXC_UART_RevA_ReadCharacterRaw((mxc_uart_reva_regs_t *)uart);
201 }
202 
MXC_UART_WriteCharacterRaw(mxc_uart_regs_t * uart,uint8_t character)203 int MXC_UART_WriteCharacterRaw(mxc_uart_regs_t *uart, uint8_t character)
204 {
205     return MXC_UART_RevA_WriteCharacterRaw((mxc_uart_reva_regs_t *)uart, character);
206 }
207 
MXC_UART_ReadCharacter(mxc_uart_regs_t * uart)208 int MXC_UART_ReadCharacter(mxc_uart_regs_t *uart)
209 {
210     return MXC_UART_Common_ReadCharacter(uart);
211 }
212 
MXC_UART_WriteCharacter(mxc_uart_regs_t * uart,uint8_t character)213 int MXC_UART_WriteCharacter(mxc_uart_regs_t *uart, uint8_t character)
214 {
215     return MXC_UART_Common_WriteCharacter(uart, character);
216 }
217 
MXC_UART_Read(mxc_uart_regs_t * uart,uint8_t * buffer,int * len)218 int MXC_UART_Read(mxc_uart_regs_t *uart, uint8_t *buffer, int *len)
219 {
220     return MXC_UART_RevA_Read((mxc_uart_reva_regs_t *)uart, buffer, len);
221 }
222 
MXC_UART_Write(mxc_uart_regs_t * uart,uint8_t * byte,int * len)223 int MXC_UART_Write(mxc_uart_regs_t *uart, uint8_t *byte, int *len)
224 {
225     return MXC_UART_RevA_Write((mxc_uart_reva_regs_t *)uart, byte, len);
226 }
227 
MXC_UART_ReadRXFIFO(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len)228 unsigned int MXC_UART_ReadRXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len)
229 {
230     return MXC_UART_RevA_ReadRXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len);
231 }
232 
MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)233 int MXC_UART_ReadRXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len,
234                            mxc_uart_dma_complete_cb_t callback)
235 {
236     mxc_dma_config_t config;
237 
238     int uart_num = MXC_UART_GET_IDX(uart);
239 
240     // Only UART 0, 1 and 2 are supported for DMA transaction
241     switch (uart_num) {
242     case 0:
243         config.reqsel = MXC_DMA_REQUEST_UART0RX;
244         break;
245 
246     case 1:
247         config.reqsel = MXC_DMA_REQUEST_UART1RX;
248         break;
249 
250     default:
251         return E_BAD_PARAM;
252         break;
253     }
254 
255     return MXC_UART_RevA_ReadRXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback,
256                                        config);
257 }
258 
MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t * uart)259 unsigned int MXC_UART_GetRXFIFOAvailable(mxc_uart_regs_t *uart)
260 {
261     return MXC_UART_RevA_GetRXFIFOAvailable((mxc_uart_reva_regs_t *)uart);
262 }
263 
MXC_UART_WriteTXFIFO(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len)264 unsigned int MXC_UART_WriteTXFIFO(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len)
265 {
266     return MXC_UART_RevA_WriteTXFIFO((mxc_uart_reva_regs_t *)uart, bytes, len);
267 }
268 
MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t * uart,unsigned char * bytes,unsigned int len,mxc_uart_dma_complete_cb_t callback)269 int MXC_UART_WriteTXFIFODMA(mxc_uart_regs_t *uart, unsigned char *bytes, unsigned int len,
270                             mxc_uart_dma_complete_cb_t callback)
271 {
272     mxc_dma_config_t config;
273 
274     int uart_num = MXC_UART_GET_IDX(uart);
275 
276     // Only UART 0, 1 and 2 are supported for DMA transaction
277     switch (uart_num) {
278     case 0:
279         config.reqsel = MXC_DMA_REQUEST_UART0TX;
280         break;
281 
282     case 1:
283         config.reqsel = MXC_DMA_REQUEST_UART1TX;
284         break;
285 
286     default:
287         return E_BAD_PARAM;
288         break;
289     }
290 
291     return MXC_UART_RevA_WriteTXFIFODMA((mxc_uart_reva_regs_t *)uart, MXC_DMA, bytes, len, callback,
292                                         config);
293 }
294 
MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t * uart)295 unsigned int MXC_UART_GetTXFIFOAvailable(mxc_uart_regs_t *uart)
296 {
297     return MXC_UART_RevA_GetTXFIFOAvailable((mxc_uart_reva_regs_t *)uart);
298 }
299 
MXC_UART_ClearRXFIFO(mxc_uart_regs_t * uart)300 int MXC_UART_ClearRXFIFO(mxc_uart_regs_t *uart)
301 {
302     return MXC_UART_RevA_ClearRXFIFO((mxc_uart_reva_regs_t *)uart);
303 }
304 
MXC_UART_ClearTXFIFO(mxc_uart_regs_t * uart)305 int MXC_UART_ClearTXFIFO(mxc_uart_regs_t *uart)
306 {
307     return MXC_UART_RevA_ClearTXFIFO((mxc_uart_reva_regs_t *)uart);
308 }
309 
MXC_UART_SetRXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)310 int MXC_UART_SetRXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
311 {
312     return MXC_UART_RevA_SetRXThreshold((mxc_uart_reva_regs_t *)uart, numBytes);
313 }
314 
MXC_UART_GetRXThreshold(mxc_uart_regs_t * uart)315 unsigned int MXC_UART_GetRXThreshold(mxc_uart_regs_t *uart)
316 {
317     return MXC_UART_RevA_GetRXThreshold((mxc_uart_reva_regs_t *)uart);
318 }
319 
MXC_UART_SetTXThreshold(mxc_uart_regs_t * uart,unsigned int numBytes)320 int MXC_UART_SetTXThreshold(mxc_uart_regs_t *uart, unsigned int numBytes)
321 {
322     return MXC_UART_RevA_SetTXThreshold((mxc_uart_reva_regs_t *)uart, numBytes);
323 }
324 
MXC_UART_GetTXThreshold(mxc_uart_regs_t * uart)325 unsigned int MXC_UART_GetTXThreshold(mxc_uart_regs_t *uart)
326 {
327     return MXC_UART_RevA_GetTXThreshold((mxc_uart_reva_regs_t *)uart);
328 }
329 
MXC_UART_GetFlags(mxc_uart_regs_t * uart)330 unsigned int MXC_UART_GetFlags(mxc_uart_regs_t *uart)
331 {
332     return MXC_UART_RevA_GetFlags((mxc_uart_reva_regs_t *)uart);
333 }
334 
MXC_UART_ClearFlags(mxc_uart_regs_t * uart,unsigned int flags)335 int MXC_UART_ClearFlags(mxc_uart_regs_t *uart, unsigned int flags)
336 {
337     return MXC_UART_RevA_ClearFlags((mxc_uart_reva_regs_t *)uart, flags);
338 }
339 
MXC_UART_EnableInt(mxc_uart_regs_t * uart,unsigned int mask)340 int MXC_UART_EnableInt(mxc_uart_regs_t *uart, unsigned int mask)
341 {
342     return MXC_UART_RevA_EnableInt((mxc_uart_reva_regs_t *)uart, mask);
343 }
344 
MXC_UART_DisableInt(mxc_uart_regs_t * uart,unsigned int mask)345 int MXC_UART_DisableInt(mxc_uart_regs_t *uart, unsigned int mask)
346 {
347     return MXC_UART_RevA_DisableInt((mxc_uart_reva_regs_t *)uart, mask);
348 }
349 
MXC_UART_GetStatus(mxc_uart_regs_t * uart)350 unsigned int MXC_UART_GetStatus(mxc_uart_regs_t *uart)
351 {
352     return MXC_UART_RevA_GetStatus((mxc_uart_reva_regs_t *)uart);
353 }
354 
MXC_UART_Busy(mxc_uart_regs_t * uart)355 int MXC_UART_Busy(mxc_uart_regs_t *uart)
356 {
357     return MXC_UART_RevA_Busy((mxc_uart_reva_regs_t *)uart);
358 }
359 
MXC_UART_Transaction(mxc_uart_req_t * req)360 int MXC_UART_Transaction(mxc_uart_req_t *req)
361 {
362     return MXC_UART_RevA_Transaction((mxc_uart_reva_req_t *)req);
363 }
364 
MXC_UART_TransactionAsync(mxc_uart_req_t * req)365 int MXC_UART_TransactionAsync(mxc_uart_req_t *req)
366 {
367     return MXC_UART_RevA_TransactionAsync((mxc_uart_reva_req_t *)req);
368 }
369 
MXC_UART_TransactionDMA(mxc_uart_req_t * req)370 int MXC_UART_TransactionDMA(mxc_uart_req_t *req)
371 {
372     return MXC_UART_RevA_TransactionDMA((mxc_uart_reva_req_t *)req, MXC_DMA);
373 }
374 
MXC_UART_AbortAsync(mxc_uart_regs_t * uart)375 int MXC_UART_AbortAsync(mxc_uart_regs_t *uart)
376 {
377     return MXC_UART_RevA_AbortAsync((mxc_uart_reva_regs_t *)uart);
378 }
379 
MXC_UART_TxAbortAsync(mxc_uart_regs_t * uart)380 int MXC_UART_TxAbortAsync(mxc_uart_regs_t *uart)
381 {
382     return MXC_UART_RevA_TxAbortAsync((mxc_uart_reva_regs_t *)uart);
383 }
384 
MXC_UART_RxAbortAsync(mxc_uart_regs_t * uart)385 int MXC_UART_RxAbortAsync(mxc_uart_regs_t *uart)
386 {
387     return MXC_UART_RevA_RxAbortAsync((mxc_uart_reva_regs_t *)uart);
388 }
389 
MXC_UART_AsyncHandler(mxc_uart_regs_t * uart)390 int MXC_UART_AsyncHandler(mxc_uart_regs_t *uart)
391 {
392     return MXC_UART_RevA_AsyncHandler((mxc_uart_reva_regs_t *)uart);
393 }
394 
MXC_UART_GetAsyncTXCount(mxc_uart_req_t * req)395 uint32_t MXC_UART_GetAsyncTXCount(mxc_uart_req_t *req)
396 {
397     return req->txCnt;
398 }
399 
MXC_UART_GetAsyncRXCount(mxc_uart_req_t * req)400 uint32_t MXC_UART_GetAsyncRXCount(mxc_uart_req_t *req)
401 {
402     return req->rxCnt;
403 }
404 
MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t * uart,bool enable)405 int MXC_UART_SetAutoDMAHandlers(mxc_uart_regs_t *uart, bool enable)
406 {
407     return MXC_UART_RevA_SetAutoDMAHandlers((mxc_uart_reva_regs_t *)uart, enable);
408 }
MXC_UART_SetTXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)409 int MXC_UART_SetTXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
410 {
411     return MXC_UART_RevA_SetTXDMAChannel((mxc_uart_reva_regs_t *)uart, channel);
412 }
MXC_UART_GetTXDMAChannel(mxc_uart_regs_t * uart)413 int MXC_UART_GetTXDMAChannel(mxc_uart_regs_t *uart)
414 {
415     return MXC_UART_RevA_GetTXDMAChannel((mxc_uart_reva_regs_t *)uart);
416 }
MXC_UART_SetRXDMAChannel(mxc_uart_regs_t * uart,unsigned int channel)417 int MXC_UART_SetRXDMAChannel(mxc_uart_regs_t *uart, unsigned int channel)
418 {
419     return MXC_UART_RevA_SetRXDMAChannel((mxc_uart_reva_regs_t *)uart, channel);
420 }
MXC_UART_GetRXDMAChannel(mxc_uart_regs_t * uart)421 int MXC_UART_GetRXDMAChannel(mxc_uart_regs_t *uart)
422 {
423     return MXC_UART_RevA_GetRXDMAChannel((mxc_uart_reva_regs_t *)uart);
424 }
425