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