1 /*
2  * Copyright 2018 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_common.h"
10 #include "fsl_lpi2c.h"
11 
12 #include "fsl_adapter_i2c.h"
13 
14 /*******************************************************************************
15  * Definitions
16  ******************************************************************************/
17 
18 /*! @brief i2c master state structure. */
19 typedef struct _hal_i2c_master
20 {
21     hal_i2c_master_transfer_callback_t callback;
22     void *callbackParam;
23     lpi2c_master_handle_t hardwareHandle;
24     uint8_t instance;
25 } hal_i2c_master_t;
26 
27 /*! @brief i2c slave state structure. */
28 typedef struct _hal_i2c_slave
29 {
30     hal_i2c_slave_transfer_callback_t callback;
31     void *callbackParam;
32     hal_i2c_slave_transfer_t transfer;
33     lpi2c_slave_handle_t hardwareHandle;
34     uint8_t instance;
35 } hal_i2c_slave_t;
36 
37 /*******************************************************************************
38  * Prototypes
39  ******************************************************************************/
40 
41 /*******************************************************************************
42  * Variables
43  ******************************************************************************/
44 
45 /*! @brief Pointers to i2c bases for each instance. */
46 static LPI2C_Type *const s_i2cBases[] = LPI2C_BASE_PTRS;
47 
48 /*******************************************************************************
49  * Code
50  ******************************************************************************/
51 
HAL_I2cGetStatus(status_t status)52 static hal_i2c_status_t HAL_I2cGetStatus(status_t status)
53 {
54     hal_i2c_status_t returnStatus;
55     switch (status)
56     {
57         case kStatus_Success:
58         {
59             returnStatus = kStatus_HAL_I2cSuccess;
60             break;
61         }
62         case kStatus_LPI2C_Busy:
63         {
64             returnStatus = kStatus_HAL_I2cBusy;
65             break;
66         }
67         case kStatus_LPI2C_Idle:
68         {
69             returnStatus = kStatus_HAL_I2cIdle;
70             break;
71         }
72         case kStatus_LPI2C_Nak:
73         {
74             returnStatus = kStatus_HAL_I2cNak;
75             break;
76         }
77         case kStatus_LPI2C_ArbitrationLost:
78         {
79             returnStatus = kStatus_HAL_I2cArbitrationLost;
80             break;
81         }
82         case kStatus_LPI2C_Timeout:
83         {
84             returnStatus = kStatus_HAL_I2cTimeout;
85             break;
86         }
87         default:
88         {
89             returnStatus = kStatus_HAL_I2cError;
90             break;
91         }
92     }
93     return returnStatus;
94 }
95 
HAL_I2cMasterCallback(LPI2C_Type * lpi2cBase,lpi2c_master_handle_t * handle,status_t status,void * callbackParam)96 static void HAL_I2cMasterCallback(LPI2C_Type *lpi2cBase,
97                                   lpi2c_master_handle_t *handle,
98                                   status_t status,
99                                   void *callbackParam)
100 {
101     hal_i2c_master_t *i2cMasterHandle;
102     assert(NULL != callbackParam);
103 
104     i2cMasterHandle = (hal_i2c_master_t *)callbackParam;
105 
106     if (NULL != i2cMasterHandle->callback)
107     {
108         i2cMasterHandle->callback(i2cMasterHandle, HAL_I2cGetStatus(status), i2cMasterHandle->callbackParam);
109     }
110 }
111 
HAL_I2cSlaveCallback(LPI2C_Type * lpi2cBase,lpi2c_slave_transfer_t * xfer,void * callbackParam)112 static void HAL_I2cSlaveCallback(LPI2C_Type *lpi2cBase, lpi2c_slave_transfer_t *xfer, void *callbackParam)
113 {
114     hal_i2c_slave_t *i2cSlaveHandle;
115     assert(NULL != callbackParam);
116 
117     i2cSlaveHandle = (hal_i2c_slave_t *)callbackParam;
118 
119     if (NULL != i2cSlaveHandle->callback)
120     {
121         i2cSlaveHandle->transfer.event            = (hal_i2c_slave_transfer_event_t)xfer->event;
122         i2cSlaveHandle->transfer.data             = xfer->data;
123         i2cSlaveHandle->transfer.dataSize         = xfer->dataSize;
124         i2cSlaveHandle->transfer.completionStatus = HAL_I2cGetStatus(xfer->completionStatus);
125         i2cSlaveHandle->transfer.transferredCount = xfer->transferredCount;
126         i2cSlaveHandle->callback(i2cSlaveHandle, &i2cSlaveHandle->transfer, i2cSlaveHandle->callbackParam);
127         xfer->data     = i2cSlaveHandle->transfer.data;
128         xfer->dataSize = i2cSlaveHandle->transfer.dataSize;
129     }
130 }
131 
HAL_I2cMasterInit(hal_i2c_master_handle_t handle,const hal_i2c_master_config_t * halI2cConfig)132 hal_i2c_status_t HAL_I2cMasterInit(hal_i2c_master_handle_t handle, const hal_i2c_master_config_t *halI2cConfig)
133 {
134     hal_i2c_master_t *i2cMasterHandle;
135     lpi2c_master_config_t i2cConfig;
136 
137     assert(NULL != handle);
138     assert(NULL != halI2cConfig);
139     assert(HAL_I2C_MASTER_HANDLE_SIZE >= sizeof(hal_i2c_master_t));
140 
141     i2cMasterHandle = (hal_i2c_master_t *)handle;
142 
143     LPI2C_MasterGetDefaultConfig(&i2cConfig);
144     i2cConfig.enableMaster    = halI2cConfig->enableMaster;
145     i2cConfig.baudRate_Hz     = halI2cConfig->baudRate_Bps;
146     i2cMasterHandle->instance = halI2cConfig->instance;
147 
148     LPI2C_MasterInit(s_i2cBases[i2cMasterHandle->instance], &i2cConfig, halI2cConfig->srcClock_Hz);
149 
150     return kStatus_HAL_I2cSuccess;
151 }
152 
HAL_I2cSlaveInit(hal_i2c_slave_handle_t handle,const hal_i2c_slave_config_t * halI2cConfig)153 hal_i2c_status_t HAL_I2cSlaveInit(hal_i2c_slave_handle_t handle, const hal_i2c_slave_config_t *halI2cConfig)
154 {
155     hal_i2c_slave_t *i2cSlaveHandle;
156     lpi2c_slave_config_t i2cConfig;
157 
158     assert(NULL != handle);
159     assert(NULL != halI2cConfig);
160     assert(HAL_I2C_SLAVE_HANDLE_SIZE >= sizeof(hal_i2c_slave_t));
161 
162     i2cSlaveHandle = (hal_i2c_slave_t *)handle;
163 
164     LPI2C_SlaveGetDefaultConfig(&i2cConfig);
165     i2cConfig.enableSlave    = halI2cConfig->enableSlave;
166     i2cConfig.address0       = (uint8_t)halI2cConfig->slaveAddress;
167     i2cSlaveHandle->instance = halI2cConfig->instance;
168 
169     LPI2C_SlaveInit(s_i2cBases[i2cSlaveHandle->instance], &i2cConfig, halI2cConfig->srcClock_Hz);
170 
171     return kStatus_HAL_I2cSuccess;
172 }
173 
HAL_I2cMasterDeinit(hal_i2c_master_handle_t handle)174 hal_i2c_status_t HAL_I2cMasterDeinit(hal_i2c_master_handle_t handle)
175 {
176     hal_i2c_master_t *i2cMasterHandle;
177 
178     assert(NULL != handle);
179 
180     i2cMasterHandle = (hal_i2c_master_t *)handle;
181 
182     LPI2C_MasterDeinit(s_i2cBases[i2cMasterHandle->instance]);
183 
184     return kStatus_HAL_I2cSuccess;
185 }
186 
HAL_I2cSlaveDeinit(hal_i2c_slave_handle_t handle)187 hal_i2c_status_t HAL_I2cSlaveDeinit(hal_i2c_slave_handle_t handle)
188 {
189     hal_i2c_slave_t *i2cSlaveHandle;
190 
191     assert(NULL != handle);
192 
193     i2cSlaveHandle = (hal_i2c_slave_t *)handle;
194 
195     LPI2C_SlaveDeinit(s_i2cBases[i2cSlaveHandle->instance]);
196 
197     return kStatus_HAL_I2cSuccess;
198 }
199 
HAL_I2cMasterWriteBlocking(hal_i2c_master_handle_t handle,const uint8_t * txBuff,size_t txSize,uint32_t flags)200 hal_i2c_status_t HAL_I2cMasterWriteBlocking(hal_i2c_master_handle_t handle,
201                                             const uint8_t *txBuff,
202                                             size_t txSize,
203                                             uint32_t flags)
204 {
205     return kStatus_HAL_I2cError;
206 }
207 
HAL_I2cMasterReadBlocking(hal_i2c_master_handle_t handle,uint8_t * rxBuff,size_t rxSize,uint32_t flags)208 hal_i2c_status_t HAL_I2cMasterReadBlocking(hal_i2c_master_handle_t handle,
209                                            uint8_t *rxBuff,
210                                            size_t rxSize,
211                                            uint32_t flags)
212 {
213     return kStatus_HAL_I2cError;
214 }
215 
HAL_I2cSlaveWriteBlocking(hal_i2c_slave_handle_t handle,const uint8_t * txBuff,size_t txSize)216 hal_i2c_status_t HAL_I2cSlaveWriteBlocking(hal_i2c_slave_handle_t handle, const uint8_t *txBuff, size_t txSize)
217 {
218     return kStatus_HAL_I2cError;
219 }
220 
HAL_I2cSlaveReadBlocking(hal_i2c_slave_handle_t handle,uint8_t * rxBuff,size_t rxSize)221 hal_i2c_status_t HAL_I2cSlaveReadBlocking(hal_i2c_slave_handle_t handle, uint8_t *rxBuff, size_t rxSize)
222 {
223     return kStatus_HAL_I2cError;
224 }
225 
HAL_I2cMasterTransferBlocking(hal_i2c_master_handle_t handle,hal_i2c_master_transfer_t * xfer)226 hal_i2c_status_t HAL_I2cMasterTransferBlocking(hal_i2c_master_handle_t handle, hal_i2c_master_transfer_t *xfer)
227 {
228     hal_i2c_master_t *i2cMasterHandle;
229     lpi2c_master_transfer_t transfer;
230 
231     assert(NULL != handle);
232     assert(NULL != xfer);
233 
234     i2cMasterHandle = (hal_i2c_master_t *)handle;
235 
236     transfer.flags          = xfer->flags;
237     transfer.slaveAddress   = xfer->slaveAddress;
238     transfer.direction      = (kHAL_I2cRead == xfer->direction) ? kLPI2C_Read : kLPI2C_Write;
239     transfer.subaddress     = xfer->subaddress;
240     transfer.subaddressSize = xfer->subaddressSize;
241     transfer.data           = xfer->data;
242     transfer.dataSize       = xfer->dataSize;
243 
244     return HAL_I2cGetStatus(LPI2C_MasterTransferBlocking(s_i2cBases[i2cMasterHandle->instance], &transfer));
245 }
246 
HAL_I2cMasterTransferInstallCallback(hal_i2c_master_handle_t handle,hal_i2c_master_transfer_callback_t callback,void * callbackParam)247 hal_i2c_status_t HAL_I2cMasterTransferInstallCallback(hal_i2c_master_handle_t handle,
248                                                       hal_i2c_master_transfer_callback_t callback,
249                                                       void *callbackParam)
250 {
251     hal_i2c_master_t *i2cMasterHandle;
252 
253     assert(NULL != handle);
254 
255     i2cMasterHandle = (hal_i2c_master_t *)handle;
256 
257     i2cMasterHandle->callback      = callback;
258     i2cMasterHandle->callbackParam = callbackParam;
259     LPI2C_MasterTransferCreateHandle(s_i2cBases[i2cMasterHandle->instance], &i2cMasterHandle->hardwareHandle,
260                                      HAL_I2cMasterCallback, i2cMasterHandle);
261 
262     return kStatus_HAL_I2cSuccess;
263 }
264 
HAL_I2cMasterTransferNonBlocking(hal_i2c_master_handle_t handle,hal_i2c_master_transfer_t * xfer)265 hal_i2c_status_t HAL_I2cMasterTransferNonBlocking(hal_i2c_master_handle_t handle, hal_i2c_master_transfer_t *xfer)
266 {
267     hal_i2c_master_t *i2cMasterHandle;
268     lpi2c_master_transfer_t transfer;
269 
270     assert(NULL != handle);
271     assert(NULL != xfer);
272 
273     i2cMasterHandle = (hal_i2c_master_t *)handle;
274 
275     transfer.flags          = xfer->flags;
276     transfer.slaveAddress   = xfer->slaveAddress;
277     transfer.direction      = (kHAL_I2cRead == xfer->direction) ? kLPI2C_Read : kLPI2C_Write;
278     transfer.subaddress     = xfer->subaddress;
279     transfer.subaddressSize = xfer->subaddressSize;
280     transfer.data           = xfer->data;
281     transfer.dataSize       = xfer->dataSize;
282     return HAL_I2cGetStatus(LPI2C_MasterTransferNonBlocking(s_i2cBases[i2cMasterHandle->instance],
283                                                             &i2cMasterHandle->hardwareHandle, &transfer));
284 }
285 
HAL_I2cMasterTransferGetCount(hal_i2c_master_handle_t handle,size_t * count)286 hal_i2c_status_t HAL_I2cMasterTransferGetCount(hal_i2c_master_handle_t handle, size_t *count)
287 {
288     hal_i2c_master_t *i2cMasterHandle;
289 
290     assert(NULL != handle);
291     assert(NULL != count);
292 
293     i2cMasterHandle = (hal_i2c_master_t *)handle;
294     return HAL_I2cGetStatus(
295         LPI2C_MasterTransferGetCount(s_i2cBases[i2cMasterHandle->instance], &i2cMasterHandle->hardwareHandle, count));
296 }
297 
HAL_I2cMasterTransferAbort(hal_i2c_master_handle_t handle)298 hal_i2c_status_t HAL_I2cMasterTransferAbort(hal_i2c_master_handle_t handle)
299 {
300     hal_i2c_master_t *i2cMasterHandle;
301 
302     assert(NULL != handle);
303 
304     i2cMasterHandle = (hal_i2c_master_t *)handle;
305     LPI2C_MasterTransferAbort(s_i2cBases[i2cMasterHandle->instance], &i2cMasterHandle->hardwareHandle);
306 
307     return kStatus_HAL_I2cSuccess;
308 }
309 
HAL_I2cSlaveTransferInstallCallback(hal_i2c_slave_handle_t handle,hal_i2c_slave_transfer_callback_t callback,void * callbackParam)310 hal_i2c_status_t HAL_I2cSlaveTransferInstallCallback(hal_i2c_slave_handle_t handle,
311                                                      hal_i2c_slave_transfer_callback_t callback,
312                                                      void *callbackParam)
313 {
314     hal_i2c_slave_t *i2cSlaveHandle;
315 
316     assert(NULL != handle);
317 
318     i2cSlaveHandle = (hal_i2c_slave_t *)handle;
319 
320     i2cSlaveHandle->callback      = callback;
321     i2cSlaveHandle->callbackParam = callbackParam;
322     LPI2C_SlaveTransferCreateHandle(s_i2cBases[i2cSlaveHandle->instance], &i2cSlaveHandle->hardwareHandle,
323                                     HAL_I2cSlaveCallback, i2cSlaveHandle);
324 
325     return kStatus_HAL_I2cSuccess;
326 }
327 
HAL_I2cSlaveTransferNonBlocking(hal_i2c_slave_handle_t handle,uint32_t eventMask)328 hal_i2c_status_t HAL_I2cSlaveTransferNonBlocking(hal_i2c_slave_handle_t handle, uint32_t eventMask)
329 {
330     hal_i2c_slave_t *i2cSlaveHandle;
331 
332     assert(NULL != handle);
333 
334     i2cSlaveHandle = (hal_i2c_slave_t *)handle;
335 
336     return HAL_I2cGetStatus(LPI2C_SlaveTransferNonBlocking(s_i2cBases[i2cSlaveHandle->instance],
337                                                            &i2cSlaveHandle->hardwareHandle, eventMask));
338 }
339 
HAL_I2cSlaveTransferAbort(hal_i2c_slave_handle_t handle)340 hal_i2c_status_t HAL_I2cSlaveTransferAbort(hal_i2c_slave_handle_t handle)
341 {
342     hal_i2c_slave_t *i2cSlaveHandle;
343 
344     assert(NULL != handle);
345 
346     i2cSlaveHandle = (hal_i2c_slave_t *)handle;
347 
348     LPI2C_SlaveTransferAbort(s_i2cBases[i2cSlaveHandle->instance], &i2cSlaveHandle->hardwareHandle);
349 
350     return kStatus_HAL_I2cSuccess;
351 }
352 
HAL_I2cSlaveTransferGetCount(hal_i2c_slave_handle_t handle,size_t * count)353 hal_i2c_status_t HAL_I2cSlaveTransferGetCount(hal_i2c_slave_handle_t handle, size_t *count)
354 {
355     hal_i2c_slave_t *i2cSlaveHandle;
356 
357     assert(NULL != handle);
358     assert(NULL != count);
359 
360     i2cSlaveHandle = (hal_i2c_slave_t *)handle;
361 
362     return HAL_I2cGetStatus(
363         LPI2C_SlaveTransferGetCount(s_i2cBases[i2cSlaveHandle->instance], &i2cSlaveHandle->hardwareHandle, count));
364 }
365