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_I2C_H_
20 #define LIBRARIES_ZEPHYR_MAX_INCLUDE_WRAP_MAX32_I2C_H_
21 
22 /***** Includes *****/
23 #include <i2c.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 /*
30  *  MAX32665, MAX32666 related mapping
31  */
32 #if defined(CONFIG_SOC_MAX32665) || (CONFIG_SOC_MAX32666)
33 
34 /*
35  *  Control register bits
36  */
37 #define ADI_MAX32_I2C_CTRL_MASTER MXC_F_I2C_CTRL_MST
38 
39 /*
40  *  Interrupt enable bits
41  */
42 #define ADI_MAX32_I2C_INT_EN0_RX_THD MXC_F_I2C_INT_EN0_RX_THRESH
43 #define ADI_MAX32_I2C_INT_EN0_TX_LOCK_OUT MXC_F_I2C_INT_EN0_TX_LOCK_OUT
44 #define ADI_MAX32_I2C_INT_EN0_TX_THD MXC_F_I2C_INT_EN0_TX_THRESH
45 #define ADI_MAX32_I2C_INT_EN0_DONE MXC_F_I2C_INT_EN0_DONE
46 #define ADI_MAX32_I2C_INT_EN0_STOP MXC_F_I2C_INT_EN0_STOP
47 #define ADI_MAX32_I2C_INT_EN0_ADDR_MATCH MXC_F_I2C_INT_EN0_ADDR_MATCH
48 #define ADI_MAX32_I2C_INT_EN0_ADDR_ACK MXC_F_I2C_INT_EN0_ADDR_ACK
49 #define ADI_MAX32_I2C_INT_EN1_RX_OVERFLOW MXC_F_I2C_INT_EN1_RX_OVERFLOW
50 #define ADI_MAX32_I2C_INT_EN1_TX_UNDERFLOW MXC_F_I2C_INT_EN1_TX_UNDERFLOW
51 
52 #define ADI_MAX32_I2C_INT_EN0_ERR                                                                \
53     (MXC_F_I2C_INT_EN0_ARB_ER | MXC_F_I2C_INT_EN0_TO_ER | MXC_F_I2C_INT_EN0_ADDR_NACK_ER |       \
54      MXC_F_I2C_INT_EN0_DATA_ER | MXC_F_I2C_INT_EN0_DO_NOT_RESP_ER | MXC_F_I2C_INT_EN0_START_ER | \
55      MXC_F_I2C_INT_EN0_STOP_ER)
56 
57 /*
58  *  Interrupt flags
59  */
60 #define ADI_MAX32_I2C_INT_FL0_RX_THD MXC_F_I2C_INT_FL0_RX_THRESH
61 #define ADI_MAX32_I2C_INT_FL0_TX_LOCK_OUT MXC_F_I2C_INT_FL0_TX_LOCK_OUT
62 #define ADI_MAX32_I2C_INT_FL0_TX_THD MXC_F_I2C_INT_FL0_TX_THRESH
63 #define ADI_MAX32_I2C_INT_FL0_ADDR_MATCH MXC_F_I2C_INT_FL0_ADDR_MATCH
64 #define ADI_MAX32_I2C_INT_FL0_ADDR_ACK MXC_F_I2C_INT_FL0_ADDR_ACK
65 #define ADI_MAX32_I2C_INT_FL0_STOP MXC_F_I2C_INT_FL0_STOP
66 #define ADI_MAX32_I2C_INT_FL0_DONE MXC_F_I2C_INT_FL0_DONE
67 #define ADI_MAX32_I2C_INT_FL1_RX_OVERFLOW MXC_F_I2C_INT_FL1_RX_OVERFLOW
68 
69 #define ADI_MAX32_I2C_INT_FL0_ERR                                                                \
70     (MXC_F_I2C_INT_FL0_ARB_ER | MXC_F_I2C_INT_FL0_TO_ER | MXC_F_I2C_INT_FL0_ADDR_NACK_ER |       \
71      MXC_F_I2C_INT_FL0_DATA_ER | MXC_F_I2C_INT_FL0_DO_NOT_RESP_ER | MXC_F_I2C_INT_FL0_START_ER | \
72      MXC_F_I2C_INT_FL0_STOP_ER)
73 
74 /*
75  *  DMA enable bits
76  */
77 #define ADI_MAX32_I2C_DMA_RX_EN MXC_F_I2C_DMA_RXEN
78 #define ADI_MAX32_I2C_DMA_TX_EN MXC_F_I2C_DMA_TXEN
79 
Wrap_MXC_I2C_GetIntEn(mxc_i2c_regs_t * i2c,unsigned int * int_en0,unsigned int * int_en1)80 static inline void Wrap_MXC_I2C_GetIntEn(mxc_i2c_regs_t *i2c, unsigned int *int_en0,
81                                          unsigned int *int_en1)
82 {
83     *int_en0 = i2c->int_en0;
84     *int_en1 = i2c->int_en1;
85 }
86 
Wrap_MXC_I2C_SetIntEn(mxc_i2c_regs_t * i2c,unsigned int int_en0,unsigned int int_en1)87 static inline void Wrap_MXC_I2C_SetIntEn(mxc_i2c_regs_t *i2c, unsigned int int_en0,
88                                          unsigned int int_en1)
89 {
90     i2c->int_en0 = int_en0;
91     i2c->int_en1 = int_en1;
92 }
93 
Wrap_MXC_I2C_GetTxFIFOLevel(mxc_i2c_regs_t * i2c)94 static inline uint32_t Wrap_MXC_I2C_GetTxFIFOLevel(mxc_i2c_regs_t *i2c)
95 {
96     return (i2c->tx_ctrl1 & MXC_F_I2C_TX_CTRL1_TXFIFO) >> MXC_F_I2C_TX_CTRL1_TXFIFO_POS;
97 }
98 
Wrap_MXC_I2C_SetRxCount(mxc_i2c_regs_t * i2c,unsigned int len)99 static inline void Wrap_MXC_I2C_SetRxCount(mxc_i2c_regs_t *i2c, unsigned int len)
100 {
101     if (len < 256) {
102         i2c->rx_ctrl1 = len;
103     } else {
104         i2c->rx_ctrl1 = 0;
105     }
106 }
107 
Wrap_MXC_I2C_WaitForRestart(mxc_i2c_regs_t * i2c)108 static inline void Wrap_MXC_I2C_WaitForRestart(mxc_i2c_regs_t *i2c)
109 {
110     while (i2c->master_ctrl & MXC_F_I2C_MASTER_CTRL_RESTART) {}
111 }
112 
Wrap_MXC_I2C_Start(mxc_i2c_regs_t * i2c)113 static inline void Wrap_MXC_I2C_Start(mxc_i2c_regs_t *i2c)
114 {
115     i2c->master_ctrl |= MXC_F_I2C_MASTER_CTRL_START;
116 }
117 
Wrap_MXC_I2C_Restart(mxc_i2c_regs_t * i2c)118 static inline void Wrap_MXC_I2C_Restart(mxc_i2c_regs_t *i2c)
119 {
120     i2c->master_ctrl |= MXC_F_I2C_MASTER_CTRL_RESTART;
121 }
122 
Wrap_MXC_I2C_Stop(mxc_i2c_regs_t * i2c)123 static inline void Wrap_MXC_I2C_Stop(mxc_i2c_regs_t *i2c)
124 {
125     i2c->master_ctrl |= MXC_F_I2C_MASTER_CTRL_STOP;
126 }
127 
128 /*
129  *  MAX32690, MAX32655 related mapping
130  */
131 #elif defined(CONFIG_SOC_MAX32690) || defined(CONFIG_SOC_MAX32655) || \
132     defined(CONFIG_SOC_MAX32670) || defined(CONFIG_SOC_MAX32672) ||   \
133     defined(CONFIG_SOC_MAX32662) || defined(CONFIG_SOC_MAX32675) ||   \
134     defined(CONFIG_SOC_MAX32680) || defined(CONFIG_SOC_MAX78002) ||   \
135     defined(CONFIG_SOC_MAX78000)
136 
137 /*
138  *  Control register bits
139  */
140 #define ADI_MAX32_I2C_CTRL_MASTER MXC_F_I2C_CTRL_MST_MODE
141 
142 /*
143  *  Interrupt enable bits
144  */
145 #define ADI_MAX32_I2C_INT_EN0_RX_THD MXC_F_I2C_INTEN0_RX_THD
146 #define ADI_MAX32_I2C_INT_EN0_TX_LOCK_OUT MXC_F_I2C_INTEN0_TX_LOCKOUT
147 #define ADI_MAX32_I2C_INT_EN0_TX_THD MXC_F_I2C_INTEN0_TX_THD
148 #define ADI_MAX32_I2C_INT_EN0_DONE MXC_F_I2C_INTEN0_DONE
149 #define ADI_MAX32_I2C_INT_EN0_STOP MXC_F_I2C_INTEN0_STOP
150 #define ADI_MAX32_I2C_INT_EN0_ADDR_MATCH MXC_F_I2C_INTEN0_ADDR_MATCH
151 #define ADI_MAX32_I2C_INT_EN0_ADDR_ACK MXC_F_I2C_INTEN0_ADDR_ACK
152 #define ADI_MAX32_I2C_INT_EN1_RX_OVERFLOW MXC_F_I2C_INTEN1_RX_OV
153 #define ADI_MAX32_I2C_INT_EN1_TX_UNDERFLOW MXC_F_I2C_INTEN1_TX_UN
154 
155 #define ADI_MAX32_I2C_INT_EN0_ERR                                                          \
156     (MXC_F_I2C_INTEN0_ARB_ERR | MXC_F_I2C_INTEN0_TO_ERR | MXC_F_I2C_INTEN0_ADDR_NACK_ERR | \
157      MXC_F_I2C_INTEN0_DATA_ERR | MXC_F_I2C_INTEN0_DNR_ERR | MXC_F_I2C_INTEN0_START_ERR |   \
158      MXC_F_I2C_INTEN0_STOP_ERR)
159 
160 /*
161  *  Interrupt flags
162  */
163 #define ADI_MAX32_I2C_INT_FL0_RX_THD MXC_F_I2C_INTFL0_RX_THD
164 #define ADI_MAX32_I2C_INT_FL0_TX_LOCK_OUT MXC_F_I2C_INTFL0_TX_LOCKOUT
165 #define ADI_MAX32_I2C_INT_FL0_TX_THD MXC_F_I2C_INTFL0_TX_THD
166 #define ADI_MAX32_I2C_INT_FL0_ADDR_MATCH MXC_F_I2C_INTFL0_ADDR_MATCH
167 #define ADI_MAX32_I2C_INT_FL0_ADDR_ACK MXC_F_I2C_INTFL0_ADDR_ACK
168 #define ADI_MAX32_I2C_INT_FL0_STOP MXC_F_I2C_INTFL0_STOP
169 #define ADI_MAX32_I2C_INT_FL0_DONE MXC_F_I2C_INTFL0_DONE
170 #define ADI_MAX32_I2C_INT_FL1_RX_OVERFLOW MXC_F_I2C_INTFL1_RX_OV
171 
172 #define ADI_MAX32_I2C_INT_FL0_ERR                                                          \
173     (MXC_F_I2C_INTFL0_ARB_ERR | MXC_F_I2C_INTFL0_TO_ERR | MXC_F_I2C_INTFL0_ADDR_NACK_ERR | \
174      MXC_F_I2C_INTFL0_DATA_ERR | MXC_F_I2C_INTFL0_DNR_ERR | MXC_F_I2C_INTFL0_START_ERR |   \
175      MXC_F_I2C_INTFL0_STOP_ERR)
176 
177 /*
178  *  DMA enable bits
179  */
180 #define ADI_MAX32_I2C_DMA_RX_EN MXC_F_I2C_DMA_RX_EN
181 #define ADI_MAX32_I2C_DMA_TX_EN MXC_F_I2C_DMA_TX_EN
182 
183 static inline void Wrap_MXC_I2C_GetIntEn(mxc_i2c_regs_t *i2c, unsigned int *int_en0,
184                                          unsigned int *int_en1)
185 {
186     *int_en0 = i2c->inten0;
187     *int_en1 = i2c->inten1;
188 }
189 
190 static inline void Wrap_MXC_I2C_SetIntEn(mxc_i2c_regs_t *i2c, unsigned int int_en0,
191                                          unsigned int int_en1)
192 {
193     i2c->inten0 = int_en0;
194     i2c->inten1 = int_en1;
195 }
196 
197 static inline uint32_t Wrap_MXC_I2C_GetTxFIFOLevel(mxc_i2c_regs_t *i2c)
198 {
199     return (i2c->txctrl1 & MXC_F_I2C_TXCTRL1_LVL) >> MXC_F_I2C_TXCTRL1_LVL_POS;
200 }
201 
202 static inline void Wrap_MXC_I2C_SetRxCount(mxc_i2c_regs_t *i2c, unsigned int len)
203 {
204     if (len < 256) {
205         i2c->rxctrl1 = len;
206     } else {
207         i2c->rxctrl1 = 0;
208     }
209 }
210 
211 static inline void Wrap_MXC_I2C_WaitForRestart(mxc_i2c_regs_t *i2c)
212 {
213     while (i2c->mstctrl & MXC_F_I2C_MSTCTRL_RESTART) {}
214 }
215 
216 static inline void Wrap_MXC_I2C_Start(mxc_i2c_regs_t *i2c)
217 {
218     i2c->mstctrl |= MXC_F_I2C_MSTCTRL_START;
219 }
220 
221 static inline void Wrap_MXC_I2C_Restart(mxc_i2c_regs_t *i2c)
222 {
223     i2c->mstctrl |= MXC_F_I2C_MSTCTRL_RESTART;
224 }
225 
226 static inline void Wrap_MXC_I2C_Stop(mxc_i2c_regs_t *i2c)
227 {
228     i2c->mstctrl |= MXC_F_I2C_MSTCTRL_STOP;
229 }
230 
231 #endif
232 
233 #ifdef __cplusplus
234 }
235 #endif
236 
237 #endif // LIBRARIES_ZEPHYR_MAX_INCLUDE_WRAP_MAX32_I2C_H_
238