1 /**
2   ******************************************************************************
3   * @file    stm32mp1xx_hal_ipcc.h
4   * @author  MCD Application Team
5   * @brief   Header file of Mailbox HAL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2019 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Define to prevent recursive inclusion -------------------------------------*/
20 #ifndef STM32MP1xx_HAL_IPCC_H
21 #define STM32MP1xx_HAL_IPCC_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32mp1xx_hal_def.h"
29 
30 
31 /** @addtogroup STM32MP1xx_HAL_Driver
32   * @{
33   */
34 
35 /** @defgroup IPCC IPCC
36   * @brief IPCC HAL module driver
37   * @{
38   */
39 
40 /* Exported constants --------------------------------------------------------*/
41 
42 /** @defgroup IPCC_Exported_Constants IPCC Exported Constants
43   * @{
44   */
45 
46 /** @defgroup IPCC_Channel IPCC Channel
47   * @{
48   */
49 #define IPCC_CHANNEL_1 0x00000000U
50 #define IPCC_CHANNEL_2 0x00000001U
51 #define IPCC_CHANNEL_3 0x00000002U
52 #define IPCC_CHANNEL_4 0x00000003U
53 #define IPCC_CHANNEL_5 0x00000004U
54 #define IPCC_CHANNEL_6 0x00000005U
55 /**
56   * @}
57   */
58 
59 /**
60   * @}
61   */
62 
63 /* Exported types ------------------------------------------------------------*/
64 /** @defgroup IPCC_Exported_Types IPCC Exported Types
65   * @{
66   */
67 
68 /**
69   * @brief HAL IPCC State structures definition
70   */
71 typedef enum
72 {
73   HAL_IPCC_STATE_RESET             = 0x00U,  /*!< IPCC not yet initialized or disabled  */
74   HAL_IPCC_STATE_READY             = 0x01U,  /*!< IPCC initialized and ready for use    */
75   HAL_IPCC_STATE_BUSY              = 0x02U   /*!< IPCC internal processing is ongoing   */
76 } HAL_IPCC_StateTypeDef;
77 
78 /**
79   * @brief  IPCC channel direction structure definition
80   */
81 typedef enum
82 {
83   IPCC_CHANNEL_DIR_TX  = 0x00U,  /*!< Channel direction Tx is used by an MCU to transmit */
84   IPCC_CHANNEL_DIR_RX  = 0x01U   /*!< Channel direction Rx is used by an MCU to receive */
85 } IPCC_CHANNELDirTypeDef;
86 
87 /**
88   * @brief  IPCC channel status structure definition
89   */
90 typedef enum
91 {
92   IPCC_CHANNEL_STATUS_FREE       = 0x00U,  /*!< Means that a new msg can be posted on that channel */
93   IPCC_CHANNEL_STATUS_OCCUPIED   = 0x01U   /*!< An MCU has posted a msg the other MCU hasn't retrieved */
94 } IPCC_CHANNELStatusTypeDef;
95 
96 /**
97   * @brief  IPCC handle structure definition
98   */
99 typedef struct __IPCC_HandleTypeDef
100 {
101   IPCC_TypeDef                   *Instance;     /*!< IPCC registers base address */
102   void (* ChannelCallbackRx[IPCC_CHANNEL_NUMBER])(struct __IPCC_HandleTypeDef *hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);                            /*!< Rx Callback registration table */
103   void (* ChannelCallbackTx[IPCC_CHANNEL_NUMBER])(struct __IPCC_HandleTypeDef *hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);                            /*!< Tx Callback registration table */
104   uint32_t                       callbackRequest; /*!< Store information about callback notification by channel */
105   __IO HAL_IPCC_StateTypeDef      State;         /*!< IPCC State: initialized or not */
106 } IPCC_HandleTypeDef;
107 
108 /**
109   * @brief  IPCC callback typedef
110   */
111 typedef void ChannelCb(IPCC_HandleTypeDef *hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);
112 
113 /**
114   * @}
115   */
116 
117 /* Exported macros -----------------------------------------------------------*/
118 /** @defgroup IPCC_Exported_Macros IPCC Exported Macros
119   * @{
120   */
121 
122 /**
123   * @brief  Enable the specified interrupt.
124   * @param  __HANDLE__ specifies the IPCC Handle
125   * @param  __CHDIRECTION__ specifies the channels Direction
126   *          This parameter can be one of the following values:
127   *            @arg @ref IPCC_CHANNEL_DIR_TX Transmit channel free interrupt enable
128   *            @arg @ref IPCC_CHANNEL_DIR_RX Receive channel occupied interrupt enable
129   */
130 #if defined(CORE_CM4)
131 #define __HAL_IPCC_ENABLE_IT(__HANDLE__, __CHDIRECTION__) \
132             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
133                 ((__HANDLE__)->Instance->C2CR |= IPCC_C2CR_RXOIE) : \
134                 ((__HANDLE__)->Instance->C2CR |= IPCC_C2CR_TXFIE))
135 #else
136 #define __HAL_IPCC_ENABLE_IT(__HANDLE__, __CHDIRECTION__) \
137             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
138                 ((__HANDLE__)->Instance->C1CR |= IPCC_C1CR_RXOIE) : \
139                 ((__HANDLE__)->Instance->C1CR |= IPCC_C1CR_TXFIE))
140 #endif
141 
142 /**
143   * @brief  Disable the specified interrupt.
144   * @param  __HANDLE__ specifies the IPCC Handle
145   * @param  __CHDIRECTION__ specifies the channels Direction
146   *          This parameter can be one of the following values:
147   *            @arg @ref IPCC_CHANNEL_DIR_TX Transmit channel free interrupt enable
148   *            @arg @ref IPCC_CHANNEL_DIR_RX Receive channel occupied interrupt enable
149   */
150 #if defined(CORE_CM4)
151 #define __HAL_IPCC_DISABLE_IT(__HANDLE__, __CHDIRECTION__) \
152             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
153                 ((__HANDLE__)->Instance->C2CR &= ~IPCC_C2CR_RXOIE) : \
154                 ((__HANDLE__)->Instance->C2CR &= ~IPCC_C2CR_TXFIE))
155 #else
156 #define __HAL_IPCC_DISABLE_IT(__HANDLE__, __CHDIRECTION__) \
157             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
158                 ((__HANDLE__)->Instance->C1CR &= ~IPCC_C1CR_RXOIE) : \
159                 ((__HANDLE__)->Instance->C1CR &= ~IPCC_C1CR_TXFIE))
160 #endif
161 
162 /**
163   * @brief  Mask the specified interrupt.
164   * @param  __HANDLE__ specifies the IPCC Handle
165   * @param  __CHDIRECTION__ specifies the channels Direction
166   *          This parameter can be one of the following values:
167   *            @arg @ref IPCC_CHANNEL_DIR_TX Transmit channel free interrupt enable
168   *            @arg @ref IPCC_CHANNEL_DIR_RX Receive channel occupied interrupt enable
169   * @param  __CHINDEX__ specifies the channels number:
170   *         This parameter can be one of the following values:
171   *            @arg IPCC_CHANNEL_1: IPCC Channel 1
172   *            @arg IPCC_CHANNEL_2: IPCC Channel 2
173   *            @arg IPCC_CHANNEL_3: IPCC Channel 3
174   *            @arg IPCC_CHANNEL_4: IPCC Channel 4
175   *            @arg IPCC_CHANNEL_5: IPCC Channel 5
176   *            @arg IPCC_CHANNEL_6: IPCC Channel 6
177   */
178 #if defined(CORE_CM4)
179 #define __HAL_IPCC_MASK_CHANNEL_IT(__HANDLE__, __CHDIRECTION__, __CHINDEX__) \
180             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
181                 ((__HANDLE__)->Instance->C2MR |= (IPCC_C1MR_CH1OM_Msk << (__CHINDEX__))) : \
182                 ((__HANDLE__)->Instance->C2MR |= (IPCC_C1MR_CH1FM_Msk << (__CHINDEX__))))
183 #else
184 #define __HAL_IPCC_MASK_CHANNEL_IT(__HANDLE__, __CHDIRECTION__, __CHINDEX__) \
185             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
186                 ((__HANDLE__)->Instance->C1MR |= (IPCC_C1MR_CH1OM_Msk << (__CHINDEX__))) : \
187                 ((__HANDLE__)->Instance->C1MR |= (IPCC_C1MR_CH1FM_Msk << (__CHINDEX__))))
188 #endif
189 
190 /**
191   * @brief  Unmask the specified interrupt.
192   * @param  __HANDLE__ specifies the IPCC Handle
193   * @param  __CHDIRECTION__ specifies the channels Direction
194   *          This parameter can be one of the following values:
195   *            @arg @ref IPCC_CHANNEL_DIR_TX Transmit channel free interrupt enable
196   *            @arg @ref IPCC_CHANNEL_DIR_RX Receive channel occupied interrupt enable
197   * @param  __CHINDEX__ specifies the channels number:
198   *         This parameter can be one of the following values:
199   *            @arg IPCC_CHANNEL_1: IPCC Channel 1
200   *            @arg IPCC_CHANNEL_2: IPCC Channel 2
201   *            @arg IPCC_CHANNEL_3: IPCC Channel 3
202   *            @arg IPCC_CHANNEL_4: IPCC Channel 4
203   *            @arg IPCC_CHANNEL_5: IPCC Channel 5
204   *            @arg IPCC_CHANNEL_6: IPCC Channel 6
205   */
206 #if defined(CORE_CM4)
207 #define __HAL_IPCC_UNMASK_CHANNEL_IT(__HANDLE__, __CHDIRECTION__, __CHINDEX__) \
208             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
209                 ((__HANDLE__)->Instance->C2MR &= ~(IPCC_C1MR_CH1OM_Msk << (__CHINDEX__))) : \
210                 ((__HANDLE__)->Instance->C2MR &= ~(IPCC_C1MR_CH1FM_Msk << (__CHINDEX__))))
211 #else
212 #define __HAL_IPCC_UNMASK_CHANNEL_IT(__HANDLE__, __CHDIRECTION__, __CHINDEX__) \
213             (((__CHDIRECTION__) == IPCC_CHANNEL_DIR_RX) ? \
214                 ((__HANDLE__)->Instance->C1MR &= ~(IPCC_C1MR_CH1OM_Msk << (__CHINDEX__))) : \
215                 ((__HANDLE__)->Instance->C1MR &= ~(IPCC_C1MR_CH1FM_Msk << (__CHINDEX__))))
216 #endif
217 
218 /**
219   * @}
220   */
221 
222 /* Exported functions --------------------------------------------------------*/
223 /** @defgroup IPCC_Exported_Functions IPCC Exported Functions
224   * @{
225   */
226 
227 /* Initialization and de-initialization functions *******************************/
228 /** @defgroup IPCC_Exported_Functions_Group1 Initialization and deinitialization functions
229  *  @{
230  */
231 HAL_StatusTypeDef HAL_IPCC_Init(IPCC_HandleTypeDef *hipcc);
232 HAL_StatusTypeDef HAL_IPCC_DeInit(IPCC_HandleTypeDef *hipcc);
233 void HAL_IPCC_MspInit(IPCC_HandleTypeDef *hipcc);
234 void HAL_IPCC_MspDeInit(IPCC_HandleTypeDef *hipcc);
235 /**
236   * @}
237   */
238 
239 /** @defgroup IPCC_Exported_Functions_Group2 Communication functions
240  *  @{
241  */
242 /* IO operation functions  *****************************************************/
243 HAL_StatusTypeDef HAL_IPCC_ActivateNotification(IPCC_HandleTypeDef *hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir, ChannelCb cb);
244 HAL_StatusTypeDef HAL_IPCC_DeActivateNotification(IPCC_HandleTypeDef *hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);
245 IPCC_CHANNELStatusTypeDef HAL_IPCC_GetChannelStatus(IPCC_HandleTypeDef const *const hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);
246 HAL_StatusTypeDef HAL_IPCC_NotifyCPU(IPCC_HandleTypeDef const *const hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);
247 /**
248   * @}
249   */
250 
251 /** @defgroup IPCC_Exported_Functions_Group3 Peripheral State and Error functions
252  *  @{
253  */
254 /* Peripheral State and Error functions ****************************************/
255 HAL_IPCC_StateTypeDef HAL_IPCC_GetState(IPCC_HandleTypeDef const *const hipcc);
256 /**
257   * @}
258   */
259 
260 /** @defgroup IPCC_IRQ_Handler_and_Callbacks Peripheral IRQ Handler and Callbacks
261  *  @{
262  */
263 /* IRQHandler and Callbacks used in non blocking modes  ************************/
264 void HAL_IPCC_TX_IRQHandler(IPCC_HandleTypeDef   *const hipcc);
265 void HAL_IPCC_RX_IRQHandler(IPCC_HandleTypeDef *const hipcc);
266 void HAL_IPCC_TxCallback(IPCC_HandleTypeDef *hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);
267 void HAL_IPCC_RxCallback(IPCC_HandleTypeDef *hipcc, uint32_t ChannelIndex, IPCC_CHANNELDirTypeDef ChannelDir);
268 /**
269   * @}
270   */
271 
272 /**
273   * @}
274   */
275 
276 /**
277   * @}
278   */
279 
280 /**
281   * @}
282   */
283 
284 #ifdef __cplusplus
285 }
286 #endif
287 
288 #endif /* STM32MP1xx_HAL_IPCC_H */
289 
290