1 /**
2 ******************************************************************************
3 * File Name : Target/hw_ipcc.c
4 * Description : Hardware IPCC source file for BLE
5 * middleWare.
6 ******************************************************************************
7 * @attention
8 *
9 * <h2><center>© Copyright (c) 2019 STMicroelectronics.
10 * All rights reserved.</center></h2>
11 *
12 * This software component is licensed by ST under BSD 3-Clause license,
13 * the "License"; You may not use this file except in compliance with the
14 * License. You may obtain a copy of the License at:
15 * opensource.org/licenses/BSD-3-Clause
16 *
17 ******************************************************************************
18 */
19
20 /* Includes ------------------------------------------------------------------*/
21 #include "app_conf.h"
22 #include "mbox_def.h"
23
24 /* Global variables ---------------------------------------------------------*/
25 /* Private defines -----------------------------------------------------------*/
26 #define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
27 #define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
28
29 /* Private macros ------------------------------------------------------------*/
30 /* Private typedef -----------------------------------------------------------*/
31 /* Private variables ---------------------------------------------------------*/
32 static void (*FreeBufCb)( void );
33
34 /* Private function prototypes -----------------------------------------------*/
35 static void HW_IPCC_BLE_EvtHandler( void );
36 static void HW_IPCC_BLE_AclDataEvtHandler( void );
37 static void HW_IPCC_MM_FreeBufHandler( void );
38 static void HW_IPCC_SYS_CmdEvtHandler( void );
39 static void HW_IPCC_SYS_EvtHandler( void );
40 static void HW_IPCC_TRACES_EvtHandler( void );
41 static void HW_IPCC_OT_CmdEvtHandler( void );
42 static void HW_IPCC_THREAD_NotEvtHandler( void );
43 static void HW_IPCC_THREAD_CliNotEvtHandler( void );
44
45 /* Public function definition -----------------------------------------------*/
46
47 /******************************************************************************
48 * INTERRUPT HANDLER
49 ******************************************************************************/
HW_IPCC_Rx_Handler(void)50 void HW_IPCC_Rx_Handler( void )
51 {
52 if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
53 {
54 HW_IPCC_THREAD_NotEvtHandler();
55 }
56 else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
57 {
58 HW_IPCC_BLE_EvtHandler();
59 }
60 else if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
61 {
62 HW_IPCC_SYS_EvtHandler();
63 }
64 else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
65 {
66 HW_IPCC_TRACES_EvtHandler();
67 }
68 else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
69 {
70 HW_IPCC_THREAD_CliNotEvtHandler();
71 }
72
73 return;
74 }
75
HW_IPCC_Tx_Handler(void)76 void HW_IPCC_Tx_Handler( void )
77 {
78 if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
79 {
80 HW_IPCC_OT_CmdEvtHandler();
81 }
82 else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
83 {
84 HW_IPCC_SYS_CmdEvtHandler();
85 }
86 else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
87 {
88 HW_IPCC_MM_FreeBufHandler();
89 }
90 else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
91 {
92 HW_IPCC_BLE_AclDataEvtHandler();
93 }
94 return;
95 }
96 /******************************************************************************
97 * GENERAL
98 ******************************************************************************/
HW_IPCC_Enable(void)99 void HW_IPCC_Enable( void )
100 {
101 LL_PWR_EnableBootC2();
102
103 return;
104 }
105
HW_IPCC_Init(void)106 void HW_IPCC_Init( void )
107 {
108 LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
109
110 LL_C1_IPCC_EnableIT_RXO( IPCC );
111 LL_C1_IPCC_EnableIT_TXF( IPCC );
112
113 HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
114 HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
115
116 return;
117 }
118
119 /******************************************************************************
120 * BLE
121 ******************************************************************************/
HW_IPCC_BLE_Init(void)122 void HW_IPCC_BLE_Init( void )
123 {
124 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
125
126 return;
127 }
128
HW_IPCC_BLE_SendCmd(void)129 void HW_IPCC_BLE_SendCmd( void )
130 {
131 LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
132
133 return;
134 }
135
HW_IPCC_BLE_EvtHandler(void)136 static void HW_IPCC_BLE_EvtHandler( void )
137 {
138 HW_IPCC_BLE_RxEvtNot();
139
140 LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
141
142 return;
143 }
144
HW_IPCC_BLE_SendAclData(void)145 void HW_IPCC_BLE_SendAclData( void )
146 {
147 LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
148 LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
149
150 return;
151 }
152
HW_IPCC_BLE_AclDataEvtHandler(void)153 static void HW_IPCC_BLE_AclDataEvtHandler( void )
154 {
155 LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
156
157 HW_IPCC_BLE_AclDataAckNot();
158
159 return;
160 }
161
HW_IPCC_BLE_AclDataAckNot(void)162 __weak void HW_IPCC_BLE_AclDataAckNot( void ){};
HW_IPCC_BLE_RxEvtNot(void)163 __weak void HW_IPCC_BLE_RxEvtNot( void ){};
164
165 /******************************************************************************
166 * SYSTEM
167 ******************************************************************************/
HW_IPCC_SYS_Init(void)168 void HW_IPCC_SYS_Init( void )
169 {
170 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
171
172 return;
173 }
174
HW_IPCC_SYS_SendCmd(void)175 void HW_IPCC_SYS_SendCmd( void )
176 {
177 LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
178 LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
179
180 return;
181 }
182
HW_IPCC_SYS_CmdEvtHandler(void)183 static void HW_IPCC_SYS_CmdEvtHandler( void )
184 {
185 LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
186
187 HW_IPCC_SYS_CmdEvtNot();
188
189 return;
190 }
191
HW_IPCC_SYS_EvtHandler(void)192 static void HW_IPCC_SYS_EvtHandler( void )
193 {
194 HW_IPCC_SYS_EvtNot();
195
196 LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
197
198 return;
199 }
200
HW_IPCC_SYS_CmdEvtNot(void)201 __weak void HW_IPCC_SYS_CmdEvtNot( void ){};
HW_IPCC_SYS_EvtNot(void)202 __weak void HW_IPCC_SYS_EvtNot( void ){};
203
204 /******************************************************************************
205 * THREAD
206 ******************************************************************************/
HW_IPCC_THREAD_Init(void)207 void HW_IPCC_THREAD_Init( void )
208 {
209 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
210 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
211
212 return;
213 }
214
HW_IPCC_OT_SendCmd(void)215 void HW_IPCC_OT_SendCmd( void )
216 {
217 LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
218 LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
219
220 return;
221 }
222
HW_IPCC_CLI_SendCmd(void)223 void HW_IPCC_CLI_SendCmd( void )
224 {
225 LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
226
227 return;
228 }
229
HW_IPCC_THREAD_SendAck(void)230 void HW_IPCC_THREAD_SendAck( void )
231 {
232 LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
233 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
234
235 return;
236 }
237
HW_IPCC_THREAD_CliSendAck(void)238 void HW_IPCC_THREAD_CliSendAck( void )
239 {
240 LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
241 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
242
243 return;
244 }
245
HW_IPCC_OT_CmdEvtHandler(void)246 static void HW_IPCC_OT_CmdEvtHandler( void )
247 {
248 LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
249
250 HW_IPCC_OT_CmdEvtNot();
251
252 return;
253 }
254
HW_IPCC_THREAD_NotEvtHandler(void)255 static void HW_IPCC_THREAD_NotEvtHandler( void )
256 {
257 LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
258
259 HW_IPCC_THREAD_EvtNot();
260
261 return;
262 }
263
HW_IPCC_THREAD_CliNotEvtHandler(void)264 static void HW_IPCC_THREAD_CliNotEvtHandler( void )
265 {
266 LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
267
268 HW_IPCC_THREAD_CliEvtNot();
269
270 return;
271 }
272
HW_IPCC_OT_CmdEvtNot(void)273 __weak void HW_IPCC_OT_CmdEvtNot( void ){};
HW_IPCC_CLI_CmdEvtNot(void)274 __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
HW_IPCC_THREAD_EvtNot(void)275 __weak void HW_IPCC_THREAD_EvtNot( void ){};
HW_IPCC_THREAD_CliEvtNot(void)276 __weak void HW_IPCC_THREAD_CliEvtNot( void ){};
277
278 /******************************************************************************
279 * MEMORY MANAGER
280 ******************************************************************************/
HW_IPCC_MM_SendFreeBuf(void (* cb)(void))281 void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
282 {
283 if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
284 {
285 FreeBufCb = cb;
286 LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
287 }
288 else
289 {
290 cb();
291
292 LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
293 }
294
295 return;
296 }
297
HW_IPCC_MM_FreeBufHandler(void)298 static void HW_IPCC_MM_FreeBufHandler( void )
299 {
300 LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
301
302 FreeBufCb();
303
304 LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
305
306 return;
307 }
308
309 /******************************************************************************
310 * TRACES
311 ******************************************************************************/
HW_IPCC_TRACES_Init(void)312 void HW_IPCC_TRACES_Init( void )
313 {
314 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
315
316 return;
317 }
318
HW_IPCC_TRACES_EvtHandler(void)319 static void HW_IPCC_TRACES_EvtHandler( void )
320 {
321 HW_IPCC_TRACES_EvtNot();
322
323 LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
324
325 return;
326 }
327
HW_IPCC_TRACES_EvtNot(void)328 __weak void HW_IPCC_TRACES_EvtNot( void ){};
329
330 /******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
331