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_i2c.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 i2c_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 i2c_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 I2C_Type *const s_i2cBases[] = I2C_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_I2C_Busy:
63 {
64 returnStatus = kStatus_HAL_I2cBusy;
65 break;
66 }
67 case kStatus_I2C_Idle:
68 {
69 returnStatus = kStatus_HAL_I2cIdle;
70 break;
71 }
72 case kStatus_I2C_Nak:
73 {
74 returnStatus = kStatus_HAL_I2cNak;
75 break;
76 }
77 case kStatus_I2C_ArbitrationLost:
78 {
79 returnStatus = kStatus_HAL_I2cArbitrationLost;
80 break;
81 }
82 case kStatus_I2C_Timeout:
83 {
84 returnStatus = kStatus_HAL_I2cTimeout;
85 break;
86 }
87 case kStatus_I2C_Addr_Nak:
88 {
89 returnStatus = kStatus_HAL_I2cAddrressNak;
90 break;
91 }
92 default:
93 {
94 returnStatus = kStatus_HAL_I2cError;
95 break;
96 }
97 }
98 return returnStatus;
99 }
100
HAL_I2cMasterCallback(I2C_Type * base,i2c_master_handle_t * handle,status_t status,void * callbackParam)101 static void HAL_I2cMasterCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *callbackParam)
102 {
103 hal_i2c_master_t *i2cMasterHandle;
104 assert(callbackParam);
105
106 i2cMasterHandle = (hal_i2c_master_t *)callbackParam;
107
108 if (NULL != i2cMasterHandle->callback)
109 {
110 i2cMasterHandle->callback(i2cMasterHandle, HAL_I2cGetStatus(status), i2cMasterHandle->callbackParam);
111 }
112 }
113
HAL_I2cSlaveCallback(I2C_Type * base,i2c_slave_transfer_t * xfer,void * callbackParam)114 static void HAL_I2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *callbackParam)
115 {
116 hal_i2c_slave_t *i2cSlaveHandle;
117 assert(callbackParam);
118
119 i2cSlaveHandle = (hal_i2c_slave_t *)callbackParam;
120
121 if (NULL != i2cSlaveHandle->callback)
122 {
123 i2cSlaveHandle->transfer.event = (hal_i2c_slave_transfer_event_t)xfer->event;
124 i2cSlaveHandle->transfer.data = xfer->data;
125 i2cSlaveHandle->transfer.dataSize = xfer->dataSize;
126 i2cSlaveHandle->transfer.completionStatus = HAL_I2cGetStatus(xfer->completionStatus);
127 i2cSlaveHandle->transfer.transferredCount = xfer->transferredCount;
128 i2cSlaveHandle->callback(i2cSlaveHandle, &i2cSlaveHandle->transfer, i2cSlaveHandle->callbackParam);
129 xfer->data = i2cSlaveHandle->transfer.data;
130 xfer->dataSize = i2cSlaveHandle->transfer.dataSize;
131 }
132 }
133
HAL_I2cMasterInit(hal_i2c_master_handle_t handle,const hal_i2c_master_config_t * halI2cConfig)134 hal_i2c_status_t HAL_I2cMasterInit(hal_i2c_master_handle_t handle, const hal_i2c_master_config_t *halI2cConfig)
135 {
136 hal_i2c_master_t *i2cMasterHandle;
137 i2c_master_config_t i2cConfig;
138
139 assert(handle);
140 assert(halI2cConfig);
141 assert(HAL_I2C_MASTER_HANDLE_SIZE >= sizeof(hal_i2c_master_t));
142
143 i2cMasterHandle = (hal_i2c_master_t *)handle;
144
145 I2C_MasterGetDefaultConfig(&i2cConfig);
146 i2cConfig.enableMaster = halI2cConfig->enableMaster;
147 i2cConfig.baudRate_Bps = halI2cConfig->baudRate_Bps;
148 i2cMasterHandle->instance = halI2cConfig->instance;
149
150 I2C_MasterInit(s_i2cBases[i2cMasterHandle->instance], &i2cConfig, halI2cConfig->srcClock_Hz);
151
152 return kStatus_HAL_I2cSuccess;
153 }
154
HAL_I2cSlaveInit(hal_i2c_slave_handle_t handle,const hal_i2c_slave_config_t * halI2cConfig)155 hal_i2c_status_t HAL_I2cSlaveInit(hal_i2c_slave_handle_t handle, const hal_i2c_slave_config_t *halI2cConfig)
156 {
157 hal_i2c_slave_t *i2cSlaveHandle;
158 i2c_slave_config_t i2cConfig;
159
160 assert(handle);
161 assert(halI2cConfig);
162 assert(HAL_I2C_SLAVE_HANDLE_SIZE >= sizeof(hal_i2c_slave_t));
163
164 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
165
166 I2C_SlaveGetDefaultConfig(&i2cConfig);
167 i2cConfig.enableSlave = halI2cConfig->enableSlave;
168 i2cConfig.slaveAddress = halI2cConfig->slaveAddress;
169 i2cSlaveHandle->instance = halI2cConfig->instance;
170
171 I2C_SlaveInit(s_i2cBases[i2cSlaveHandle->instance], &i2cConfig, halI2cConfig->srcClock_Hz);
172
173 return kStatus_HAL_I2cSuccess;
174 }
175
HAL_I2cMasterDeinit(hal_i2c_master_handle_t handle)176 hal_i2c_status_t HAL_I2cMasterDeinit(hal_i2c_master_handle_t handle)
177 {
178 hal_i2c_master_t *i2cMasterHandle;
179
180 assert(handle);
181
182 i2cMasterHandle = (hal_i2c_master_t *)handle;
183
184 I2C_MasterDeinit(s_i2cBases[i2cMasterHandle->instance]);
185
186 return kStatus_HAL_I2cSuccess;
187 }
188
HAL_I2cSlaveDeinit(hal_i2c_slave_handle_t handle)189 hal_i2c_status_t HAL_I2cSlaveDeinit(hal_i2c_slave_handle_t handle)
190 {
191 hal_i2c_slave_t *i2cSlaveHandle;
192
193 assert(handle);
194
195 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
196
197 I2C_SlaveDeinit(s_i2cBases[i2cSlaveHandle->instance]);
198
199 return kStatus_HAL_I2cSuccess;
200 }
201
HAL_I2cMasterWriteBlocking(hal_i2c_master_handle_t handle,const uint8_t * txBuff,size_t txSize,uint32_t flags)202 hal_i2c_status_t HAL_I2cMasterWriteBlocking(hal_i2c_master_handle_t handle,
203 const uint8_t *txBuff,
204 size_t txSize,
205 uint32_t flags)
206 {
207 hal_i2c_master_t *i2cMasterHandle;
208
209 assert(handle);
210
211 i2cMasterHandle = (hal_i2c_master_t *)handle;
212
213 return HAL_I2cGetStatus(I2C_MasterWriteBlocking(s_i2cBases[i2cMasterHandle->instance], txBuff, txSize, flags));
214 }
215
HAL_I2cMasterReadBlocking(hal_i2c_master_handle_t handle,uint8_t * rxBuff,size_t rxSize,uint32_t flags)216 hal_i2c_status_t HAL_I2cMasterReadBlocking(hal_i2c_master_handle_t handle,
217 uint8_t *rxBuff,
218 size_t rxSize,
219 uint32_t flags)
220 {
221 hal_i2c_master_t *i2cMasterHandle;
222
223 assert(handle);
224
225 i2cMasterHandle = (hal_i2c_master_t *)handle;
226
227 return HAL_I2cGetStatus(I2C_MasterReadBlocking(s_i2cBases[i2cMasterHandle->instance], rxBuff, rxSize, flags));
228 }
229
HAL_I2cSlaveWriteBlocking(hal_i2c_slave_handle_t handle,const uint8_t * txBuff,size_t txSize)230 hal_i2c_status_t HAL_I2cSlaveWriteBlocking(hal_i2c_slave_handle_t handle, const uint8_t *txBuff, size_t txSize)
231 {
232 hal_i2c_slave_t *i2cSlaveHandle;
233
234 assert(handle);
235
236 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
237
238 return HAL_I2cGetStatus(I2C_SlaveWriteBlocking(s_i2cBases[i2cSlaveHandle->instance], txBuff, txSize));
239 }
240
HAL_I2cSlaveReadBlocking(hal_i2c_slave_handle_t handle,uint8_t * rxBuff,size_t rxSize)241 hal_i2c_status_t HAL_I2cSlaveReadBlocking(hal_i2c_slave_handle_t handle, uint8_t *rxBuff, size_t rxSize)
242 {
243 hal_i2c_slave_t *i2cSlaveHandle;
244
245 assert(handle);
246
247 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
248
249 return HAL_I2cGetStatus(I2C_SlaveReadBlocking(s_i2cBases[i2cSlaveHandle->instance], rxBuff, rxSize));
250 }
251
HAL_I2cMasterTransferBlocking(hal_i2c_master_handle_t handle,hal_i2c_master_transfer_t * xfer)252 hal_i2c_status_t HAL_I2cMasterTransferBlocking(hal_i2c_master_handle_t handle, hal_i2c_master_transfer_t *xfer)
253 {
254 hal_i2c_master_t *i2cMasterHandle;
255 i2c_master_transfer_t transfer;
256
257 assert(handle);
258 assert(xfer);
259
260 i2cMasterHandle = (hal_i2c_master_t *)handle;
261
262 transfer.flags = xfer->flags;
263 transfer.slaveAddress = xfer->slaveAddress;
264 transfer.direction = (kHAL_I2cRead == xfer->direction) ? kI2C_Read : kI2C_Write;
265 transfer.subaddress = xfer->subaddress;
266 transfer.subaddressSize = xfer->subaddressSize;
267 transfer.data = xfer->data;
268 transfer.dataSize = xfer->dataSize;
269
270 return HAL_I2cGetStatus(I2C_MasterTransferBlocking(s_i2cBases[i2cMasterHandle->instance], &transfer));
271 }
272
HAL_I2cMasterTransferInstallCallback(hal_i2c_master_handle_t handle,hal_i2c_master_transfer_callback_t callback,void * callbackParam)273 hal_i2c_status_t HAL_I2cMasterTransferInstallCallback(hal_i2c_master_handle_t handle,
274 hal_i2c_master_transfer_callback_t callback,
275 void *callbackParam)
276 {
277 hal_i2c_master_t *i2cMasterHandle;
278
279 assert(handle);
280
281 i2cMasterHandle = (hal_i2c_master_t *)handle;
282
283 i2cMasterHandle->callback = callback;
284 i2cMasterHandle->callbackParam = callbackParam;
285 I2C_MasterTransferCreateHandle(s_i2cBases[i2cMasterHandle->instance], &i2cMasterHandle->hardwareHandle,
286 HAL_I2cMasterCallback, i2cMasterHandle);
287
288 return kStatus_HAL_I2cSuccess;
289 }
290
HAL_I2cMasterTransferNonBlocking(hal_i2c_master_handle_t handle,hal_i2c_master_transfer_t * xfer)291 hal_i2c_status_t HAL_I2cMasterTransferNonBlocking(hal_i2c_master_handle_t handle, hal_i2c_master_transfer_t *xfer)
292 {
293 hal_i2c_master_t *i2cMasterHandle;
294 i2c_master_transfer_t transfer;
295
296 assert(handle);
297 assert(xfer);
298
299 i2cMasterHandle = (hal_i2c_master_t *)handle;
300
301 transfer.flags = xfer->flags;
302 transfer.slaveAddress = xfer->slaveAddress;
303 transfer.direction = (kHAL_I2cRead == xfer->direction) ? kI2C_Read : kI2C_Write;
304 transfer.subaddress = xfer->subaddress;
305 transfer.subaddressSize = xfer->subaddressSize;
306 transfer.data = xfer->data;
307 transfer.dataSize = xfer->dataSize;
308 return HAL_I2cGetStatus(I2C_MasterTransferNonBlocking(s_i2cBases[i2cMasterHandle->instance],
309 &i2cMasterHandle->hardwareHandle, &transfer));
310 }
311
HAL_I2cMasterTransferGetCount(hal_i2c_master_handle_t handle,size_t * count)312 hal_i2c_status_t HAL_I2cMasterTransferGetCount(hal_i2c_master_handle_t handle, size_t *count)
313 {
314 hal_i2c_master_t *i2cMasterHandle;
315
316 assert(handle);
317 assert(count);
318
319 i2cMasterHandle = (hal_i2c_master_t *)handle;
320 return HAL_I2cGetStatus(
321 I2C_MasterTransferGetCount(s_i2cBases[i2cMasterHandle->instance], &i2cMasterHandle->hardwareHandle, count));
322 }
323
HAL_I2cMasterTransferAbort(hal_i2c_master_handle_t handle)324 hal_i2c_status_t HAL_I2cMasterTransferAbort(hal_i2c_master_handle_t handle)
325 {
326 hal_i2c_master_t *i2cMasterHandle;
327
328 assert(handle);
329
330 i2cMasterHandle = (hal_i2c_master_t *)handle;
331 return HAL_I2cGetStatus(
332 I2C_MasterTransferAbort(s_i2cBases[i2cMasterHandle->instance], &i2cMasterHandle->hardwareHandle));
333 }
334
HAL_I2cSlaveTransferInstallCallback(hal_i2c_slave_handle_t handle,hal_i2c_slave_transfer_callback_t callback,void * callbackParam)335 hal_i2c_status_t HAL_I2cSlaveTransferInstallCallback(hal_i2c_slave_handle_t handle,
336 hal_i2c_slave_transfer_callback_t callback,
337 void *callbackParam)
338 {
339 hal_i2c_slave_t *i2cSlaveHandle;
340
341 assert(handle);
342
343 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
344
345 i2cSlaveHandle->callback = callback;
346 i2cSlaveHandle->callbackParam = callbackParam;
347 I2C_SlaveTransferCreateHandle(s_i2cBases[i2cSlaveHandle->instance], &i2cSlaveHandle->hardwareHandle,
348 HAL_I2cSlaveCallback, i2cSlaveHandle);
349
350 return kStatus_HAL_I2cSuccess;
351 }
352
HAL_I2cSlaveTransferNonBlocking(hal_i2c_slave_handle_t handle,uint32_t eventMask)353 hal_i2c_status_t HAL_I2cSlaveTransferNonBlocking(hal_i2c_slave_handle_t handle, uint32_t eventMask)
354 {
355 hal_i2c_slave_t *i2cSlaveHandle;
356
357 assert(handle);
358
359 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
360
361 return HAL_I2cGetStatus(
362 I2C_SlaveTransferNonBlocking(s_i2cBases[i2cSlaveHandle->instance], &i2cSlaveHandle->hardwareHandle, eventMask));
363 }
364
HAL_I2cSlaveTransferAbort(hal_i2c_slave_handle_t handle)365 hal_i2c_status_t HAL_I2cSlaveTransferAbort(hal_i2c_slave_handle_t handle)
366 {
367 hal_i2c_slave_t *i2cSlaveHandle;
368
369 assert(handle);
370
371 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
372
373 I2C_SlaveTransferAbort(s_i2cBases[i2cSlaveHandle->instance], &i2cSlaveHandle->hardwareHandle);
374
375 return kStatus_HAL_I2cSuccess;
376 }
377
HAL_I2cSlaveTransferGetCount(hal_i2c_slave_handle_t handle,size_t * count)378 hal_i2c_status_t HAL_I2cSlaveTransferGetCount(hal_i2c_slave_handle_t handle, size_t *count)
379 {
380 hal_i2c_slave_t *i2cSlaveHandle;
381
382 assert(handle);
383 assert(count);
384
385 i2cSlaveHandle = (hal_i2c_slave_t *)handle;
386
387 return HAL_I2cGetStatus(
388 I2C_SlaveTransferGetCount(s_i2cBases[i2cSlaveHandle->instance], &i2cSlaveHandle->hardwareHandle, count));
389 }
390