1 /*
2  * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
3  * Copyright (c) 2016, Freescale Semiconductor, Inc. Not a Contribution.
4  * Copyright 2016-2021 NXP. Not a Contribution.
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  *
8  * Licensed under the Apache License, Version 2.0 (the License); you may
9  * not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
16  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 #include "fsl_i2c_cmsis.h"
22 
23 /* Component ID definition, used by tools. */
24 #ifndef FSL_COMPONENT_ID
25 #define FSL_COMPONENT_ID "platform.drivers.i2c_cmsis"
26 #endif
27 
28 #if ((defined(RTE_I2C0) && RTE_I2C0 && defined(I2C0)) || (defined(RTE_I2C1) && RTE_I2C1 && defined(I2C1)) || \
29      (defined(RTE_I2C2) && RTE_I2C2 && defined(I2C2)) || (defined(RTE_I2C3) && RTE_I2C3 && defined(I2C3)))
30 
31 #define ARM_I2C_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR((2), (2))
32 
33 /*
34  * ARMCC does not support split the data section automatically, so the driver
35  * needs to split the data to separate sections explicitly, to reduce codesize.
36  */
37 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
38 #define ARMCC_SECTION(section_name) __attribute__((section(section_name)))
39 #endif
40 
41 typedef const struct _cmsis_i2c_resource
42 {
43     I2C_Type *base;            /*!< I2C peripheral base address.      */
44     uint32_t (*GetFreq)(void); /*!< Function to get the clock frequency. */
45 
46 } cmsis_i2c_resource_t;
47 
48 typedef union _cmsis_i2c_handle
49 {
50     i2c_master_handle_t master_handle; /*!< master Interupt transfer handle. */
51     i2c_slave_handle_t slave_handle;   /*!< slave Interupt transfer handle. */
52 } cmsis_i2c_handle_t;
53 
54 typedef struct _cmsis_i2c_interrupt_driver_state
55 {
56     cmsis_i2c_resource_t *resource; /*!< Basic I2C resource. */
57     cmsis_i2c_handle_t *handle;
58     ARM_I2C_SignalEvent_t cb_event; /*!< Callback function.     */
59     uint8_t flags;                  /*!< Control and state flags. */
60 } cmsis_i2c_interrupt_driver_state_t;
61 
62 #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
63 typedef const struct _cmsis_i2c_dma_resource
64 {
65     DMA_Type *i2cDmaBase;       /*!< DMA peripheral base address for i2c.    */
66     uint32_t i2cDmaChannel;     /*!< DMA channel for i2c.             */
67     DMAMUX_Type *i2cDmamuxBase; /*!< DMAMUX peripheral base address for i2c. */
68     uint16_t i2cDmaRequest;     /*!< i2c DMA request source.                 */
69 
70 #if FSL_FEATURE_DMA_MODULE_CHANNEL != FSL_FEATURE_DMAMUX_MODULE_CHANNEL
71     uint32_t i2cDmamuxChannel; /*!< DMAMUX channel for i2c.             */
72 #endif
73 } cmsis_i2c_dma_resource_t;
74 
75 typedef struct _cmsis_i2c_dma_driver_state
76 {
77     cmsis_i2c_resource_t *resource;             /*!< i2c basic resource.      */
78     cmsis_i2c_dma_resource_t *dmaResource;      /*!< i2c DMA resource.        */
79     i2c_master_dma_handle_t *master_dma_handle; /*!< i2c DMA transfer handle. */
80     dma_handle_t *dmaHandle;                    /*!< DMA i2c handle.          */
81     uint8_t flags;                              /*!< Control and state flags. */
82 } cmsis_i2c_dma_driver_state_t;
83 #endif
84 
85 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
86 typedef const struct _cmsis_i2c_edma_resource
87 {
88     DMA_Type *i2cEdmaBase;      /*!< EDMA peripheral base address for i2c.    */
89     uint32_t i2cEdmaChannel;    /*!< EDMA channel for i2c.             */
90     DMAMUX_Type *i2cDmamuxBase; /*!< DMAMUX peripheral base address for i2c.  */
91     uint16_t i2cDmaRequest;     /*!< i2c EDMA request source.                 */
92 } cmsis_i2c_edma_resource_t;
93 
94 typedef struct _cmsis_i2c_edma_driver_state
95 {
96     cmsis_i2c_resource_t *resource;               /*!< i2c basic resource.       */
97     cmsis_i2c_edma_resource_t *edmaResource;      /*!< i2c EDMA resource.        */
98     i2c_master_edma_handle_t *master_edma_handle; /*!< i2c EDMA transfer handle. */
99     edma_handle_t *edmaHandle;                    /*!< EDMA i2c handle.          */
100     uint8_t flags;                                /*!< Control and state flags. */
101 } cmsis_i2c_edma_driver_state_t;
102 #endif /* FSL_FEATURE_SOC_EDMA_COUNT */
103 
104 static const ARM_DRIVER_VERSION s_i2cDriverVersion        = {ARM_I2C_API_VERSION, ARM_I2C_DRV_VERSION};
105 static const ARM_I2C_CAPABILITIES s_i2cDriverCapabilities = {
106     0, /*< supports 10-bit addressing */
107 };
108 
109 static const clock_ip_name_t s_i2cClocks[] = I2C_CLOCKS;
110 
I2Cx_GetVersion(void)111 static ARM_DRIVER_VERSION I2Cx_GetVersion(void)
112 {
113     return s_i2cDriverVersion;
114 }
115 
I2Cx_GetCapabilities(void)116 static ARM_I2C_CAPABILITIES I2Cx_GetCapabilities(void)
117 {
118     return s_i2cDriverCapabilities;
119 }
120 
121 #endif
122 
123 #if ((defined(RTE_I2C0_DMA_EN) && RTE_I2C0_DMA_EN) || (defined(RTE_I2C1_DMA_EN) && RTE_I2C1_DMA_EN) || \
124      (defined(RTE_I2C2_DMA_EN) && RTE_I2C2_DMA_EN) || (defined(RTE_I2C3_DMA_EN) && RTE_I2C3_DMA_EN))
125 
126 #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
KSDK_I2C_MASTER_DmaCallback(I2C_Type * base,i2c_master_dma_handle_t * handle,status_t status,void * userData)127 static void KSDK_I2C_MASTER_DmaCallback(I2C_Type *base,
128                                         i2c_master_dma_handle_t *handle,
129                                         status_t status,
130                                         void *userData)
131 {
132     uint32_t event = 0;
133 
134     if (status == kStatus_Success) /* Occurs after Master Transmit/Receive operation has finished. */
135     {
136         event = ARM_I2C_EVENT_TRANSFER_DONE;
137     }
138 
139     if (status == kStatus_I2C_Addr_Nak)
140     {
141         event = ARM_I2C_EVENT_ADDRESS_NACK;
142     }
143 
144     if (userData != NULL)
145     {
146         ((ARM_I2C_SignalEvent_t)userData)(event);
147     }
148 }
149 
I2C_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event,cmsis_i2c_dma_driver_state_t * i2c)150 static int32_t I2C_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event, cmsis_i2c_dma_driver_state_t *i2c)
151 {
152     if (0U == (i2c->flags & (uint8_t)I2C_FLAG_INIT))
153     {
154         /* Configure DMAMUX channel */
155 #if FSL_FEATURE_DMA_MODULE_CHANNEL != FSL_FEATURE_DMAMUX_MODULE_CHANNEL
156         DMAMUX_SetSource(i2c->dmaResource->i2cDmamuxBase, i2c->dmaResource->i2cDmamuxChannel,
157                          (int32_t)i2c->dmaResource->i2cDmaRequest);
158         DMAMUX_EnableChannel(i2c->dmaResource->i2cDmamuxBase, i2c->dmaResource->i2cDmamuxChannel);
159 #else
160         DMAMUX_SetSource(i2c->dmaResource->i2cDmamuxBase, i2c->dmaResource->i2cDmaChannel,
161                          (int32_t)i2c->dmaResource->i2cDmaRequest);
162         DMAMUX_EnableChannel(i2c->dmaResource->i2cDmamuxBase, i2c->dmaResource->i2cDmaChannel);
163 #endif
164         /* Creat dmahandle  */
165         DMA_CreateHandle(i2c->dmaHandle, i2c->dmaResource->i2cDmaBase, i2c->dmaResource->i2cDmaChannel);
166         /* Create master_dma_handle. */
167         I2C_MasterTransferCreateHandleDMA(i2c->resource->base, i2c->master_dma_handle, KSDK_I2C_MASTER_DmaCallback,
168                                           (void *)cb_event, i2c->dmaHandle);
169         i2c->flags = (uint8_t)I2C_FLAG_INIT;
170     }
171     return ARM_DRIVER_OK;
172 }
173 
I2C_Master_DmaUninitialize(cmsis_i2c_dma_driver_state_t * i2c)174 static int32_t I2C_Master_DmaUninitialize(cmsis_i2c_dma_driver_state_t *i2c)
175 {
176     i2c->flags = (uint8_t)I2C_FLAG_UNINIT;
177     return ARM_DRIVER_OK;
178 }
179 
I2C_Master_DmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending,cmsis_i2c_dma_driver_state_t * i2c)180 static int32_t I2C_Master_DmaTransmit(
181     uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending, cmsis_i2c_dma_driver_state_t *i2c)
182 {
183     int32_t status;
184     int32_t ret;
185     i2c_master_transfer_t masterXfer;
186 
187     /* Check if the I2C bus is idle - if not return busy status. */
188     if (i2c->master_dma_handle->state != 0U)
189     {
190         return ARM_DRIVER_ERROR_BUSY;
191     }
192 
193     masterXfer.slaveAddress   = (uint8_t)addr;                      /*7-bit slave address.*/
194     masterXfer.direction      = kI2C_Write;                         /* Transfer direction.*/
195     masterXfer.subaddress     = 0U;                                 /* Sub address */
196     masterXfer.subaddressSize = 0U;                                 /* Size of command buffer.*/
197     masterXfer.data           = (uint8_t *)data;                    /* Transfer buffer.*/
198     masterXfer.dataSize       = num;                                /* Transfer size.*/
199     masterXfer.flags          = (uint32_t)kI2C_TransferDefaultFlag; /* Transfer flag which controls the transfer.*/
200 
201     if ((i2c->resource->base->S & 0x20U) != 0U)
202     {
203         masterXfer.flags |= (uint32_t)kI2C_TransferRepeatedStartFlag;
204     }
205 
206     if (xfer_pending)
207     {
208         masterXfer.flags |= (uint32_t)kI2C_TransferNoStopFlag;
209     }
210 
211     status = I2C_MasterTransferDMA(i2c->resource->base, i2c->master_dma_handle, &masterXfer);
212     switch (status)
213     {
214         case kStatus_Success:
215             ret = ARM_DRIVER_OK;
216             break;
217         case kStatus_I2C_Busy:
218             ret = ARM_DRIVER_ERROR_BUSY;
219             break;
220         case kStatus_I2C_Timeout:
221             ret = ARM_DRIVER_ERROR_TIMEOUT;
222             break;
223         default:
224             ret = ARM_DRIVER_ERROR;
225             break;
226     }
227 
228     return ret;
229 }
230 
I2C_Master_DmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending,cmsis_i2c_dma_driver_state_t * i2c)231 static int32_t I2C_Master_DmaReceive(
232     uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending, cmsis_i2c_dma_driver_state_t *i2c)
233 {
234     int32_t status;
235     int32_t ret;
236     i2c_master_transfer_t masterXfer;
237 
238     /* Check if the I2C bus is idle - if not return busy status. */
239     if (i2c->master_dma_handle->state != 0U)
240     {
241         return ARM_DRIVER_ERROR_BUSY;
242     }
243 
244     masterXfer.slaveAddress   = (uint8_t)addr;                      /*7-bit slave address.*/
245     masterXfer.direction      = kI2C_Read;                          /* Transfer direction.*/
246     masterXfer.subaddress     = 0U;                                 /* Sub address */
247     masterXfer.subaddressSize = 0U;                                 /* Size of command buffer.*/
248     masterXfer.data           = data;                               /* Transfer buffer.*/
249     masterXfer.dataSize       = num;                                /* Transfer size.*/
250     masterXfer.flags          = (uint32_t)kI2C_TransferDefaultFlag; /* Transfer flag which controls the transfer.*/
251 
252     if ((i2c->resource->base->S & 0x20U) != 0U)
253     {
254         masterXfer.flags |= (uint32_t)kI2C_TransferRepeatedStartFlag;
255     }
256 
257     if (xfer_pending)
258     {
259         masterXfer.flags |= (uint32_t)kI2C_TransferNoStopFlag;
260     }
261 
262     status = I2C_MasterTransferDMA(i2c->resource->base, i2c->master_dma_handle, &masterXfer);
263     switch (status)
264     {
265         case kStatus_Success:
266             ret = ARM_DRIVER_OK;
267             break;
268         case kStatus_I2C_Busy:
269             ret = ARM_DRIVER_ERROR_BUSY;
270             break;
271         case kStatus_I2C_Timeout:
272             ret = ARM_DRIVER_ERROR_TIMEOUT;
273             break;
274         default:
275             ret = ARM_DRIVER_ERROR;
276             break;
277     }
278 
279     return ret;
280 }
281 
I2C_Master_DmaGetDataCount(cmsis_i2c_dma_driver_state_t * i2c)282 static int32_t I2C_Master_DmaGetDataCount(cmsis_i2c_dma_driver_state_t *i2c)
283 {
284     size_t cnt; /* The number of currently transferred data bytes */
285 
286     (void)I2C_MasterTransferGetCountDMA(i2c->resource->base, i2c->master_dma_handle, &cnt);
287     return (int32_t)cnt;
288 }
289 
I2C_Master_DmaControl(uint32_t control,uint32_t arg,cmsis_i2c_dma_driver_state_t * i2c)290 static int32_t I2C_Master_DmaControl(uint32_t control, uint32_t arg, cmsis_i2c_dma_driver_state_t *i2c)
291 {
292     uint32_t baudRate_Bps  = 0;
293     volatile uint8_t dummy = 0;
294     int32_t result         = ARM_DRIVER_OK;
295     /* Add this to avoid warning. */
296     dummy++;
297 
298     switch (control)
299     {
300         /* Not supported */
301         case ARM_I2C_OWN_ADDRESS:
302             return ARM_DRIVER_ERROR_UNSUPPORTED;
303 
304         /* Set Bus Speed; arg = bus speed */
305         case ARM_I2C_BUS_SPEED:
306             switch (arg)
307             {
308                 case ARM_I2C_BUS_SPEED_STANDARD:
309                     baudRate_Bps = 100000;
310                     break;
311 
312                 case ARM_I2C_BUS_SPEED_FAST:
313                     baudRate_Bps = 400000;
314                     break;
315 
316                 case ARM_I2C_BUS_SPEED_FAST_PLUS:
317                     baudRate_Bps = 1000000;
318                     break;
319 
320                 default:
321                     result = ARM_DRIVER_ERROR_UNSUPPORTED;
322                     break;
323             }
324             if (result == ARM_DRIVER_OK)
325             {
326                 I2C_MasterSetBaudRate(i2c->resource->base, baudRate_Bps, i2c->resource->GetFreq());
327             }
328             break;
329 
330         /* Not supported */
331         case ARM_I2C_BUS_CLEAR:
332             result = ARM_DRIVER_ERROR_UNSUPPORTED;
333             break;
334 
335         /* Aborts the data transfer  when Master for Transmit or Receive */
336         case ARM_I2C_ABORT_TRANSFER:
337             if ((i2c->resource->base->C1 & (uint8_t)I2C_C1_MST_MASK) != 0U)
338             {
339                 /* Disable dma */
340                 I2C_MasterTransferAbortDMA(i2c->resource->base, i2c->master_dma_handle);
341                 /* If master receive */
342                 if (i2c->master_dma_handle->transfer.direction == kI2C_Read)
343                 {
344                     i2c->resource->base->C1 |= (uint8_t)I2C_C1_TXAK_MASK;
345                     while (0U == (i2c->resource->base->S & I2C_S_TCF_MASK))
346                     {
347                     }
348                     i2c->resource->base->C1 &=
349                         ~((uint8_t)I2C_C1_MST_MASK | (uint8_t)I2C_C1_TX_MASK | (uint8_t)I2C_C1_TXAK_MASK);
350                     dummy = i2c->resource->base->D;
351                 }
352                 /* If master transmit */
353                 else
354                 {
355                     while (0U == (i2c->resource->base->S & (uint8_t)I2C_S_TCF_MASK))
356                     {
357                     }
358                     i2c->resource->base->C1 &=
359                         ~((uint8_t)I2C_C1_MST_MASK | (uint8_t)I2C_C1_TX_MASK | (uint8_t)I2C_C1_TXAK_MASK);
360                 }
361 
362                 i2c->master_dma_handle->transferSize      = 0;
363                 i2c->master_dma_handle->transfer.data     = NULL;
364                 i2c->master_dma_handle->transfer.dataSize = 0;
365             }
366             break;
367 
368         default:
369             result = ARM_DRIVER_ERROR_UNSUPPORTED;
370             break;
371     }
372     return result;
373 }
374 
I2C_Master_DmaPowerControl(ARM_POWER_STATE state,cmsis_i2c_dma_driver_state_t * i2c)375 static int32_t I2C_Master_DmaPowerControl(ARM_POWER_STATE state, cmsis_i2c_dma_driver_state_t *i2c)
376 {
377     int32_t result = ARM_DRIVER_OK;
378     switch (state)
379     {
380         /* Terminates any pending data transfers, disable i2c moduole and i2c clock and related dma */
381         case ARM_POWER_OFF:
382             if ((i2c->flags & (uint8_t)I2C_FLAG_POWER) != 0U)
383             {
384                 (void)I2C_Master_DmaControl(ARM_I2C_ABORT_TRANSFER, 0, i2c);
385                 I2C_MasterDeinit(i2c->resource->base);
386 #if FSL_FEATURE_DMA_MODULE_CHANNEL != FSL_FEATURE_DMAMUX_MODULE_CHANNEL
387                 DMAMUX_DisableChannel(i2c->dmaResource->i2cDmamuxBase, i2c->dmaResource->i2cDmamuxChannel);
388 #else
389                 DMAMUX_DisableChannel(i2c->dmaResource->i2cDmamuxBase, i2c->dmaResource->i2cDmaChannel);
390 #endif
391                 i2c->flags = (uint8_t)I2C_FLAG_INIT;
392             }
393             break;
394 
395         /* Not supported */
396         case ARM_POWER_LOW:
397             result = ARM_DRIVER_ERROR_UNSUPPORTED;
398             break;
399 
400         /* Enable i2c moduole and i2c clock */
401         case ARM_POWER_FULL:
402             if (i2c->flags == (uint8_t)I2C_FLAG_UNINIT)
403             {
404                 return ARM_DRIVER_ERROR;
405             }
406 
407             if ((i2c->flags & (uint8_t)I2C_FLAG_POWER) != 0U)
408             {
409                 /* Driver already powered */
410                 break;
411             }
412             CLOCK_EnableClock(s_i2cClocks[I2C_GetInstance(i2c->resource->base)]);
413             i2c->resource->base->C1 = I2C_C1_IICEN(1);
414             i2c->flags |= (uint8_t)I2C_FLAG_POWER;
415             break;
416 
417         default:
418             result = ARM_DRIVER_ERROR_UNSUPPORTED;
419             break;
420     }
421 
422     return result;
423 }
424 
I2C_Master_DmaGetStatus(cmsis_i2c_dma_driver_state_t * i2c)425 static ARM_I2C_STATUS I2C_Master_DmaGetStatus(cmsis_i2c_dma_driver_state_t *i2c)
426 {
427     ARM_I2C_STATUS stat             = {0};
428     uint32_t ksdk_i2c_master_status = I2C_MasterGetStatusFlags(i2c->resource->base);
429 
430     stat.busy = (uint32_t)((ksdk_i2c_master_status & (uint32_t)kI2C_BusBusyFlag) != 0U); /* Busy flag.*/
431 
432     stat.mode = 1UL; /* Mode: 0=Slave, 1=Master.*/
433 
434     stat.direction = (uint32_t)((ksdk_i2c_master_status & (uint32_t)kI2C_TransferDirectionFlag) !=
435                                 0U); /* Direction: 0=Transmitter, 1=Receiver.*/
436 
437     stat.arbitration_lost = (uint32_t)((ksdk_i2c_master_status & (uint32_t)kI2C_ArbitrationLostFlag) !=
438                                        0U); /* Master lost arbitration (cleared on start of next Master operation)*/
439 
440     return stat;
441 }
442 #endif
443 
444 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
KSDK_I2C_MASTER_EdmaCallback(I2C_Type * base,i2c_master_edma_handle_t * handle,status_t status,void * userData)445 static void KSDK_I2C_MASTER_EdmaCallback(I2C_Type *base,
446                                          i2c_master_edma_handle_t *handle,
447                                          status_t status,
448                                          void *userData)
449 {
450     uint32_t event = 0;
451 
452     /* Occurs after Master Transmit/Receive operation has finished. */
453     if (status == kStatus_Success)
454     {
455         event = ARM_I2C_EVENT_TRANSFER_DONE;
456     }
457 
458     if (status == kStatus_I2C_Addr_Nak)
459     {
460         event = ARM_I2C_EVENT_ADDRESS_NACK;
461     }
462 
463     if (userData != NULL)
464     {
465         ((ARM_I2C_SignalEvent_t)userData)(event);
466     }
467 }
468 
I2C_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event,cmsis_i2c_edma_driver_state_t * i2c)469 static int32_t I2C_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event, cmsis_i2c_edma_driver_state_t *i2c)
470 {
471     if (0U == (i2c->flags & (uint8_t)I2C_FLAG_INIT))
472     {
473         /* Configure DMAMUX channel */
474         DMAMUX_SetSource(i2c->edmaResource->i2cDmamuxBase, i2c->edmaResource->i2cEdmaChannel,
475                          (int32_t)i2c->edmaResource->i2cDmaRequest);
476         DMAMUX_EnableChannel(i2c->edmaResource->i2cDmamuxBase, i2c->edmaResource->i2cEdmaChannel);
477         /* Creat edmahandle  */
478         EDMA_CreateHandle(i2c->edmaHandle, i2c->edmaResource->i2cEdmaBase, i2c->edmaResource->i2cEdmaChannel);
479         /* Create master_edma_handle. */
480         I2C_MasterCreateEDMAHandle(i2c->resource->base, i2c->master_edma_handle, KSDK_I2C_MASTER_EdmaCallback,
481                                    (void *)cb_event, i2c->edmaHandle);
482         i2c->flags = (uint8_t)I2C_FLAG_INIT;
483     }
484     return ARM_DRIVER_OK;
485 }
486 
I2C_Master_EdmaUninitialize(cmsis_i2c_edma_driver_state_t * i2c)487 static int32_t I2C_Master_EdmaUninitialize(cmsis_i2c_edma_driver_state_t *i2c)
488 {
489     i2c->flags = (uint8_t)I2C_FLAG_UNINIT;
490     return ARM_DRIVER_OK;
491 }
492 
I2C_Master_EdmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending,cmsis_i2c_edma_driver_state_t * i2c)493 static int32_t I2C_Master_EdmaTransmit(
494     uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending, cmsis_i2c_edma_driver_state_t *i2c)
495 {
496     int32_t status;
497     int32_t ret;
498     i2c_master_transfer_t masterXfer;
499 
500     /* Check if the I2C bus is idle - if not return busy status. */
501     if (i2c->master_edma_handle->state != 0U)
502     {
503         return ARM_DRIVER_ERROR_BUSY;
504     }
505 
506     masterXfer.slaveAddress   = (uint8_t)addr;                      /*7-bit slave address.*/
507     masterXfer.direction      = kI2C_Write;                         /* Transfer direction.*/
508     masterXfer.subaddress     = 0U;                                 /* Sub address */
509     masterXfer.subaddressSize = 0U;                                 /* Size of command buffer.*/
510     masterXfer.data           = (uint8_t *)data;                    /* Transfer buffer.*/
511     masterXfer.dataSize       = num;                                /* Transfer size.*/
512     masterXfer.flags          = (uint32_t)kI2C_TransferDefaultFlag; /* Transfer flag which controls the transfer.*/
513 
514     if ((i2c->resource->base->S & 0x20U) != 0U)
515     {
516         masterXfer.flags |= (uint32_t)kI2C_TransferRepeatedStartFlag;
517     }
518 
519     if (xfer_pending)
520     {
521         masterXfer.flags |= (uint32_t)kI2C_TransferNoStopFlag;
522     }
523 
524     status = I2C_MasterTransferEDMA(i2c->resource->base, i2c->master_edma_handle, &masterXfer);
525     switch (status)
526     {
527         case kStatus_Success:
528             ret = ARM_DRIVER_OK;
529             break;
530         case kStatus_I2C_Busy:
531             ret = ARM_DRIVER_ERROR_BUSY;
532             break;
533         case kStatus_I2C_Timeout:
534             ret = ARM_DRIVER_ERROR_TIMEOUT;
535             break;
536         default:
537             ret = ARM_DRIVER_ERROR;
538             break;
539     }
540 
541     return ret;
542 }
543 
I2C_Master_EdmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending,cmsis_i2c_edma_driver_state_t * i2c)544 static int32_t I2C_Master_EdmaReceive(
545     uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending, cmsis_i2c_edma_driver_state_t *i2c)
546 {
547     int32_t status;
548     int32_t ret;
549     i2c_master_transfer_t masterXfer;
550 
551     /* Check if the I2C bus is idle - if not return busy status. */
552     if (i2c->master_edma_handle->state != 0U)
553     {
554         return ARM_DRIVER_ERROR_BUSY;
555     }
556 
557     masterXfer.slaveAddress   = (uint8_t)addr;                      /* 7-bit slave address.*/
558     masterXfer.direction      = kI2C_Read;                          /* Transfer direction.*/
559     masterXfer.subaddress     = 0U;                                 /* Sub address */
560     masterXfer.subaddressSize = 0U;                                 /* Size of command buffer.*/
561     masterXfer.data           = data;                               /* Transfer buffer.*/
562     masterXfer.dataSize       = num;                                /* Transfer size.*/
563     masterXfer.flags          = (uint32_t)kI2C_TransferDefaultFlag; /* Transfer flag which controls the transfer.*/
564 
565     if ((i2c->resource->base->S & 0x20U) != 0U)
566     {
567         masterXfer.flags |= (uint32_t)kI2C_TransferRepeatedStartFlag;
568     }
569 
570     if (xfer_pending)
571     {
572         masterXfer.flags |= (uint32_t)kI2C_TransferNoStopFlag;
573     }
574 
575     status = I2C_MasterTransferEDMA(i2c->resource->base, i2c->master_edma_handle, &masterXfer);
576 
577     switch (status)
578     {
579         case kStatus_Success:
580             ret = ARM_DRIVER_OK;
581             break;
582 
583         case kStatus_I2C_Busy:
584             ret = ARM_DRIVER_ERROR_BUSY;
585             break;
586 
587         case kStatus_I2C_Timeout:
588             ret = ARM_DRIVER_ERROR_TIMEOUT;
589             break;
590 
591         default:
592             ret = ARM_DRIVER_ERROR;
593             break;
594     }
595 
596     return ret;
597 }
598 
I2C_Master_EdmaGetDataCount(cmsis_i2c_edma_driver_state_t * i2c)599 static int32_t I2C_Master_EdmaGetDataCount(cmsis_i2c_edma_driver_state_t *i2c)
600 {
601     size_t cnt; /* The number of currently transferred data bytes */
602 
603     (void)I2C_MasterTransferGetCountEDMA(i2c->resource->base, i2c->master_edma_handle, &cnt);
604 
605     return (int32_t)cnt;
606 }
607 
I2C_Master_EdmaControl(uint32_t control,uint32_t arg,cmsis_i2c_edma_driver_state_t * i2c)608 static int32_t I2C_Master_EdmaControl(uint32_t control, uint32_t arg, cmsis_i2c_edma_driver_state_t *i2c)
609 {
610     uint32_t baudRate_Bps  = 0;
611     volatile uint8_t dummy = 0;
612     int32_t result         = ARM_DRIVER_OK;
613     /* Add this to avoid warning. */
614     dummy++;
615 
616     switch (control)
617     {
618         /* Not supported */
619         case ARM_I2C_OWN_ADDRESS:
620             result = ARM_DRIVER_ERROR_UNSUPPORTED;
621             break;
622 
623         /* Set Bus Speed; arg = bus speed */
624         case ARM_I2C_BUS_SPEED:
625             switch (arg)
626             {
627                 case ARM_I2C_BUS_SPEED_STANDARD:
628                     baudRate_Bps = 100000;
629                     break;
630 
631                 case ARM_I2C_BUS_SPEED_FAST:
632                     baudRate_Bps = 400000;
633                     break;
634 
635                 case ARM_I2C_BUS_SPEED_FAST_PLUS:
636                     baudRate_Bps = 1000000;
637                     break;
638 
639                 default:
640                     result = ARM_DRIVER_ERROR_UNSUPPORTED;
641                     break;
642             }
643             if (result == ARM_DRIVER_OK)
644             {
645                 I2C_MasterSetBaudRate(i2c->resource->base, baudRate_Bps, (i2c->resource->GetFreq)());
646             }
647 
648             break;
649         /* Not supported */
650         case ARM_I2C_BUS_CLEAR:
651             result = ARM_DRIVER_ERROR_UNSUPPORTED;
652             break;
653 
654         /* Aborts the data transfer  when Master for Transmit or Receive */
655         case ARM_I2C_ABORT_TRANSFER:
656 
657             if ((i2c->resource->base->C1 & (uint8_t)I2C_C1_MST_MASK) != 0U)
658             {
659                 /* Disable edma */
660                 I2C_MasterTransferAbortEDMA(i2c->resource->base, i2c->master_edma_handle);
661                 /* If master receive */
662                 if (i2c->master_edma_handle->transfer.direction == kI2C_Read)
663                 {
664                     i2c->resource->base->C1 |= (uint8_t)I2C_C1_TXAK_MASK;
665                     while (0U == (i2c->resource->base->S & (uint8_t)I2C_S_TCF_MASK))
666                     {
667                     }
668                     i2c->resource->base->C1 &=
669                         ~((uint8_t)I2C_C1_MST_MASK | (uint8_t)I2C_C1_TX_MASK | (uint8_t)I2C_C1_TXAK_MASK);
670                     dummy = i2c->resource->base->D;
671                 }
672                 /* If master transmit */
673                 else
674                 {
675                     while (0U == (i2c->resource->base->S & (uint8_t)I2C_S_TCF_MASK))
676                     {
677                     }
678                     i2c->resource->base->C1 &=
679                         ~((uint8_t)I2C_C1_MST_MASK | (uint8_t)I2C_C1_TX_MASK | (uint8_t)I2C_C1_TXAK_MASK);
680                 }
681 
682                 i2c->master_edma_handle->transferSize      = 0;
683                 i2c->master_edma_handle->transfer.data     = NULL;
684                 i2c->master_edma_handle->transfer.dataSize = 0;
685             }
686             break;
687         default:
688             result = ARM_DRIVER_ERROR_UNSUPPORTED;
689             break;
690     }
691     return result;
692 }
693 
I2C_Master_EdmaPowerControl(ARM_POWER_STATE state,cmsis_i2c_edma_driver_state_t * i2c)694 static int32_t I2C_Master_EdmaPowerControl(ARM_POWER_STATE state, cmsis_i2c_edma_driver_state_t *i2c)
695 {
696     int32_t result = ARM_DRIVER_OK;
697     switch (state)
698     {
699         /* Terminates any pending data transfers, disable i2c moduole and i2c clock and related edma */
700         case ARM_POWER_OFF:
701             if ((i2c->flags & (uint8_t)I2C_FLAG_POWER) != 0U)
702             {
703                 (void)I2C_Master_EdmaControl(ARM_I2C_ABORT_TRANSFER, 0, i2c);
704                 I2C_MasterDeinit(i2c->resource->base);
705                 DMAMUX_DisableChannel(i2c->edmaResource->i2cDmamuxBase, i2c->edmaResource->i2cEdmaChannel);
706                 i2c->flags = (uint8_t)I2C_FLAG_INIT;
707             }
708             break;
709         /* Not supported */
710         case ARM_POWER_LOW:
711             result = ARM_DRIVER_ERROR_UNSUPPORTED;
712             break;
713         /* Enable i2c moduole and i2c clock */
714         case ARM_POWER_FULL:
715             if (i2c->flags == (uint8_t)I2C_FLAG_UNINIT)
716             {
717                 return ARM_DRIVER_ERROR;
718             }
719 
720             if ((i2c->flags & (uint8_t)I2C_FLAG_POWER) != 0U)
721             {
722                 /* Driver already powered */
723                 break;
724             }
725 
726             CLOCK_EnableClock(s_i2cClocks[I2C_GetInstance(i2c->resource->base)]);
727             i2c->resource->base->C1 = I2C_C1_IICEN(1);
728             i2c->flags |= (uint8_t)I2C_FLAG_POWER;
729             break;
730         default:
731             result = ARM_DRIVER_ERROR_UNSUPPORTED;
732             break;
733     }
734 
735     return result;
736 }
737 
I2C_Master_EdmaGetStatus(cmsis_i2c_edma_driver_state_t * i2c)738 static ARM_I2C_STATUS I2C_Master_EdmaGetStatus(cmsis_i2c_edma_driver_state_t *i2c)
739 {
740     ARM_I2C_STATUS stat             = {0};
741     uint32_t ksdk_i2c_master_status = I2C_MasterGetStatusFlags(i2c->resource->base);
742 
743     stat.busy = (uint32_t)((ksdk_i2c_master_status & (uint32_t)kI2C_BusBusyFlag) != 0U); /* Busy flag.*/
744 
745     stat.mode = 1UL; /* Mode: 0=Slave, 1=Master.*/
746 
747     stat.direction = (uint32_t)((ksdk_i2c_master_status & (uint32_t)kI2C_TransferDirectionFlag) !=
748                                 0U); /* Direction: 0=Transmitter, 1=Receiver.*/
749 
750     stat.arbitration_lost = (uint32_t)((ksdk_i2c_master_status & (uint32_t)kI2C_ArbitrationLostFlag) !=
751                                        0U); /* Master lost arbitration (cleared on start of next Master operation)*/
752 
753     return stat;
754 }
755 #endif
756 
757 #endif
758 
759 #if ((defined(RTE_I2C0) && RTE_I2C0 && !(defined(RTE_I2C0_DMA_EN) && RTE_I2C0_DMA_EN)) || \
760      (defined(RTE_I2C1) && RTE_I2C1 && !(defined(RTE_I2C1_DMA_EN) && RTE_I2C1_DMA_EN)) || \
761      (defined(RTE_I2C2) && RTE_I2C2 && !(defined(RTE_I2C2_DMA_EN) && RTE_I2C2_DMA_EN)) || \
762      (defined(RTE_I2C3) && RTE_I2C3 && !(defined(RTE_I2C3_DMA_EN) && RTE_I2C3_DMA_EN)))
763 
KSDK_I2C_SLAVE_InterruptCallback(I2C_Type * base,i2c_slave_transfer_t * xfer,void * userData)764 static void KSDK_I2C_SLAVE_InterruptCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *userData)
765 {
766     uint32_t event = 0;
767 
768     switch (xfer->event)
769     {
770         case kI2C_SlaveCompletionEvent: /* Occurs after Slave Transmit/Receive operation has finished. */
771             event = ARM_I2C_EVENT_TRANSFER_DONE;
772             break;
773 
774         case kI2C_SlaveGenaralcallEvent:
775             event = ARM_I2C_EVENT_GENERAL_CALL;
776             break;
777 
778         default:
779             event = ARM_I2C_EVENT_TRANSFER_INCOMPLETE;
780             break;
781     }
782 
783     if (userData != NULL)
784     {
785         ((ARM_I2C_SignalEvent_t)userData)(event);
786     }
787 }
788 
KSDK_I2C_MASTER_InterruptCallback(I2C_Type * base,i2c_master_handle_t * handle,status_t status,void * userData)789 static void KSDK_I2C_MASTER_InterruptCallback(I2C_Type *base,
790                                               i2c_master_handle_t *handle,
791                                               status_t status,
792                                               void *userData)
793 {
794     uint32_t event = 0;
795 
796     switch (status)
797     {
798         case kStatus_Success: /* Occurs after Master Transmit/Receive operation has finished. */
799             event = ARM_I2C_EVENT_TRANSFER_DONE;
800             break;
801 
802         case kStatus_I2C_Addr_Nak: /* Occurs in master mode when address is not acknowledged from slave.*/
803             event = ARM_I2C_EVENT_ADDRESS_NACK;
804             break;
805 
806         case kStatus_I2C_ArbitrationLost: /* Occurs in master mode when arbitration is lost.*/
807             event = ARM_I2C_EVENT_ARBITRATION_LOST;
808             break;
809 
810         default:
811             event = ARM_I2C_EVENT_TRANSFER_INCOMPLETE;
812             break;
813     }
814 
815     /* User data is actually CMSIS driver callback. */
816     if (userData != NULL)
817     {
818         ((ARM_I2C_SignalEvent_t)userData)(event);
819     }
820 }
821 
I2C_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event,cmsis_i2c_interrupt_driver_state_t * i2c)822 static int32_t I2C_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event, cmsis_i2c_interrupt_driver_state_t *i2c)
823 {
824     if (0U == (i2c->flags & (uint8_t)I2C_FLAG_INIT))
825     {
826         i2c->cb_event = cb_event; /* cb_event is CMSIS driver callback. */
827         i2c->flags    = (uint8_t)I2C_FLAG_INIT;
828     }
829 
830     return ARM_DRIVER_OK;
831 }
832 
I2C_InterruptUninitialize(cmsis_i2c_interrupt_driver_state_t * i2c)833 static int32_t I2C_InterruptUninitialize(cmsis_i2c_interrupt_driver_state_t *i2c)
834 {
835     i2c->flags = (uint8_t)I2C_FLAG_UNINIT;
836     return ARM_DRIVER_OK;
837 }
838 
I2C_Master_InterruptTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending,cmsis_i2c_interrupt_driver_state_t * i2c)839 static int32_t I2C_Master_InterruptTransmit(
840     uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending, cmsis_i2c_interrupt_driver_state_t *i2c)
841 {
842     int32_t status;
843     int32_t ret;
844     i2c_master_transfer_t masterXfer;
845 
846     /* Check if the I2C bus is idle - if not return busy status. */
847     if (i2c->handle->master_handle.state != 0U)
848     {
849         return ARM_DRIVER_ERROR_BUSY;
850     }
851 
852     /* Create master_handle */
853     I2C_MasterTransferCreateHandle(i2c->resource->base, &(i2c->handle->master_handle),
854                                    KSDK_I2C_MASTER_InterruptCallback, (void *)i2c->cb_event);
855 
856     masterXfer.slaveAddress   = (uint8_t)addr;                      /*7-bit slave address.*/
857     masterXfer.direction      = kI2C_Write;                         /* Transfer direction.*/
858     masterXfer.subaddress     = 0U;                                 /* Sub address */
859     masterXfer.subaddressSize = 0U;                                 /* Size of command buffer.*/
860     masterXfer.data           = (uint8_t *)data;                    /* Transfer buffer.*/
861     masterXfer.dataSize       = num;                                /* Transfer size.*/
862     masterXfer.flags          = (uint32_t)kI2C_TransferDefaultFlag; /* Transfer flag which controls the transfer.*/
863 
864     if ((i2c->resource->base->S & 0x20U) != 0U)
865     {
866         masterXfer.flags |= (uint32_t)kI2C_TransferRepeatedStartFlag;
867     }
868 
869     if (xfer_pending)
870     {
871         masterXfer.flags |= (uint32_t)kI2C_TransferNoStopFlag;
872     }
873 
874     status = I2C_MasterTransferNonBlocking(i2c->resource->base, &(i2c->handle->master_handle), &masterXfer);
875 
876     switch (status)
877     {
878         case kStatus_Success:
879             ret = ARM_DRIVER_OK;
880             break;
881 
882         case kStatus_I2C_Busy:
883             ret = ARM_DRIVER_ERROR_BUSY;
884             break;
885 
886         case kStatus_I2C_Timeout:
887             ret = ARM_DRIVER_ERROR_TIMEOUT;
888             break;
889 
890         default:
891             ret = ARM_DRIVER_ERROR;
892             break;
893     }
894 
895     return ret;
896 }
897 
I2C_Master_InterruptReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending,cmsis_i2c_interrupt_driver_state_t * i2c)898 static int32_t I2C_Master_InterruptReceive(
899     uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending, cmsis_i2c_interrupt_driver_state_t *i2c)
900 {
901     int32_t status;
902     int32_t ret;
903     i2c_master_transfer_t masterXfer;
904 
905     /* Check if the I2C bus is idle - if not return busy status. */
906     if (i2c->handle->master_handle.state != 0U)
907     {
908         return ARM_DRIVER_ERROR_BUSY;
909     }
910 
911     /* Create master_handle */
912     I2C_MasterTransferCreateHandle(i2c->resource->base, &(i2c->handle->master_handle),
913                                    KSDK_I2C_MASTER_InterruptCallback, (void *)i2c->cb_event);
914 
915     masterXfer.slaveAddress   = (uint8_t)addr;                      /*7-bit slave address.*/
916     masterXfer.direction      = kI2C_Read;                          /* Transfer direction.*/
917     masterXfer.subaddress     = 0U;                                 /* Sub address */
918     masterXfer.subaddressSize = 0U;                                 /* Size of command buffer.*/
919     masterXfer.data           = data;                               /* Transfer buffer.*/
920     masterXfer.dataSize       = num;                                /* Transfer size.*/
921     masterXfer.flags          = (uint32_t)kI2C_TransferDefaultFlag; /* Transfer flag which controls the transfer.*/
922 
923     if ((i2c->resource->base->S & 0x20U) != 0U)
924     {
925         masterXfer.flags |= (uint32_t)kI2C_TransferRepeatedStartFlag;
926     }
927 
928     if (xfer_pending)
929     {
930         masterXfer.flags |= (uint32_t)kI2C_TransferNoStopFlag;
931     }
932 
933     status = I2C_MasterTransferNonBlocking(i2c->resource->base, &(i2c->handle->master_handle), &masterXfer);
934 
935     switch (status)
936     {
937         case kStatus_Success:
938             ret = ARM_DRIVER_OK;
939             break;
940 
941         case kStatus_I2C_Busy:
942             ret = ARM_DRIVER_ERROR_BUSY;
943             break;
944 
945         case kStatus_I2C_Timeout:
946             ret = ARM_DRIVER_ERROR_TIMEOUT;
947             break;
948 
949         default:
950             ret = ARM_DRIVER_ERROR;
951             break;
952     }
953 
954     return ret;
955 }
956 
I2C_Slave_InterruptTransmit(const uint8_t * data,uint32_t num,cmsis_i2c_interrupt_driver_state_t * i2c)957 static int32_t I2C_Slave_InterruptTransmit(const uint8_t *data, uint32_t num, cmsis_i2c_interrupt_driver_state_t *i2c)
958 {
959     int32_t status;
960     int32_t ret;
961 
962     /* Create slave_handle */
963     I2C_SlaveTransferCreateHandle(i2c->resource->base, &(i2c->handle->slave_handle), KSDK_I2C_SLAVE_InterruptCallback,
964                                   (void *)i2c->cb_event);
965 
966     status = I2C_SlaveTransferNonBlocking(i2c->resource->base, &(i2c->handle->slave_handle),
967                                           (uint32_t)kI2C_SlaveCompletionEvent);
968 
969     i2c->handle->slave_handle.transfer.data =
970         (uint8_t *)data;                               /* Pointer to buffer with data to transmit to I2C Master */
971     i2c->handle->slave_handle.transfer.dataSize = num; /* Number of data bytes to transmit */
972     i2c->handle->slave_handle.transfer.transferredCount =
973         0; /* Number of bytes actually transferred since start or last repeated start. */
974 
975     switch (status)
976     {
977         case kStatus_Success:
978             ret = ARM_DRIVER_OK;
979             break;
980 
981         case kStatus_I2C_Busy:
982             ret = ARM_DRIVER_ERROR_BUSY;
983             break;
984 
985         default:
986             ret = ARM_DRIVER_ERROR;
987             break;
988     }
989 
990     return ret;
991 }
992 
I2C_Slave_InterruptReceive(uint8_t * data,uint32_t num,cmsis_i2c_interrupt_driver_state_t * i2c)993 static int32_t I2C_Slave_InterruptReceive(uint8_t *data, uint32_t num, cmsis_i2c_interrupt_driver_state_t *i2c)
994 {
995     int32_t status;
996     int32_t ret;
997 
998     i2c->resource->base->C2 = I2C_C2_GCAEN(1); /* Enable general call */
999 
1000     /* Create slave_handle */
1001     I2C_SlaveTransferCreateHandle(i2c->resource->base, &(i2c->handle->slave_handle), KSDK_I2C_SLAVE_InterruptCallback,
1002                                   (void *)i2c->cb_event);
1003 
1004     status = I2C_SlaveTransferNonBlocking(i2c->resource->base, &(i2c->handle->slave_handle),
1005                                           (uint32_t)kI2C_SlaveCompletionEvent);
1006 
1007     i2c->handle->slave_handle.transfer.data     = data; /* Pointer to buffer with data to transmit to I2C Master */
1008     i2c->handle->slave_handle.transfer.dataSize = num;  /* Number of data bytes to transmit */
1009     i2c->handle->slave_handle.transfer.transferredCount =
1010         0; /* Number of bytes actually transferred since start or last repeated start. */
1011 
1012     switch (status)
1013     {
1014         case kStatus_Success:
1015             ret = ARM_DRIVER_OK;
1016             break;
1017 
1018         case kStatus_I2C_Busy:
1019             ret = ARM_DRIVER_ERROR_BUSY;
1020             break;
1021 
1022         default:
1023             ret = ARM_DRIVER_ERROR;
1024             break;
1025     }
1026 
1027     return ret;
1028 }
1029 
I2C_InterruptGetDataCount(cmsis_i2c_interrupt_driver_state_t * i2c)1030 static int32_t I2C_InterruptGetDataCount(cmsis_i2c_interrupt_driver_state_t *i2c)
1031 {
1032     uint32_t cnt; /* The number of currently transferred data bytes */
1033 
1034     if ((i2c->handle->slave_handle.transfer.transferredCount) != 0U)
1035     {
1036         cnt = i2c->handle->slave_handle.transfer.transferredCount;
1037     }
1038     else
1039     {
1040         cnt = (uint32_t) & (i2c->handle->master_handle).transferSize - (uint32_t) &
1041               (i2c->handle->master_handle).transfer.dataSize;
1042     }
1043 
1044     return (int32_t)cnt;
1045 }
1046 
I2C_InterruptControl(uint32_t control,uint32_t arg,cmsis_i2c_interrupt_driver_state_t * i2c)1047 static int32_t I2C_InterruptControl(uint32_t control, uint32_t arg, cmsis_i2c_interrupt_driver_state_t *i2c)
1048 {
1049     uint32_t baudRate_Bps = 0;
1050     int32_t result        = ARM_DRIVER_OK;
1051     switch (control)
1052     {
1053         /* Set Own Slave Address; arg = slave address */
1054         case ARM_I2C_OWN_ADDRESS:
1055             i2c->resource->base->A1 = (uint8_t)(arg << 1U);
1056             break;
1057         /* Set Bus Speed; arg = bus speed */
1058         case ARM_I2C_BUS_SPEED:
1059             switch (arg)
1060             {
1061                 case ARM_I2C_BUS_SPEED_STANDARD:
1062                     baudRate_Bps = 100000;
1063                     break;
1064 
1065                 case ARM_I2C_BUS_SPEED_FAST:
1066                     baudRate_Bps = 400000;
1067                     break;
1068 
1069                 case ARM_I2C_BUS_SPEED_FAST_PLUS:
1070                     baudRate_Bps = 1000000;
1071                     break;
1072 
1073                 default:
1074                     result = ARM_DRIVER_ERROR_UNSUPPORTED;
1075                     break;
1076             }
1077             if (result == ARM_DRIVER_OK)
1078             {
1079                 I2C_MasterSetBaudRate(i2c->resource->base, baudRate_Bps, i2c->resource->GetFreq());
1080             }
1081             break;
1082         /* Not supported */
1083         case ARM_I2C_BUS_CLEAR:
1084             result = ARM_DRIVER_ERROR_UNSUPPORTED;
1085             break;
1086 
1087         /* Aborts the data transfer between Master and Slave for Transmit or Receive */
1088         case ARM_I2C_ABORT_TRANSFER:
1089             if ((i2c->resource->base->C1 & (uint8_t)I2C_C1_MST_MASK) != 0U)
1090             {
1091                 /* Disable master interrupt and send STOP signal */
1092                 (void)I2C_MasterTransferAbort(i2c->resource->base, &(i2c->handle->master_handle));
1093 
1094                 i2c->handle->master_handle.transferSize      = 0;
1095                 i2c->handle->master_handle.transfer.data     = NULL;
1096                 i2c->handle->master_handle.transfer.dataSize = 0;
1097             }
1098             /* If slave receive */
1099             else if (0U == (i2c->resource->base->S & (uint32_t)kI2C_TransferDirectionFlag))
1100             {
1101                 i2c->resource->base->C1 |= (uint8_t)I2C_C1_TXAK_MASK;
1102 
1103                 while (i2c->handle->slave_handle.isBusy)
1104                 {
1105                 }
1106                 /* Disable slave interrupt */
1107 
1108                 I2C_SlaveTransferAbort(i2c->resource->base, &(i2c->handle->slave_handle));
1109 
1110                 i2c->handle->slave_handle.transfer.data     = NULL;
1111                 i2c->handle->slave_handle.transfer.dataSize = 0;
1112             }
1113             else
1114             {
1115                 ; /* Intentional empty */
1116             }
1117             break;
1118         default:
1119             result = ARM_DRIVER_ERROR_UNSUPPORTED;
1120             break;
1121     }
1122     return result;
1123 }
1124 
I2C_InterruptPowerControl(ARM_POWER_STATE state,cmsis_i2c_interrupt_driver_state_t * i2c)1125 static int32_t I2C_InterruptPowerControl(ARM_POWER_STATE state, cmsis_i2c_interrupt_driver_state_t *i2c)
1126 {
1127     int32_t result = ARM_DRIVER_OK;
1128     switch (state)
1129     {
1130         /* Terminates any pending data transfers, disable i2c moduole and i2c clock */
1131         case ARM_POWER_OFF:
1132             if ((i2c->flags & (uint8_t)I2C_FLAG_POWER) != 0U)
1133             {
1134                 (void)I2C_InterruptControl(ARM_I2C_ABORT_TRANSFER, 0, i2c);
1135 
1136                 I2C_MasterDeinit(i2c->resource->base);
1137 
1138                 i2c->flags = (uint8_t)I2C_FLAG_INIT;
1139             }
1140             break;
1141 
1142         /* Not supported */
1143         case ARM_POWER_LOW:
1144             result = ARM_DRIVER_ERROR_UNSUPPORTED;
1145             break;
1146 
1147         /* Enable i2c moduole and i2c clock */
1148         case ARM_POWER_FULL:
1149             if (i2c->flags == (uint8_t)I2C_FLAG_UNINIT)
1150             {
1151                 return ARM_DRIVER_ERROR;
1152             }
1153 
1154             if ((i2c->flags & (uint8_t)I2C_FLAG_POWER) != 0U)
1155             {
1156                 /* Driver already powered */
1157                 break;
1158             }
1159 
1160             CLOCK_EnableClock(s_i2cClocks[I2C_GetInstance(i2c->resource->base)]);
1161             i2c->resource->base->C1 = I2C_C1_IICEN(1);
1162             i2c->flags |= (uint8_t)I2C_FLAG_POWER;
1163             break;
1164 
1165         default:
1166             result = ARM_DRIVER_ERROR_UNSUPPORTED;
1167             break;
1168     }
1169 
1170     return result;
1171 }
1172 
I2C_InterruptGetStatus(cmsis_i2c_interrupt_driver_state_t * i2c)1173 static ARM_I2C_STATUS I2C_InterruptGetStatus(cmsis_i2c_interrupt_driver_state_t *i2c)
1174 {
1175     ARM_I2C_STATUS stat      = {0};
1176     uint32_t ksdk_i2c_status = I2C_SlaveGetStatusFlags(i2c->resource->base);
1177     uint32_t dataSize;
1178 
1179     if (0U == (i2c->resource->base->A1))
1180     {
1181         dataSize       = i2c->handle->master_handle.transfer.dataSize;
1182         stat.direction = (uint32_t)((ksdk_i2c_status & (uint32_t)kI2C_TransferDirectionFlag) !=
1183                                     0U); /* Direction: 0=Transmitter, 1=Receiver.*/
1184         stat.mode      = 1UL;            /* Mode: 0=Slave, 1=Master.*/
1185     }
1186     else
1187     {
1188         dataSize       = i2c->handle->slave_handle.transfer.dataSize;
1189         stat.direction = (uint32_t)(
1190             0UL == (ksdk_i2c_status & (uint8_t)kI2C_TransferDirectionFlag)); /* Direction: 0=Transmitter, 1=Receiver.*/
1191         stat.mode = 0;                                                       /* Mode: 0=Slave, 1=Master.*/
1192     }
1193 
1194     if (dataSize != 0U)
1195     {
1196         stat.busy = 1; /* Busy flag.*/
1197     }
1198     else
1199     {
1200         stat.busy = 0; /* Busy flag.*/
1201     }
1202 
1203     stat.arbitration_lost = (uint32_t)((ksdk_i2c_status & (uint32_t)kI2C_ArbitrationLostFlag) !=
1204                                        0U); /* Master lost arbitration (cleared on start of next Master operation)*/
1205 
1206     return stat;
1207 }
1208 
1209 #endif
1210 
1211 #if (defined(I2C0) && defined(RTE_I2C0) && RTE_I2C0)
1212 /* User needs to provide the implementation for I2C0_GetFreq/InitPins/DeinitPins
1213 in the application for enabling according instance. */
1214 extern uint32_t I2C0_GetFreq(void);
1215 
1216 static cmsis_i2c_resource_t I2C0_Resource = {I2C0, I2C0_GetFreq};
1217 
1218 #if (defined(RTE_I2C0_DMA_EN) && RTE_I2C0_DMA_EN)
1219 
1220 #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
1221 
1222 static cmsis_i2c_dma_resource_t I2C0_DmaResource = {RTE_I2C0_Master_DMA_BASE, RTE_I2C0_Master_DMA_CH,
1223                                                     RTE_I2C0_Master_DMAMUX_BASE, (uint16_t)RTE_I2C0_Master_PERI_SEL
1224 #if FSL_FEATURE_DMA_MODULE_CHANNEL != FSL_FEATURE_DMAMUX_MODULE_CHANNEL
1225                                                     ,
1226                                                     RTE_I2C0_Master_DMAMUX_CH
1227 #endif
1228 };
1229 
1230 static i2c_master_dma_handle_t I2C0_DmaHandle;
1231 static dma_handle_t I2C0_DmaTxRxHandle;
1232 
1233 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1234 ARMCC_SECTION("i2c0_dma_driver_state")
1235 static cmsis_i2c_dma_driver_state_t I2C0_DmaDriverState = {
1236 #else
1237 static cmsis_i2c_dma_driver_state_t I2C0_DmaDriverState   = {
1238 #endif
1239     &I2C0_Resource,
1240     &I2C0_DmaResource,
1241     &I2C0_DmaHandle,
1242     &I2C0_DmaTxRxHandle,
1243 };
1244 
I2C0_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)1245 static int32_t I2C0_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)
1246 {
1247 #ifdef RTE_I2C0_PIN_INIT
1248     RTE_I2C0_PIN_INIT();
1249 #endif
1250     return I2C_Master_DmaInitialize(cb_event, &I2C0_DmaDriverState);
1251 }
1252 
I2C0_Master_DmaUninitialize(void)1253 static int32_t I2C0_Master_DmaUninitialize(void)
1254 {
1255 #ifdef RTE_I2C0_PIN_DEINIT
1256     RTE_I2C0_PIN_DEINIT();
1257 #endif
1258     return I2C_Master_DmaUninitialize(&I2C0_DmaDriverState);
1259 }
1260 
I2C0_Master_DmaPowerControl(ARM_POWER_STATE state)1261 static int32_t I2C0_Master_DmaPowerControl(ARM_POWER_STATE state)
1262 {
1263     return I2C_Master_DmaPowerControl(state, &I2C0_DmaDriverState);
1264 }
1265 
I2C0_Master_DmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1266 static int32_t I2C0_Master_DmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1267 {
1268     return I2C_Master_DmaTransmit(addr, data, num, xfer_pending, &I2C0_DmaDriverState);
1269 }
1270 
I2C0_Master_DmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1271 static int32_t I2C0_Master_DmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1272 {
1273     return I2C_Master_DmaReceive(addr, data, num, xfer_pending, &I2C0_DmaDriverState);
1274 }
1275 
I2C0_Master_DmaGetDataCount(void)1276 static int32_t I2C0_Master_DmaGetDataCount(void)
1277 {
1278     return I2C_Master_DmaGetDataCount(&I2C0_DmaDriverState);
1279 }
1280 
I2C0_Master_DmaControl(uint32_t control,uint32_t arg)1281 static int32_t I2C0_Master_DmaControl(uint32_t control, uint32_t arg)
1282 {
1283     return I2C_Master_DmaControl(control, arg, &I2C0_DmaDriverState);
1284 }
1285 
I2C0_Master_DmaGetStatus(void)1286 static ARM_I2C_STATUS I2C0_Master_DmaGetStatus(void)
1287 {
1288     return I2C_Master_DmaGetStatus(&I2C0_DmaDriverState);
1289 }
1290 
1291 #endif
1292 
1293 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
1294 
1295 static cmsis_i2c_edma_resource_t I2C0_EdmaResource = {RTE_I2C0_Master_DMA_BASE, RTE_I2C0_Master_DMA_CH,
1296                                                       RTE_I2C0_Master_DMAMUX_BASE, (uint16_t)RTE_I2C0_Master_PERI_SEL};
1297 
1298 static i2c_master_edma_handle_t I2C0_EdmaHandle;
1299 static edma_handle_t I2C0_EdmaTxRxHandle;
1300 
1301 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1302 ARMCC_SECTION("i2c0_edma_driver_state")
1303 static cmsis_i2c_edma_driver_state_t I2C0_EdmaDriverState = {
1304 #else
1305 static cmsis_i2c_edma_driver_state_t I2C0_EdmaDriverState = {
1306 #endif
1307     &I2C0_Resource,
1308     &I2C0_EdmaResource,
1309     &I2C0_EdmaHandle,
1310     &I2C0_EdmaTxRxHandle,
1311 };
1312 
I2C0_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)1313 static int32_t I2C0_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)
1314 {
1315 #ifdef RTE_I2C0_PIN_INIT
1316     RTE_I2C0_PIN_INIT();
1317 #endif
1318     return I2C_Master_EdmaInitialize(cb_event, &I2C0_EdmaDriverState);
1319 }
1320 
I2C0_Master_EdmaUninitialize(void)1321 static int32_t I2C0_Master_EdmaUninitialize(void)
1322 {
1323 #ifdef RTE_I2C0_PIN_DEINIT
1324     RTE_I2C0_PIN_DEINIT();
1325 #endif
1326     return I2C_Master_EdmaUninitialize(&I2C0_EdmaDriverState);
1327 }
1328 
I2C0_Master_EdmaPowerControl(ARM_POWER_STATE state)1329 static int32_t I2C0_Master_EdmaPowerControl(ARM_POWER_STATE state)
1330 {
1331     return I2C_Master_EdmaPowerControl(state, &I2C0_EdmaDriverState);
1332 }
1333 
I2C0_Master_EdmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1334 static int32_t I2C0_Master_EdmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1335 {
1336     return I2C_Master_EdmaTransmit(addr, data, num, xfer_pending, &I2C0_EdmaDriverState);
1337 }
1338 
I2C0_Master_EdmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1339 static int32_t I2C0_Master_EdmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1340 {
1341     return I2C_Master_EdmaReceive(addr, data, num, xfer_pending, &I2C0_EdmaDriverState);
1342 }
1343 
I2C0_Master_EdmaGetDataCount(void)1344 static int32_t I2C0_Master_EdmaGetDataCount(void)
1345 {
1346     return I2C_Master_EdmaGetDataCount(&I2C0_EdmaDriverState);
1347 }
1348 
I2C0_Master_EdmaControl(uint32_t control,uint32_t arg)1349 static int32_t I2C0_Master_EdmaControl(uint32_t control, uint32_t arg)
1350 {
1351     return I2C_Master_EdmaControl(control, arg, &I2C0_EdmaDriverState);
1352 }
1353 
I2C0_Master_EdmaGetStatus(void)1354 static ARM_I2C_STATUS I2C0_Master_EdmaGetStatus(void)
1355 {
1356     return I2C_Master_EdmaGetStatus(&I2C0_EdmaDriverState);
1357 }
1358 
1359 #endif
1360 
1361 #else
1362 
1363 static cmsis_i2c_handle_t I2C0_handle;
1364 
1365 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1366 ARMCC_SECTION("i2c0_interrupt_driver_state")
1367 static cmsis_i2c_interrupt_driver_state_t I2C0_InterruptDriverState = {
1368 #else
1369 static cmsis_i2c_interrupt_driver_state_t I2C0_InterruptDriverState = {
1370 #endif
1371     &I2C0_Resource,
1372     &I2C0_handle,
1373 
1374 };
1375 
I2C0_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)1376 static int32_t I2C0_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)
1377 {
1378 #ifdef RTE_I2C0_PIN_INIT
1379     RTE_I2C0_PIN_INIT();
1380 #endif
1381     return I2C_InterruptInitialize(cb_event, &I2C0_InterruptDriverState);
1382 }
1383 
I2C0_InterruptUninitialize(void)1384 static int32_t I2C0_InterruptUninitialize(void)
1385 {
1386 #ifdef RTE_I2C0_PIN_DEINIT
1387     RTE_I2C0_PIN_DEINIT();
1388 #endif
1389     return I2C_InterruptUninitialize(&I2C0_InterruptDriverState);
1390 }
1391 
I2C0_InterruptPowerControl(ARM_POWER_STATE state)1392 static int32_t I2C0_InterruptPowerControl(ARM_POWER_STATE state)
1393 {
1394     return I2C_InterruptPowerControl(state, &I2C0_InterruptDriverState);
1395 }
1396 
I2C0_Master_InterruptTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1397 static int32_t I2C0_Master_InterruptTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1398 {
1399     return I2C_Master_InterruptTransmit(addr, data, num, xfer_pending, &I2C0_InterruptDriverState);
1400 }
1401 
I2C0_Master_InterruptReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1402 static int32_t I2C0_Master_InterruptReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1403 {
1404     return I2C_Master_InterruptReceive(addr, data, num, xfer_pending, &I2C0_InterruptDriverState);
1405 }
1406 
I2C0_Slave_InterruptTransmit(const uint8_t * data,uint32_t num)1407 static int32_t I2C0_Slave_InterruptTransmit(const uint8_t *data, uint32_t num)
1408 {
1409     return I2C_Slave_InterruptTransmit(data, num, &I2C0_InterruptDriverState);
1410 }
1411 
I2C0_Slave_InterruptReceive(uint8_t * data,uint32_t num)1412 static int32_t I2C0_Slave_InterruptReceive(uint8_t *data, uint32_t num)
1413 {
1414     return I2C_Slave_InterruptReceive(data, num, &I2C0_InterruptDriverState);
1415 }
1416 
I2C0_InterruptGetDataCount(void)1417 static int32_t I2C0_InterruptGetDataCount(void)
1418 {
1419     return I2C_InterruptGetDataCount(&I2C0_InterruptDriverState);
1420 }
1421 
I2C0_InterruptControl(uint32_t control,uint32_t arg)1422 static int32_t I2C0_InterruptControl(uint32_t control, uint32_t arg)
1423 {
1424     return I2C_InterruptControl(control, arg, &I2C0_InterruptDriverState);
1425 }
1426 
I2C0_InterruptGetStatus(void)1427 static ARM_I2C_STATUS I2C0_InterruptGetStatus(void)
1428 {
1429     return I2C_InterruptGetStatus(&I2C0_InterruptDriverState);
1430 }
1431 
1432 #endif
1433 
1434 ARM_DRIVER_I2C Driver_I2C0 = {I2Cx_GetVersion,
1435                               I2Cx_GetCapabilities,
1436 #if (defined(RTE_I2C0_DMA_EN) && RTE_I2C0_DMA_EN)
1437 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
1438                               I2C0_Master_EdmaInitialize,
1439                               I2C0_Master_EdmaUninitialize,
1440                               I2C0_Master_EdmaPowerControl,
1441                               I2C0_Master_EdmaTransmit,
1442                               I2C0_Master_EdmaReceive,
1443                               NULL,
1444                               NULL,
1445                               I2C0_Master_EdmaGetDataCount,
1446                               I2C0_Master_EdmaControl,
1447                               I2C0_Master_EdmaGetStatus
1448 #else
1449                               I2C0_Master_DmaInitialize,
1450                               I2C0_Master_DmaUninitialize,
1451                               I2C0_Master_DmaPowerControl,
1452                               I2C0_Master_DmaTransmit,
1453                               I2C0_Master_DmaReceive,
1454                               NULL,
1455                               NULL,
1456                               I2C0_Master_DmaGetDataCount,
1457                               I2C0_Master_DmaControl,
1458                               I2C0_Master_DmaGetStatus
1459 #endif
1460 #else
1461                               I2C0_InterruptInitialize,
1462                               I2C0_InterruptUninitialize,
1463                               I2C0_InterruptPowerControl,
1464                               I2C0_Master_InterruptTransmit,
1465                               I2C0_Master_InterruptReceive,
1466                               I2C0_Slave_InterruptTransmit,
1467                               I2C0_Slave_InterruptReceive,
1468                               I2C0_InterruptGetDataCount,
1469                               I2C0_InterruptControl,
1470                               I2C0_InterruptGetStatus
1471 #endif
1472 };
1473 
1474 #endif
1475 
1476 #if defined(I2C1) && defined(RTE_I2C1) && RTE_I2C1
1477 
1478 /* User needs to provide the implementation for I2C1_GetFreq/InitPins/DeinitPins
1479 in the application for enabling according instance. */
1480 extern uint32_t I2C1_GetFreq(void);
1481 
1482 static cmsis_i2c_resource_t I2C1_Resource = {I2C1, I2C1_GetFreq};
1483 
1484 #if (defined(RTE_I2C1_DMA_EN) && RTE_I2C1_DMA_EN)
1485 
1486 #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
1487 
1488 static cmsis_i2c_dma_resource_t I2C1_DmaResource = {RTE_I2C1_Master_DMA_BASE, RTE_I2C1_Master_DMA_CH,
1489                                                     RTE_I2C1_Master_DMAMUX_BASE, RTE_I2C1_Master_PERI_SEL
1490 #if FSL_FEATURE_DMA_MODULE_CHANNEL != FSL_FEATURE_DMAMUX_MODULE_CHANNEL
1491                                                     ,
1492                                                     RTE_I2C1_Master_DMAMUX_CH
1493 #endif
1494 };
1495 
1496 static i2c_master_dma_handle_t I2C1_DmaHandle;
1497 static dma_handle_t I2C1_DmaTxRxHandle;
1498 
1499 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1500 ARMCC_SECTION("i2c1_dma_driver_state")
1501 static cmsis_i2c_dma_driver_state_t I2C1_DmaDriverState = {
1502 #else
1503 static cmsis_i2c_dma_driver_state_t I2C1_DmaDriverState   = {
1504 #endif
1505     &I2C1_Resource,
1506     &I2C1_DmaResource,
1507     &I2C1_DmaHandle,
1508     &I2C1_DmaTxRxHandle,
1509 };
1510 
I2C1_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)1511 static int32_t I2C1_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)
1512 {
1513 #ifdef RTE_I2C1_PIN_INIT
1514     RTE_I2C1_PIN_INIT();
1515 #endif
1516     return I2C_Master_DmaInitialize(cb_event, &I2C1_DmaDriverState);
1517 }
1518 
I2C1_Master_DmaUninitialize(void)1519 static int32_t I2C1_Master_DmaUninitialize(void)
1520 {
1521 #ifdef RTE_I2C1_PIN_DEINIT
1522     RTE_I2C1_PIN_DEINIT();
1523 #endif
1524     return I2C_Master_DmaUninitialize(&I2C1_DmaDriverState);
1525 }
1526 
I2C1_Master_DmaPowerControl(ARM_POWER_STATE state)1527 static int32_t I2C1_Master_DmaPowerControl(ARM_POWER_STATE state)
1528 {
1529     return I2C_Master_DmaPowerControl(state, &I2C1_DmaDriverState);
1530 }
1531 
I2C1_Master_DmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1532 static int32_t I2C1_Master_DmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1533 {
1534     return I2C_Master_DmaTransmit(addr, data, num, xfer_pending, &I2C1_DmaDriverState);
1535 }
1536 
I2C1_Master_DmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1537 static int32_t I2C1_Master_DmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1538 {
1539     return I2C_Master_DmaReceive(addr, data, num, xfer_pending, &I2C1_DmaDriverState);
1540 }
1541 
I2C1_Master_DmaGetDataCount(void)1542 static int32_t I2C1_Master_DmaGetDataCount(void)
1543 {
1544     return I2C_Master_DmaGetDataCount(&I2C1_DmaDriverState);
1545 }
1546 
I2C1_Master_DmaControl(uint32_t control,uint32_t arg)1547 static int32_t I2C1_Master_DmaControl(uint32_t control, uint32_t arg)
1548 {
1549     return I2C_Master_DmaControl(control, arg, &I2C1_DmaDriverState);
1550 }
1551 
I2C1_Master_DmaGetStatus(void)1552 static ARM_I2C_STATUS I2C1_Master_DmaGetStatus(void)
1553 {
1554     return I2C_Master_DmaGetStatus(&I2C1_DmaDriverState);
1555 }
1556 
1557 #endif
1558 
1559 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
1560 
1561 static cmsis_i2c_edma_resource_t I2C1_EdmaResource = {RTE_I2C1_Master_DMA_BASE, RTE_I2C1_Master_DMA_CH,
1562                                                       RTE_I2C1_Master_DMAMUX_BASE, (uint16_t)RTE_I2C1_Master_PERI_SEL};
1563 
1564 static i2c_master_edma_handle_t I2C1_EdmaHandle;
1565 static edma_handle_t I2C1_EdmaTxRxHandle;
1566 
1567 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1568 ARMCC_SECTION("i2c1_edma_driver_state")
1569 static cmsis_i2c_edma_driver_state_t I2C1_EdmaDriverState = {
1570 #else
1571 static cmsis_i2c_edma_driver_state_t I2C1_EdmaDriverState = {
1572 #endif
1573     &I2C1_Resource,
1574     &I2C1_EdmaResource,
1575     &I2C1_EdmaHandle,
1576     &I2C1_EdmaTxRxHandle,
1577 };
1578 
I2C1_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)1579 static int32_t I2C1_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)
1580 {
1581 #ifdef RTE_I2C1_PIN_INIT
1582     RTE_I2C1_PIN_INIT();
1583 #endif
1584     return I2C_Master_EdmaInitialize(cb_event, &I2C1_EdmaDriverState);
1585 }
1586 
I2C1_Master_EdmaUninitialize(void)1587 static int32_t I2C1_Master_EdmaUninitialize(void)
1588 {
1589 #ifdef RTE_I2C1_PIN_DEINIT
1590     RTE_I2C1_PIN_DEINIT();
1591 #endif
1592     return I2C_Master_EdmaUninitialize(&I2C1_EdmaDriverState);
1593 }
1594 
I2C1_Master_EdmaPowerControl(ARM_POWER_STATE state)1595 static int32_t I2C1_Master_EdmaPowerControl(ARM_POWER_STATE state)
1596 {
1597     return I2C_Master_EdmaPowerControl(state, &I2C1_EdmaDriverState);
1598 }
1599 
I2C1_Master_EdmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1600 static int32_t I2C1_Master_EdmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1601 {
1602     return I2C_Master_EdmaTransmit(addr, data, num, xfer_pending, &I2C1_EdmaDriverState);
1603 }
1604 
I2C1_Master_EdmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1605 static int32_t I2C1_Master_EdmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1606 {
1607     return I2C_Master_EdmaReceive(addr, data, num, xfer_pending, &I2C1_EdmaDriverState);
1608 }
1609 
I2C1_Master_EdmaGetDataCount(void)1610 static int32_t I2C1_Master_EdmaGetDataCount(void)
1611 {
1612     return I2C_Master_EdmaGetDataCount(&I2C1_EdmaDriverState);
1613 }
1614 
I2C1_Master_EdmaControl(uint32_t control,uint32_t arg)1615 static int32_t I2C1_Master_EdmaControl(uint32_t control, uint32_t arg)
1616 {
1617     return I2C_Master_EdmaControl(control, arg, &I2C1_EdmaDriverState);
1618 }
1619 
I2C1_Master_EdmaGetStatus(void)1620 static ARM_I2C_STATUS I2C1_Master_EdmaGetStatus(void)
1621 {
1622     return I2C_Master_EdmaGetStatus(&I2C1_EdmaDriverState);
1623 }
1624 
1625 #endif
1626 
1627 #else
1628 
1629 static cmsis_i2c_handle_t I2C1_Handle;
1630 
1631 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1632 ARMCC_SECTION("i2c1_interrupt_driver_state")
1633 static cmsis_i2c_interrupt_driver_state_t I2C1_InterruptDriverState = {
1634 #else
1635 static cmsis_i2c_interrupt_driver_state_t I2C1_InterruptDriverState = {
1636 #endif
1637     &I2C1_Resource,
1638     &I2C1_Handle,
1639 };
1640 
I2C1_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)1641 static int32_t I2C1_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)
1642 {
1643 #ifdef RTE_I2C1_PIN_INIT
1644     RTE_I2C1_PIN_INIT();
1645 #endif
1646     return I2C_InterruptInitialize(cb_event, &I2C1_InterruptDriverState);
1647 }
1648 
I2C1_InterruptUninitialize(void)1649 static int32_t I2C1_InterruptUninitialize(void)
1650 {
1651 #ifdef RTE_I2C1_PIN_DEINIT
1652     RTE_I2C1_PIN_DEINIT();
1653 #endif
1654     return I2C_InterruptUninitialize(&I2C1_InterruptDriverState);
1655 }
1656 
I2C1_InterruptPowerControl(ARM_POWER_STATE state)1657 static int32_t I2C1_InterruptPowerControl(ARM_POWER_STATE state)
1658 {
1659     return I2C_InterruptPowerControl(state, &I2C1_InterruptDriverState);
1660 }
1661 
I2C1_Master_InterruptTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1662 static int32_t I2C1_Master_InterruptTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1663 {
1664     return I2C_Master_InterruptTransmit(addr, data, num, xfer_pending, &I2C1_InterruptDriverState);
1665 }
1666 
I2C1_Master_InterruptReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1667 static int32_t I2C1_Master_InterruptReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1668 {
1669     return I2C_Master_InterruptReceive(addr, data, num, xfer_pending, &I2C1_InterruptDriverState);
1670 }
1671 
I2C1_Slave_InterruptTransmit(const uint8_t * data,uint32_t num)1672 static int32_t I2C1_Slave_InterruptTransmit(const uint8_t *data, uint32_t num)
1673 {
1674     return I2C_Slave_InterruptTransmit(data, num, &I2C1_InterruptDriverState);
1675 }
1676 
I2C1_Slave_InterruptReceive(uint8_t * data,uint32_t num)1677 static int32_t I2C1_Slave_InterruptReceive(uint8_t *data, uint32_t num)
1678 {
1679     return I2C_Slave_InterruptReceive(data, num, &I2C1_InterruptDriverState);
1680 }
1681 
I2C1_InterruptGetDataCount(void)1682 static int32_t I2C1_InterruptGetDataCount(void)
1683 {
1684     return I2C_InterruptGetDataCount(&I2C1_InterruptDriverState);
1685 }
1686 
I2C1_InterruptControl(uint32_t control,uint32_t arg)1687 static int32_t I2C1_InterruptControl(uint32_t control, uint32_t arg)
1688 {
1689     return I2C_InterruptControl(control, arg, &I2C1_InterruptDriverState);
1690 }
1691 
I2C1_InterruptGetStatus(void)1692 static ARM_I2C_STATUS I2C1_InterruptGetStatus(void)
1693 {
1694     return I2C_InterruptGetStatus(&I2C1_InterruptDriverState);
1695 }
1696 
1697 #endif
1698 
1699 ARM_DRIVER_I2C Driver_I2C1 = {I2Cx_GetVersion,
1700                               I2Cx_GetCapabilities,
1701 #if (defined(RTE_I2C1_DMA_EN) && RTE_I2C1_DMA_EN)
1702 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
1703                               I2C1_Master_EdmaInitialize,
1704                               I2C1_Master_EdmaUninitialize,
1705                               I2C1_Master_EdmaPowerControl,
1706                               I2C1_Master_EdmaTransmit,
1707                               I2C1_Master_EdmaReceive,
1708                               NULL,
1709                               NULL,
1710                               I2C1_Master_EdmaGetDataCount,
1711                               I2C1_Master_EdmaControl,
1712                               I2C1_Master_EdmaGetStatus
1713 #else
1714                               I2C1_Master_DmaInitialize,
1715                               I2C1_Master_DmaUninitialize,
1716                               I2C1_Master_DmaPowerControl,
1717                               I2C1_Master_DmaTransmit,
1718                               I2C1_Master_DmaReceive,
1719                               NULL,
1720                               NULL,
1721                               I2C1_Master_DmaGetDataCount,
1722                               I2C1_Master_DmaControl,
1723                               I2C1_Master_DmaGetStatus
1724 #endif
1725 #else
1726                               I2C1_InterruptInitialize,
1727                               I2C1_InterruptUninitialize,
1728                               I2C1_InterruptPowerControl,
1729                               I2C1_Master_InterruptTransmit,
1730                               I2C1_Master_InterruptReceive,
1731                               I2C1_Slave_InterruptTransmit,
1732                               I2C1_Slave_InterruptReceive,
1733                               I2C1_InterruptGetDataCount,
1734                               I2C1_InterruptControl,
1735                               I2C1_InterruptGetStatus
1736 #endif
1737 };
1738 
1739 #endif
1740 
1741 #if (defined(I2C2) && defined(RTE_I2C2) && RTE_I2C2)
1742 
1743 /* User needs to provide the implementation for I2C2_GetFreq/InitPins/DeinitPins
1744 in the application for enabling according instance. */
1745 extern uint32_t I2C2_GetFreq(void);
1746 
1747 static cmsis_i2c_resource_t I2C2_Resource = {I2C2, I2C2_GetFreq};
1748 
1749 #if (defined(RTE_I2C2_DMA_EN) && RTE_I2C2_DMA_EN)
1750 
1751 #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
1752 
1753 static cmsis_i2c_dma_resource_t I2C2_DmaResource = {RTE_I2C2_Master_DMA_BASE, RTE_I2C2_Master_DMA_CH,
1754                                                     RTE_I2C2_Master_DMAMUX_BASE, RTE_I2C2_Master_PERI_SEL
1755 #if FSL_FEATURE_DMA_MODULE_CHANNEL != FSL_FEATURE_DMAMUX_MODULE_CHANNEL
1756                                                     ,
1757                                                     RTE_I2C2_Master_DMAMUX_CH
1758 #endif
1759 };
1760 
1761 static i2c_master_dma_handle_t I2C2_DmaHandle;
1762 static dma_handle_t I2C2_DmaTxRxHandle;
1763 
1764 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1765 ARMCC_SECTION("i2c2_dma_driver_state")
1766 static cmsis_i2c_dma_driver_state_t I2C2_DmaDriverState = {
1767 #else
1768 static cmsis_i2c_dma_driver_state_t I2C2_DmaDriverState   = {
1769 #endif
1770     &I2C2_Resource,
1771     &I2C2_DmaResource,
1772     &I2C2_DmaHandle,
1773     &I2C2_DmaTxRxHandle,
1774 };
1775 
I2C2_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)1776 static int32_t I2C2_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)
1777 {
1778 #ifdef RTE_I2C2_PIN_INIT
1779     RTE_I2C2_PIN_INIT();
1780 #endif
1781     return I2C_Master_DmaInitialize(cb_event, &I2C2_DmaDriverState);
1782 }
1783 
I2C2_Master_DmaUninitialize(void)1784 static int32_t I2C2_Master_DmaUninitialize(void)
1785 {
1786 #ifdef RTE_I2C2_PIN_DEINIT
1787     RTE_I2C2_PIN_DEINIT();
1788 #endif
1789     return I2C_Master_DmaUninitialize(&I2C2_DmaDriverState);
1790 }
1791 
I2C2_Master_DmaPowerControl(ARM_POWER_STATE state)1792 static int32_t I2C2_Master_DmaPowerControl(ARM_POWER_STATE state)
1793 {
1794     return I2C_Master_DmaPowerControl(&I2C2_DmaDriverState);
1795 }
1796 
I2C2_Master_DmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1797 static int32_t I2C2_Master_DmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1798 {
1799     return I2C_Master_DmaTransmit(addr, data, num, xfer_pending, &I2C2_DmaDriverState);
1800 }
1801 
I2C2_Master_DmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1802 static int32_t I2C2_Master_DmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1803 {
1804     return I2C_Master_DmaReceive(addr, data, num, xfer_pending, &I2C2_DmaDriverState);
1805 }
1806 
I2C2_Master_DmaGetDataCount(void)1807 static int32_t I2C2_Master_DmaGetDataCount(void)
1808 {
1809     return I2C_Master_DmaGetDataCount(&I2C2_DmaDriverState);
1810 }
1811 
I2C2_Master_DmaControl(uint32_t control,uint32_t arg)1812 static int32_t I2C2_Master_DmaControl(uint32_t control, uint32_t arg)
1813 {
1814     return I2C_Master_DmaControl(control, arg, &I2C2_DmaDriverState);
1815 }
1816 
I2C2_Master_DmaGetStatus(void)1817 static ARM_I2C_STATUS I2C2_Master_DmaGetStatus(void)
1818 {
1819     return I2C_Master_DmaGetStatus(&I2C2_DmaDriverState);
1820 }
1821 
1822 #endif
1823 
1824 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
1825 
1826 static cmsis_i2c_edma_resource_t I2C2_EdmaResource = {RTE_I2C2_Master_DMA_BASE, RTE_I2C2_Master_DMA_CH,
1827                                                       RTE_I2C2_Master_DMAMUX_BASE, RTE_I2C2_Master_PERI_SEL};
1828 
1829 static i2c_master_edma_handle_t I2C2_EdmaHandle;
1830 static edma_handle_t I2C2_EdmaTxRxHandle;
1831 
1832 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1833 ARMCC_SECTION("i2c2_edma_driver_state")
1834 static cmsis_i2c_edma_driver_state_t I2C2_EdmaDriverState = {
1835 #else
1836 static cmsis_i2c_edma_driver_state_t I2C2_EdmaDriverState = {
1837 #endif
1838     &I2C2_Resource,
1839     &I2C2_EdmaResource,
1840     &I2C2_EdmaHandle,
1841     &I2C2_EdmaTxRxHandle,
1842 };
1843 
I2C2_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)1844 static int32_t I2C2_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)
1845 {
1846 #ifdef RTE_I2C2_PIN_INIT
1847     RTE_I2C2_PIN_INIT();
1848 #endif
1849     return I2C_Master_EdmaInitialize(cb_event, &I2C2_EdmaDriverState);
1850 }
1851 
I2C2_Master_EdmaUninitialize(void)1852 static int32_t I2C2_Master_EdmaUninitialize(void)
1853 {
1854 #ifdef RTE_I2C2_PIN_DEINIT
1855     RTE_I2C2_PIN_DEINIT();
1856 #endif
1857     return I2C_Master_EdmaUninitialize(&I2C2_EdmaDriverState);
1858 }
1859 
I2C2_Master_EdmaPowerControl(ARM_POWER_STATE state)1860 static int32_t I2C2_Master_EdmaPowerControl(ARM_POWER_STATE state)
1861 {
1862     return I2C_Master_EdmaPowerControl(state, &I2C2_EdmaDriverState);
1863 }
1864 
I2C2_Master_EdmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1865 static int32_t I2C2_Master_EdmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1866 {
1867     return I2C_Master_EdmaTransmit(addr, data, num, xfer_pending, &I2C2_EdmaDriverState);
1868 }
1869 
I2C2_Master_EdmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1870 static int32_t I2C2_Master_EdmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1871 {
1872     return I2C_Master_EdmaReceive(addr, data, num, xfer_pending, &I2C2_EdmaDriverState);
1873 }
1874 
I2C2_Master_EdmaGetDataCount(void)1875 static int32_t I2C2_Master_EdmaGetDataCount(void)
1876 {
1877     return I2C_Master_EdmaGetDataCount(&I2C2_EdmaDriverState);
1878 }
1879 
I2C2_Master_EdmaControl(uint32_t control,uint32_t arg)1880 static int32_t I2C2_Master_EdmaControl(uint32_t control, uint32_t arg)
1881 {
1882     return I2C_Master_EdmaControl(control, arg, &I2C2_EdmaDriverState);
1883 }
1884 
I2C2_Master_EdmaGetStatus(void)1885 static ARM_I2C_STATUS I2C2_Master_EdmaGetStatus(void)
1886 {
1887     return I2C_Master_EdmaGetStatus(&I2C2_EdmaDriverState);
1888 }
1889 
1890 #endif
1891 
1892 #else
1893 
1894 static cmsis_i2c_handle_t I2C2_Handle;
1895 
1896 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
1897 ARMCC_SECTION("i2c2_interrupt_driver_state")
1898 static cmsis_i2c_interrupt_driver_state_t I2C2_InterruptDriverState = {
1899 #else
1900 static cmsis_i2c_interrupt_driver_state_t I2C2_InterruptDriverState = {
1901 #endif
1902     &I2C2_Resource,
1903     &I2C2_Handle,
1904 
1905 };
1906 
I2C2_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)1907 static int32_t I2C2_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)
1908 {
1909 #ifdef RTE_I2C2_PIN_INIT
1910     RTE_I2C2_PIN_INIT();
1911 #endif
1912     return I2C_InterruptInitialize(cb_event, &I2C2_InterruptDriverState);
1913 }
1914 
I2C2_InterruptUninitialize(void)1915 static int32_t I2C2_InterruptUninitialize(void)
1916 {
1917 #ifdef RTE_I2C2_PIN_DEINIT
1918     RTE_I2C2_PIN_DEINIT();
1919 #endif
1920     return I2C_InterruptUninitialize(&I2C2_InterruptDriverState);
1921 }
1922 
I2C2_InterruptPowerControl(ARM_POWER_STATE state)1923 static int32_t I2C2_InterruptPowerControl(ARM_POWER_STATE state)
1924 {
1925     return I2C_InterruptPowerControl(state, &I2C2_InterruptDriverState);
1926 }
1927 
I2C2_Master_InterruptTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)1928 static int32_t I2C2_Master_InterruptTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
1929 {
1930     return I2C_Master_InterruptTransmit(addr, data, num, xfer_pending, &I2C2_InterruptDriverState);
1931 }
1932 
I2C2_Master_InterruptReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)1933 static int32_t I2C2_Master_InterruptReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
1934 {
1935     return I2C_Master_InterruptReceive(addr, data, num, xfer_pending, &I2C2_InterruptDriverState);
1936 }
1937 
I2C2_Slave_InterruptTransmit(const uint8_t * data,uint32_t num)1938 static int32_t I2C2_Slave_InterruptTransmit(const uint8_t *data, uint32_t num)
1939 {
1940     return I2C_Slave_InterruptTransmit(data, num, &I2C2_InterruptDriverState);
1941 }
1942 
I2C2_Slave_InterruptReceive(uint8_t * data,uint32_t num)1943 static int32_t I2C2_Slave_InterruptReceive(uint8_t *data, uint32_t num)
1944 {
1945     return I2C_Slave_InterruptReceive(data, num, &I2C2_InterruptDriverState);
1946 }
1947 
I2C2_InterruptGetDataCount(void)1948 static int32_t I2C2_InterruptGetDataCount(void)
1949 {
1950     return I2C_InterruptGetDataCount(&I2C2_InterruptDriverState);
1951 }
1952 
I2C2_InterruptControl(uint32_t control,uint32_t arg)1953 static int32_t I2C2_InterruptControl(uint32_t control, uint32_t arg)
1954 {
1955     return I2C_InterruptControl(control, arg, &I2C2_InterruptDriverState);
1956 }
1957 
I2C2_InterruptGetStatus(void)1958 static ARM_I2C_STATUS I2C2_InterruptGetStatus(void)
1959 {
1960     return I2C_InterruptGetStatus(&I2C2_InterruptDriverState);
1961 }
1962 
1963 #endif
1964 
1965 ARM_DRIVER_I2C Driver_I2C2 = {I2Cx_GetVersion,
1966                               I2Cx_GetCapabilities,
1967 #if (defined(RTE_I2C2_DMA_EN) && RTE_I2C2_DMA_EN)
1968 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
1969                               I2C2_Master_EdmaInitialize,
1970                               I2C2_Master_EdmaUninitialize,
1971                               I2C2_Master_EdmaPowerControl,
1972                               I2C2_Master_EdmaTransmit,
1973                               I2C2_Master_EdmaReceive,
1974                               NULL,
1975                               NULL,
1976                               I2C2_Master_EdmaGetDataCount,
1977                               I2C2_Master_EdmaControl,
1978                               I2C2_Master_EdmaGetStatus
1979 #else
1980                               I2C2_Master_DmaInitialize,
1981                               I2C2_Master_DmaUninitialize,
1982                               I2C2_Master_DmaPowerControl,
1983                               I2C2_Master_DmaTransmit,
1984                               I2C2_Master_DmaReceive,
1985                               NULL,
1986                               NULL,
1987                               I2C2_Master_DmaGetDataCount,
1988                               I2C2_Master_DmaControl,
1989                               I2C2_Master_DmaGetStatus
1990 #endif
1991 #else
1992                               I2C2_InterruptInitialize,
1993                               I2C2_InterruptUninitialize,
1994                               I2C2_InterruptPowerControl,
1995                               I2C2_Master_InterruptTransmit,
1996                               I2C2_Master_InterruptReceive,
1997                               I2C2_Slave_InterruptTransmit,
1998                               I2C2_Slave_InterruptReceive,
1999                               I2C2_InterruptGetDataCount,
2000                               I2C2_InterruptControl,
2001                               I2C2_InterruptGetStatus
2002 #endif
2003 };
2004 
2005 #endif
2006 
2007 #if (defined(I2C3) && defined(RTE_I2C3) && RTE_I2C3)
2008 
2009 /* User needs to provide the implementation for I2C3_GetFreq/InitPins/DeinitPins
2010 in the application for enabling according instance. */
2011 extern uint32_t I2C3_GetFreq(void);
2012 
2013 static cmsis_i2c_resource_t I2C3_Resource = {I2C3, I2C3_GetFreq};
2014 
2015 #if (defined(RTE_I2C3_DMA_EN) && RTE_I2C3_DMA_EN)
2016 
2017 #if (defined(FSL_FEATURE_SOC_DMA_COUNT) && FSL_FEATURE_SOC_DMA_COUNT)
2018 
2019 static cmsis_i2c_dma_resource_t I2C3_DmaResource = {RTE_I2C3_Master_DMA_BASE, RTE_I2C3_Master_DMA_CH,
2020                                                     RTE_I2C3_Master_DMAMUX_BASE, RTE_I2C3_Master_PERI_SEL
2021 #if FSL_FEATURE_DMA_MODULE_CHANNEL != FSL_FEATURE_DMAMUX_MODULE_CHANNEL
2022                                                     ,
2023                                                     RTE_I2C1_Master_DMAMUX_CH
2024 #endif
2025 };
2026 
2027 static i2c_master_dma_handle_t I2C3_DmaHandle;
2028 static dma_handle_t I2C3_DmaTxRxHandle;
2029 
2030 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
2031 ARMCC_SECTION("i2c3_dma_driver_state")
2032 static cmsis_i2c_dma_driver_state_t I2C3_DmaDriverState = {
2033 #else
2034 static cmsis_i2c_dma_driver_state_t I2C3_DmaDriverState   = {
2035 #endif
2036     &I2C3_Resource,
2037     &I2C3_DmaResource,
2038     &I2C3_DmaHandle,
2039     &I2C3_DmaTxRxHandle,
2040 };
2041 
I2C3_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)2042 static int32_t I2C3_Master_DmaInitialize(ARM_I2C_SignalEvent_t cb_event)
2043 {
2044 #ifdef RTE_I2C3_PIN_INIT
2045     RTE_I2C3_PIN_INIT();
2046 #endif
2047     return I2C_Master_DmaInitialize(cb_event, &I2C3_DmaDriverState);
2048 }
2049 
I2C3_Master_DmaUninitialize(void)2050 static int32_t I2C3_Master_DmaUninitialize(void)
2051 {
2052 #ifdef RTE_I2C3_PIN_DEINIT
2053     RTE_I2C3_PIN_DEINIT();
2054 #endif
2055     return I2C_Master_DmaUninitialize(&I2C3_DmaDriverState);
2056 }
2057 
I2C3_Master_DmaPowerControl(ARM_POWER_STATE state)2058 static int32_t I2C3_Master_DmaPowerControl(ARM_POWER_STATE state)
2059 {
2060     return I2C_Master_DmaPowerControl(&I2C3_DmaDriverState);
2061 }
2062 
I2C3_Master_DmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)2063 static int32_t I2C3_Master_DmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
2064 {
2065     return I2C_Master_DmaTransmit(addr, data, num, xfer_pending, &I2C3_DmaDriverState);
2066 }
2067 
I2C3_Master_DmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)2068 static int32_t I2C3_Master_DmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
2069 {
2070     return I2C_Master_DmaReceive(addr, data, num, xfer_pending, &I2C3_DmaDriverState);
2071 }
2072 
I2C3_Master_DmaGetDataCount(void)2073 static int32_t I2C3_Master_DmaGetDataCount(void)
2074 {
2075     return I2C_Master_DmaGetDataCount(&I2C3_DmaDriverState);
2076 }
2077 
I2C3_Master_DmaControl(uint32_t control,uint32_t arg)2078 static int32_t I2C3_Master_DmaControl(uint32_t control, uint32_t arg)
2079 {
2080     return I2C_Master_DmaControl(control, arg, &I2C3_DmaDriverState);
2081 }
2082 
I2C3_Master_DmaGetStatus(void)2083 static ARM_I2C_STATUS I2C3_Master_DmaGetStatus(void)
2084 {
2085     return I2C_Master_DmaGetStatus(&I2C3_DmaDriverState);
2086 }
2087 
2088 #endif
2089 
2090 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
2091 
2092 static cmsis_i2c_edma_resource_t I2C3_EdmaResource = {RTE_I2C3_Master_DMA_BASE, RTE_I2C3_Master_DMA_CH,
2093                                                       RTE_I2C3_Master_DMAMUX_BASE, RTE_I2C3_Master_PERI_SEL};
2094 
2095 static i2c_master_edma_handle_t I2C3_EdmaHandle;
2096 static edma_handle_t I2C3_EdmaTxRxHandle;
2097 
2098 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
2099 ARMCC_SECTION("i2c3_edma_driver_state")
2100 static cmsis_i2c_edma_driver_state_t I2C3_EdmaDriverState = {
2101 #else
2102 static cmsis_i2c_edma_driver_state_t I2C3_EdmaDriverState = {
2103 #endif
2104     &I2C3_Resource,
2105     &I2C3_EdmaResource,
2106     &I2C3_EdmaHandle,
2107     &I2C3_EdmaTxRxHandle,
2108 };
2109 
I2C3_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)2110 static int32_t I2C3_Master_EdmaInitialize(ARM_I2C_SignalEvent_t cb_event)
2111 {
2112 #ifdef RTE_I2C3_PIN_INIT
2113     RTE_I2C3_PIN_INIT();
2114 #endif
2115     return I2C_Master_EdmaInitialize(cb_event, &I2C3_EdmaDriverState);
2116 }
2117 
I2C3_Master_EdmaUninitialize(void)2118 static int32_t I2C3_Master_EdmaUninitialize(void)
2119 {
2120 #ifdef RTE_I2C3_PIN_DEINIT
2121     RTE_I2C3_PIN_DEINIT();
2122 #endif
2123     return I2C_Master_EdmaUninitialize(&I2C3_EdmaDriverState);
2124 }
2125 
I2C3_Master_EdmaPowerControl(ARM_POWER_STATE state)2126 static int32_t I2C3_Master_EdmaPowerControl(ARM_POWER_STATE state)
2127 {
2128     return I2C_Master_EdmaPowerControl(state, &I2C3_EdmaDriverState);
2129 }
2130 
I2C3_Master_EdmaTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)2131 static int32_t I2C3_Master_EdmaTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
2132 {
2133     return I2C_Master_EdmaTransmit(addr, data, num, xfer_pending, &I2C3_EdmaDriverState);
2134 }
2135 
I2C3_Master_EdmaReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)2136 static int32_t I2C3_Master_EdmaReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
2137 {
2138     return I2C_Master_EdmaReceive(addr, data, num, xfer_pending, &I2C3_EdmaDriverState);
2139 }
2140 
I2C3_Master_EdmaGetDataCount(void)2141 static int32_t I2C3_Master_EdmaGetDataCount(void)
2142 {
2143     return I2C_Master_EdmaGetDataCount(&I2C3_EdmaDriverState);
2144 }
2145 
I2C3_Master_EdmaControl(uint32_t control,uint32_t arg)2146 static int32_t I2C3_Master_EdmaControl(uint32_t control, uint32_t arg)
2147 {
2148     return I2C_Master_EdmaControl(control, arg, &I2C3_EdmaDriverState);
2149 }
2150 
I2C3_Master_EdmaGetStatus(void)2151 static ARM_I2C_STATUS I2C3_Master_EdmaGetStatus(void)
2152 {
2153     return I2C_Master_EdmaGetStatus(&I2C3_EdmaDriverState);
2154 }
2155 
2156 #endif
2157 
2158 #else
2159 
2160 static cmsis_i2c_handle_t I2C3_Handle;
2161 
2162 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
2163 ARMCC_SECTION("i2c3_interrupt_driver_state")
2164 static cmsis_i2c_interrupt_driver_state_t I2C3_InterruptDriverState = {
2165 #else
2166 static cmsis_i2c_interrupt_driver_state_t I2C3_InterruptDriverState = {
2167 #endif
2168     &I2C3_Resource,
2169     &I2C3_Handle,
2170 };
2171 
I2C3_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)2172 static int32_t I2C3_InterruptInitialize(ARM_I2C_SignalEvent_t cb_event)
2173 {
2174 #ifdef RTE_I2C3_PIN_INIT
2175     RTE_I2C3_PIN_INIT();
2176 #endif
2177     return I2C_InterruptInitialize(cb_event, &I2C3_InterruptDriverState);
2178 }
2179 
I2C3_InterruptUninitialize(void)2180 static int32_t I2C3_InterruptUninitialize(void)
2181 {
2182 #ifdef RTE_I2C3_PIN_DEINIT
2183     RTE_I2C3_PIN_DEINIT();
2184 #endif
2185     return I2C_InterruptUninitialize(&I2C3_InterruptDriverState);
2186 }
2187 
I2C3_InterruptPowerControl(ARM_POWER_STATE state)2188 static int32_t I2C3_InterruptPowerControl(ARM_POWER_STATE state)
2189 {
2190     return I2C_InterruptPowerControl(state, &I2C3_InterruptDriverState);
2191 }
2192 
I2C3_Master_InterruptTransmit(uint32_t addr,const uint8_t * data,uint32_t num,bool xfer_pending)2193 static int32_t I2C3_Master_InterruptTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending)
2194 {
2195     return I2C_Master_InterruptTransmit(addr, data, num, xfer_pending, &I2C3_InterruptDriverState);
2196 }
2197 
I2C3_Master_InterruptReceive(uint32_t addr,uint8_t * data,uint32_t num,bool xfer_pending)2198 static int32_t I2C3_Master_InterruptReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending)
2199 {
2200     return I2C_Master_InterruptReceive(addr, data, num, xfer_pending, &I2C3_InterruptDriverState);
2201 }
2202 
I2C3_Slave_InterruptTransmit(const uint8_t * data,uint32_t num)2203 static int32_t I2C3_Slave_InterruptTransmit(const uint8_t *data, uint32_t num)
2204 {
2205     return I2C_Slave_InterruptTransmit(data, num, &I2C3_InterruptDriverState);
2206 }
2207 
I2C3_Slave_InterruptReceive(uint8_t * data,uint32_t num)2208 static int32_t I2C3_Slave_InterruptReceive(uint8_t *data, uint32_t num)
2209 {
2210     return I2C_Slave_InterruptReceive(data, num, &I2C3_InterruptDriverState);
2211 }
2212 
I2C3_InterruptGetDataCount(void)2213 static int32_t I2C3_InterruptGetDataCount(void)
2214 {
2215     return I2C_InterruptGetDataCount(&I2C3_InterruptDriverState);
2216 }
2217 
I2C3_InterruptControl(uint32_t control,uint32_t arg)2218 static int32_t I2C3_InterruptControl(uint32_t control, uint32_t arg)
2219 {
2220     return I2C_InterruptControl(control, arg, &I2C3_InterruptDriverState);
2221 }
2222 
I2C3_InterruptGetStatus(void)2223 static ARM_I2C_STATUS I2C3_InterruptGetStatus(void)
2224 {
2225     return I2C_InterruptGetStatus(&I2C3_InterruptDriverState);
2226 }
2227 
2228 #endif
2229 
2230 ARM_DRIVER_I2C Driver_I2C3 = {I2Cx_GetVersion,
2231                               I2Cx_GetCapabilities,
2232 #if (defined(RTE_I2C3_DMA_EN) && RTE_I2C3_DMA_EN)
2233 #if (defined(FSL_FEATURE_SOC_EDMA_COUNT) && FSL_FEATURE_SOC_EDMA_COUNT)
2234                               I2C3_Master_EdmaInitialize,
2235                               I2C3_Master_EdmaUninitialize,
2236                               I2C3_Master_EdmaPowerControl,
2237                               I2C3_Master_EdmaTransmit,
2238                               I2C3_Master_EdmaReceive,
2239                               NULL,
2240                               NULL,
2241                               I2C3_Master_EdmaGetDataCount,
2242                               I2C3_Master_EdmaControl,
2243                               I2C3_Master_EdmaGetStatus
2244 #else
2245                               I2C3_Master_DmaInitialize,
2246                               I2C3_Master_DmaUninitialize,
2247                               I2C3_Master_DmaPowerControl,
2248                               I2C3_Master_DmaTransmit,
2249                               I2C3_Master_DmaReceive,
2250                               NULL,
2251                               NULL,
2252                               I2C3_Master_DmaGetDataCount,
2253                               I2C3_Master_DmaControl,
2254                               I2C3_Master_DmaGetStatus
2255 #endif
2256 #else
2257                               I2C3_InterruptInitialize,
2258                               I2C3_InterruptUninitialize,
2259                               I2C3_InterruptPowerControl,
2260                               I2C3_Master_InterruptTransmit,
2261                               I2C3_Master_InterruptReceive,
2262                               I2C3_Slave_InterruptTransmit,
2263                               I2C3_Slave_InterruptReceive,
2264                               I2C3_InterruptGetDataCount,
2265                               I2C3_InterruptControl,
2266                               I2C3_InterruptGetStatus
2267 #endif
2268 };
2269 
2270 #endif
2271