xref: /btstack/port/stm32-wb55xx-nucleo-freertos/Src/hw_ipcc.c (revision 0561b2d8d5dba972c7daa57d5e677f7a1327edfd)
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>&copy; 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