1 /******************************************************************************
2  *
3  * Copyright (C) 2023-2025 Analog Devices, Inc.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  ******************************************************************************/
18 
19 #ifndef LIBRARIES_ZEPHYR_MAX_INCLUDE_WRAP_MAX32_UART_H_
20 #define LIBRARIES_ZEPHYR_MAX_INCLUDE_WRAP_MAX32_UART_H_
21 
22 /***** Includes *****/
23 #include <uart.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 #if defined(CONFIG_SOC_MAX32665) || defined(CONFIG_SOC_MAX32666) || \
30     defined(CONFIG_SOC_MAX32650) || defined(CONFIG_SOC_MAX32660)
31 #if !defined(CONFIG_SOC_MAX32650) && !defined(CONFIG_SOC_MAX32660)
32 // status flags
33 #define ADI_MAX32_UART_RX_EMPTY MXC_F_UART_STATUS_RX_EMPTY
34 #define ADI_MAX32_UART_TX_EMPTY MXC_F_UART_STATUS_TX_EMPTY
35 #define ADI_MAX32_UART_STATUS_TX_FULL MXC_F_UART_STATUS_TX_FULL
36 // error flags
37 #define ADI_MAX32_UART_ERROR_OVERRUN MXC_F_UART_INT_FL_RX_OVERRUN
38 #define ADI_MAX32_UART_ERROR_PARITY MXC_F_UART_INT_FL_RX_PARITY_ERROR
39 #define ADI_MAX32_UART_ERROR_FRAMING MXC_F_UART_INT_FL_RX_FRAME_ERROR
40 #else
41 // status flags
42 #define ADI_MAX32_UART_RX_EMPTY MXC_F_UART_STAT_RX_EMPTY
43 #define ADI_MAX32_UART_TX_EMPTY MXC_F_UART_STAT_TX_EMPTY
44 #define ADI_MAX32_UART_STATUS_TX_FULL MXC_F_UART_STAT_TX_FULL
45 // error flags
46 #define ADI_MAX32_UART_ERROR_OVERRUN MXC_F_UART_INT_FL_RX_OVR
47 #define ADI_MAX32_UART_ERROR_PARITY MXC_F_UART_INT_FL_PARITY
48 #define ADI_MAX32_UART_ERROR_FRAMING MXC_F_UART_INT_FL_FRAME
49 #endif
50 // interrupt flag
51 #define ADI_MAX32_UART_INT_EOT MXC_F_UART_INT_EN_LAST_BREAK // End Of Transmission Interrupt
52 #define ADI_MAX32_UART_INT_OE MXC_F_UART_INT_EN_RX_OVERRUN // Overrun Error Interrupt
53 #define ADI_MAX32_UART_INT_BE MXC_F_UART_INT_EN_BREAK // Break Error Interrupt
54 #define ADI_MAX32_UART_INT_PE MXC_F_UART_INT_EN_RX_PARITY_ERROR // Parity Error Interrupt
55 #define ADI_MAX32_UART_INT_FE MXC_F_UART_INT_EN_RX_FRAME_ERROR // Framing Error Interrupt
56 #if !defined(CONFIG_SOC_MAX32650) && !defined(CONFIG_SOC_MAX32660)
57 #define ADI_MAX32_UART_INT_RT MXC_F_UART_INT_EN_RX_TIMEOUT // Receive Timeout Interrupt
58 #define ADI_MAX32_UART_INT_TX MXC_F_UART_INT_EN_TX_FIFO_THRESH // Transmit Interrupt
59 #define ADI_MAX32_UART_INT_RX MXC_F_UART_INT_EN_RX_FIFO_THRESH // Receive Interrupt
60 #define ADI_MAX32_UART_INT_CTS MXC_F_UART_INT_EN_CTS_CHANGE // CTS Modem Interrupt
61 #define ADI_MAX32_UART_INT_TX_OEM \
62     MXC_F_UART_INT_EN_TX_FIFO_ALMOST_EMPTY // TX FIFO Almost Empty Interrupt
63 #else
64 #define ADI_MAX32_UART_INT_RT MXC_F_UART_INT_EN_RX_TO // Receive Timeout Interrupt
65 #define ADI_MAX32_UART_INT_TX MXC_F_UART_INT_EN_TX_FIFO_LVL // Transmit Interrupt
66 #define ADI_MAX32_UART_INT_RX MXC_F_UART_INT_EN_RX_FIFO_LVL // Receive Interrupt
67 #define ADI_MAX32_UART_INT_CTS MXC_F_UART_INT_EN_CTS // CTS Modem Interrupt
68 #define ADI_MAX32_UART_INT_TX_OEM MXC_F_UART_INT_EN_TX_FIFO_AE // TX FIFO Almost Empty Interrupt
69 #endif
70 // parity
71 #define ADI_MAX32_UART_CFG_PARITY_NONE MXC_UART_PARITY_DISABLE
72 #define ADI_MAX32_UART_CFG_PARITY_ODD MXC_UART_PARITY_ODD
73 #define ADI_MAX32_UART_CFG_PARITY_EVEN MXC_UART_PARITY_EVEN
74 #define ADI_MAX32_UART_CFG_PARITY_MARK MXC_UART_PARITY_MARK
75 #define ADI_MAX32_UART_CFG_PARITY_SPACE MXC_UART_PARITY_SPACE
76 
77 /* Error interrupts */
78 #define ADI_MAX32_UART_ERROR_INTERRUPTS \
79     (ADI_MAX32_UART_INT_OE | ADI_MAX32_UART_INT_PE | ADI_MAX32_UART_INT_FE)
80 
Wrap_MXC_UART_Init(mxc_uart_regs_t * uart)81 static inline int Wrap_MXC_UART_Init(mxc_uart_regs_t *uart)
82 {
83     int ret;
84 
85     ret = MXC_UART_SetRXThreshold(uart, 1);
86     if (ret) {
87         return ret;
88     }
89 
90     // default values as per of MSDK
91     ret = MXC_UART_SetTXThreshold(uart, 2);
92     if (ret) {
93         return ret;
94     }
95 
96 #if defined(CONFIG_SOC_MAX32650) || defined(CONFIG_SOC_MAX32660)
97     uart->ctrl0 |= MXC_F_UART_CTRL0_ENABLE;
98 #else
99     uart->ctrl |= MXC_F_UART_CTRL_ENABLE;
100 #endif
101 
102     return ret;
103 }
104 
Wrap_MXC_UART_SetFrequency(mxc_uart_regs_t * uart,unsigned int baud,int clock_source)105 static inline int Wrap_MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud,
106                                              int clock_source)
107 {
108     (void)clock_source;
109     return MXC_UART_SetFrequency(uart, baud);
110 }
111 
Wrap_MXC_UART_SetTxDMALevel(mxc_uart_regs_t * uart,uint8_t bytes)112 static inline void Wrap_MXC_UART_SetTxDMALevel(mxc_uart_regs_t *uart, uint8_t bytes)
113 {
114     uart->dma |= ((bytes & 0x1F) << MXC_F_UART_DMA_TXDMA_LEVEL_POS);
115 }
116 
Wrap_MXC_UART_SetRxDMALevel(mxc_uart_regs_t * uart,uint8_t bytes)117 static inline void Wrap_MXC_UART_SetRxDMALevel(mxc_uart_regs_t *uart, uint8_t bytes)
118 {
119     uart->dma |= ((bytes & 0x1F) << MXC_F_UART_DMA_RXDMA_LEVEL_POS);
120 }
121 
Wrap_MXC_UART_EnableTxDMA(mxc_uart_regs_t * uart)122 static inline void Wrap_MXC_UART_EnableTxDMA(mxc_uart_regs_t *uart)
123 {
124     uart->dma |= MXC_F_UART_DMA_TXDMA_EN;
125 }
126 
Wrap_MXC_UART_EnableRxDMA(mxc_uart_regs_t * uart)127 static inline void Wrap_MXC_UART_EnableRxDMA(mxc_uart_regs_t *uart)
128 {
129     uart->dma |= MXC_F_UART_DMA_RXDMA_EN;
130 }
131 
Wrap_MXC_UART_DisableTxDMA(mxc_uart_regs_t * uart)132 static inline void Wrap_MXC_UART_DisableTxDMA(mxc_uart_regs_t *uart)
133 {
134     uart->dma &= ~MXC_F_UART_DMA_TXDMA_EN;
135 }
136 
Wrap_MXC_UART_DisableRxDMA(mxc_uart_regs_t * uart)137 static inline void Wrap_MXC_UART_DisableRxDMA(mxc_uart_regs_t *uart)
138 {
139     uart->dma &= ~MXC_F_UART_DMA_RXDMA_EN;
140 }
141 
142 /*
143  *  MAX32690, MAX32655 related mapping
144  */
145 #elif defined(CONFIG_SOC_MAX32690) || defined(CONFIG_SOC_MAX32655) || \
146     defined(CONFIG_SOC_MAX32670) || defined(CONFIG_SOC_MAX32672) ||   \
147     defined(CONFIG_SOC_MAX32662) || defined(CONFIG_SOC_MAX32675) ||   \
148     defined(CONFIG_SOC_MAX32680) || defined(CONFIG_SOC_MAX78002) ||   \
149     defined(CONFIG_SOC_MAX78000)
150 
151 // status flags
152 #define ADI_MAX32_UART_RX_EMPTY MXC_F_UART_STATUS_RX_EM
153 #define ADI_MAX32_UART_TX_EMPTY MXC_F_UART_STATUS_TX_EM
154 #define ADI_MAX32_UART_STATUS_TX_FULL MXC_F_UART_STATUS_TX_FULL
155 
156 #if defined(CONFIG_SOC_MAX32662)
157 // error flags
158 #define ADI_MAX32_UART_ERROR_OVERRUN MXC_F_UART_INTFL_RX_OV
159 #define ADI_MAX32_UART_ERROR_PARITY MXC_F_UART_INTFL_RX_PAR
160 #define ADI_MAX32_UART_ERROR_FRAMING MXC_F_UART_INTFL_RX_FERR
161 // interrupt flag
162 #define ADI_MAX32_UART_INT_OE MXC_F_UART_INTEN_RX_OV // Overrun Error Interrupt
163 #define ADI_MAX32_UART_INT_PE MXC_F_UART_INTEN_RX_PAR // Parity Error Interrupt
164 #define ADI_MAX32_UART_INT_FE MXC_F_UART_INTEN_RX_FERR // Framing Error Interrupt
165 #define ADI_MAX32_UART_INT_TX MXC_F_UART_INTEN_TX_HE // Transmit Interrupt
166 #define ADI_MAX32_UART_INT_RX MXC_F_UART_INTEN_RX_THD // Receive Interrupt
167 #define ADI_MAX32_UART_INT_CTS MXC_F_UART_INTEN_CTS_EV // CTS Modem Interrupt
168 #define ADI_MAX32_UART_INT_TX_OEM MXC_F_UART_INTEN_TX_OB // TX FIFO Almost Empty Interrupt
169 #else
170 // error flags
171 #define ADI_MAX32_UART_ERROR_OVERRUN MXC_F_UART_INT_FL_RX_OV
172 #define ADI_MAX32_UART_ERROR_PARITY MXC_F_UART_INT_FL_RX_PAR
173 #define ADI_MAX32_UART_ERROR_FRAMING MXC_F_UART_INT_FL_RX_FERR
174 // interrupt flag
175 #define ADI_MAX32_UART_INT_OE MXC_F_UART_INT_EN_RX_OV // Overrun Error Interrupt
176 #define ADI_MAX32_UART_INT_PE MXC_F_UART_INT_EN_RX_PAR // Parity Error Interrupt
177 #define ADI_MAX32_UART_INT_FE MXC_F_UART_INT_EN_RX_FERR // Framing Error Interrupt
178 #define ADI_MAX32_UART_INT_TX MXC_F_UART_INT_EN_TX_HE // Transmit Interrupt
179 #define ADI_MAX32_UART_INT_RX MXC_F_UART_INT_EN_RX_THD // Receive Interrupt
180 #define ADI_MAX32_UART_INT_CTS MXC_F_UART_INT_EN_CTS_EV // CTS Modem Interrupt
181 #define ADI_MAX32_UART_INT_TX_OEM MXC_F_UART_INT_EN_TX_OB // TX FIFO Almost Empty Interrupt
182 #endif
183 //#define ADI_MAX32_UART_INT_RT   // Receive Timeout Interrupt
184 //#define ADI_MAX32_UART_INT_BE   // Break Error Interrupt
185 //#define ADI_MAX32_UART_INT_EOT  // End Of Transmission Interrupt
186 
187 // parity
188 #define ADI_MAX32_UART_CFG_PARITY_NONE MXC_UART_PARITY_DISABLE
189 #define ADI_MAX32_UART_CFG_PARITY_ODD MXC_UART_PARITY_ODD_0
190 #define ADI_MAX32_UART_CFG_PARITY_EVEN MXC_UART_PARITY_EVEN_0
191 //#define ADI_MAX32_UART_CFG_PARITY_MARK
192 //#define ADI_MAX32_UART_CFG_PARITY_SPACE
193 
194 /* Error interrupts */
195 #define ADI_MAX32_UART_ERROR_INTERRUPTS \
196     (ADI_MAX32_UART_INT_OE | ADI_MAX32_UART_INT_PE | ADI_MAX32_UART_INT_FE)
197 
198 static inline int Wrap_MXC_UART_Init(mxc_uart_regs_t *uart)
199 {
200     int ret;
201 
202     ret = MXC_UART_SetRXThreshold(uart, 1);
203 
204     return ret;
205 }
206 
207 static inline int Wrap_MXC_UART_SetFrequency(mxc_uart_regs_t *uart, unsigned int baud,
208                                              int clock_source)
209 {
210     return MXC_UART_SetFrequency(uart, baud, (mxc_uart_clock_t)clock_source);
211 }
212 
213 static inline void Wrap_MXC_UART_SetTxDMALevel(mxc_uart_regs_t *uart, uint8_t bytes)
214 {
215     uart->dma |= ((bytes & 0xF) << MXC_F_UART_DMA_TX_THD_VAL_POS);
216 }
217 
218 static inline void Wrap_MXC_UART_SetRxDMALevel(mxc_uart_regs_t *uart, uint8_t bytes)
219 {
220     uart->dma |= ((bytes & 0xF) << MXC_F_UART_DMA_RX_THD_VAL_POS);
221 }
222 
223 static inline void Wrap_MXC_UART_EnableTxDMA(mxc_uart_regs_t *uart)
224 {
225     uart->dma |= MXC_F_UART_DMA_TX_EN;
226 }
227 
228 static inline void Wrap_MXC_UART_EnableRxDMA(mxc_uart_regs_t *uart)
229 {
230     uart->dma |= MXC_F_UART_DMA_RX_EN;
231 }
232 
233 static inline void Wrap_MXC_UART_DisableTxDMA(mxc_uart_regs_t *uart)
234 {
235     uart->dma &= ~MXC_F_UART_DMA_TX_EN;
236 }
237 
238 static inline void Wrap_MXC_UART_DisableRxDMA(mxc_uart_regs_t *uart)
239 {
240     uart->dma &= ~MXC_F_UART_DMA_RX_EN;
241 }
242 
243 #endif // defined(CONFIG_SOC_MAX32690) || (CONFIG_SOC_MAX32655)
244 
Wrap_MXC_UART_GetRegINTEN(mxc_uart_regs_t * uart)245 static inline unsigned int Wrap_MXC_UART_GetRegINTEN(mxc_uart_regs_t *uart)
246 {
247 #if defined(CONFIG_SOC_MAX32662)
248     return uart->inten;
249 #else
250     return uart->int_en;
251 #endif
252 }
253 
254 #ifdef __cplusplus
255 }
256 #endif
257 
258 #endif // LIBRARIES_ZEPHYR_MAX_INCLUDE_WRAP_MAX32_UART_H_
259