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 ******************************************************************************/ 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 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 ******************************************************************************/ 99 void HW_IPCC_Enable( void ) 100 { 101 LL_PWR_EnableBootC2(); 102 103 return; 104 } 105 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 ******************************************************************************/ 122 void HW_IPCC_BLE_Init( void ) 123 { 124 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL ); 125 126 return; 127 } 128 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 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 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 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 162 __weak void HW_IPCC_BLE_AclDataAckNot( void ){}; 163 __weak void HW_IPCC_BLE_RxEvtNot( void ){}; 164 165 /****************************************************************************** 166 * SYSTEM 167 ******************************************************************************/ 168 void HW_IPCC_SYS_Init( void ) 169 { 170 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL ); 171 172 return; 173 } 174 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 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 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 201 __weak void HW_IPCC_SYS_CmdEvtNot( void ){}; 202 __weak void HW_IPCC_SYS_EvtNot( void ){}; 203 204 /****************************************************************************** 205 * THREAD 206 ******************************************************************************/ 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 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 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 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 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 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 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 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 273 __weak void HW_IPCC_OT_CmdEvtNot( void ){}; 274 __weak void HW_IPCC_CLI_CmdEvtNot( void ){}; 275 __weak void HW_IPCC_THREAD_EvtNot( void ){}; 276 __weak void HW_IPCC_THREAD_CliEvtNot( void ){}; 277 278 /****************************************************************************** 279 * MEMORY MANAGER 280 ******************************************************************************/ 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 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 ******************************************************************************/ 312 void HW_IPCC_TRACES_Init( void ) 313 { 314 LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL ); 315 316 return; 317 } 318 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 328 __weak void HW_IPCC_TRACES_EvtNot( void ){}; 329 330 /******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/ 331