1 /*
2  * Copyright 2022 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 #ifndef FSL_LP_FLEXCOMM_H_
8 #define FSL_LP_FLEXCOMM_H_
9 
10 #include "fsl_common.h"
11 
12 /*!
13  * @addtogroup lpflexcomm_driver
14  * @{
15  */
16 
17 /*! @name Driver version */
18 /*! @{ */
19 /*! @brief FlexCOMM driver version. */
20 #define FSL_LP_FLEXCOMM_DRIVER_VERSION (MAKE_VERSION(2, 2, 1))
21 /*! @} */
22 
23 /*! @brief LP_FLEXCOMM peripheral modes. */
24 typedef enum
25 {
26     LP_FLEXCOMM_PERIPH_NONE,               /*!< No peripheral */
27     LP_FLEXCOMM_PERIPH_LPUART,             /*!< LPUART peripheral */
28     LP_FLEXCOMM_PERIPH_LPSPI,              /*!< LPSPI Peripheral */
29     LP_FLEXCOMM_PERIPH_LPI2C,              /*!< LPI2C Peripheral */
30     LP_FLEXCOMM_PERIPH_LPI2CAndLPUART = 7, /*!< LPI2C and LPUART Peripheral */
31 } LP_FLEXCOMM_PERIPH_T;
32 
33 /*! @brief LP_FLEXCOMM interrupt source flags. */
34 enum _lpflexcomm_interrupt_flag
35 {
36     kLPFLEXCOMM_I2cSlaveInterruptFlag  = LP_FLEXCOMM_ISTAT_I2CS_MASK,   /* LPI2C slave interrupt. */
37     kLPFLEXCOMM_I2cMasterInterruptFlag = LP_FLEXCOMM_ISTAT_I2CM_MASK,   /* LPI2C master interrupt. */
38     kLPFLEXCOMM_SpiInterruptFlag       = LP_FLEXCOMM_ISTAT_SPI_MASK,    /* LPSPI interrupt. */
39     kLPFLEXCOMM_UartRxInterruptFlag    = LP_FLEXCOMM_ISTAT_UARTRX_MASK, /* LPUART RX interrupt. */
40     kLPFLEXCOMM_UartTxInterruptFlag    = LP_FLEXCOMM_ISTAT_UARTTX_MASK, /* LPUART TX interrupt. */
41 
42     kLPFLEXCOMM_AllInterruptFlag = kLPFLEXCOMM_I2cSlaveInterruptFlag | kLPFLEXCOMM_I2cMasterInterruptFlag |
43                                    kLPFLEXCOMM_SpiInterruptFlag | kLPFLEXCOMM_UartRxInterruptFlag |
44                                    kLPFLEXCOMM_UartTxInterruptFlag,
45 };
46 
47 /*! @brief Typedef for interrupt handler. */
48 typedef void (*lpflexcomm_irq_handler_t)(uint32_t instance, void *handle);
49 
50 /*! @brief Array with IRQ number for each LP_FLEXCOMM module. */
51 extern IRQn_Type const kFlexcommIrqs[];
52 
53 /*******************************************************************************
54  * API
55  ******************************************************************************/
56 #if defined(__cplusplus)
57 extern "C" {
58 #endif
59 
60 /*! @brief Returns instance number for LP_FLEXCOMM module with given base address. */
61 uint32_t LP_FLEXCOMM_GetInstance(void *base);
62 
63 /*! @brief Returns for LP_FLEXCOMM base address. */
64 uint32_t LP_FLEXCOMM_GetBaseAddress(uint32_t instance);
65 
66 /*! brief Returns for LP_FLEXCOMM interrupt source,see #_lpflexcomm_interrupt_flag. */
67 uint32_t LP_FLEXCOMM_GetInterruptStatus(uint32_t instance);
68 
69 /*! @brief Initializes LP_FLEXCOMM and selects peripheral mode according to the second parameter. */
70 status_t LP_FLEXCOMM_Init(uint32_t instance, LP_FLEXCOMM_PERIPH_T periph);
71 
72 /*! @brief Deinitializes LP_FLEXCOMM. */
73 void LP_FLEXCOMM_Deinit(uint32_t instance);
74 
75 /*! @brief Sets IRQ handler for given LP_FLEXCOMM module. It is used by drivers register IRQ handler according to
76  * LP_FLEXCOMM mode */
77 void LP_FLEXCOMM_SetIRQHandler(uint32_t instance,
78                                lpflexcomm_irq_handler_t handler,
79                                void *lpflexcommHandle,
80                                LP_FLEXCOMM_PERIPH_T periph);
81 
82 #if defined(__cplusplus)
83 }
84 #endif
85 
86 /*! @} */
87 
88 #endif /* FSL_LP_FLEXCOMM_H_*/
89