hw_ipcc.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. /**
  2. ******************************************************************************
  3. * File Name : Target/hw_ipcc.c
  4. * Description : Hardware IPCC source file for STM32WPAN Middleware.
  5. *
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under Ultimate Liberty license
  13. * SLA0044, the "License"; You may not use this file except in compliance with
  14. * the License. You may obtain a copy of the License at:
  15. * www.st.com/SLA0044
  16. *
  17. ******************************************************************************
  18. */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "app_common.h"
  21. #include "mbox_def.h"
  22. /* Global variables ---------------------------------------------------------*/
  23. /* Private defines -----------------------------------------------------------*/
  24. #define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
  25. #define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
  26. /* Private macros ------------------------------------------------------------*/
  27. /* Private typedef -----------------------------------------------------------*/
  28. /* Private variables ---------------------------------------------------------*/
  29. static void (*FreeBufCb)( void );
  30. /* Private function prototypes -----------------------------------------------*/
  31. static void HW_IPCC_BLE_EvtHandler( void );
  32. static void HW_IPCC_BLE_AclDataEvtHandler( void );
  33. static void HW_IPCC_MM_FreeBufHandler( void );
  34. static void HW_IPCC_SYS_CmdEvtHandler( void );
  35. static void HW_IPCC_SYS_EvtHandler( void );
  36. static void HW_IPCC_TRACES_EvtHandler( void );
  37. #ifdef THREAD_WB
  38. static void HW_IPCC_OT_CmdEvtHandler( void );
  39. static void HW_IPCC_THREAD_NotEvtHandler( void );
  40. static void HW_IPCC_THREAD_CliNotEvtHandler( void );
  41. #endif
  42. #ifdef LLD_TESTS_WB
  43. static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
  44. static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
  45. #endif
  46. #ifdef LLD_BLE_WB
  47. /*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
  48. static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
  49. static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void );
  50. #endif
  51. #ifdef MAC_802_15_4_WB
  52. static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
  53. static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
  54. #endif
  55. #ifdef ZIGBEE_WB
  56. static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
  57. static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
  58. static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
  59. #endif
  60. /* Public function definition -----------------------------------------------*/
  61. /******************************************************************************
  62. * INTERRUPT HANDLER
  63. ******************************************************************************/
  64. void HW_IPCC_Rx_Handler( void )
  65. {
  66. if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
  67. {
  68. HW_IPCC_SYS_EvtHandler();
  69. }
  70. #ifdef MAC_802_15_4_WB
  71. else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
  72. {
  73. HW_IPCC_MAC_802_15_4_NotEvtHandler();
  74. }
  75. #endif /* MAC_802_15_4_WB */
  76. #ifdef THREAD_WB
  77. else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
  78. {
  79. HW_IPCC_THREAD_NotEvtHandler();
  80. }
  81. else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
  82. {
  83. HW_IPCC_THREAD_CliNotEvtHandler();
  84. }
  85. #endif /* THREAD_WB */
  86. #ifdef LLD_TESTS_WB
  87. else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
  88. {
  89. HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
  90. }
  91. else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
  92. {
  93. HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
  94. }
  95. #endif /* LLD_TESTS_WB */
  96. #ifdef LLD_BLE_WB
  97. else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
  98. {
  99. HW_IPCC_LLD_BLE_ReceiveRspHandler();
  100. }
  101. else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
  102. {
  103. HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
  104. }
  105. #endif /* LLD_TESTS_WB */
  106. #ifdef ZIGBEE_WB
  107. else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
  108. {
  109. HW_IPCC_ZIGBEE_StackNotifEvtHandler();
  110. }
  111. else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
  112. {
  113. HW_IPCC_ZIGBEE_StackM0RequestHandler();
  114. }
  115. #endif /* ZIGBEE_WB */
  116. else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
  117. {
  118. HW_IPCC_BLE_EvtHandler();
  119. }
  120. else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
  121. {
  122. HW_IPCC_TRACES_EvtHandler();
  123. }
  124. return;
  125. }
  126. void HW_IPCC_Tx_Handler( void )
  127. {
  128. if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
  129. {
  130. HW_IPCC_SYS_CmdEvtHandler();
  131. }
  132. #ifdef MAC_802_15_4_WB
  133. else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
  134. {
  135. HW_IPCC_MAC_802_15_4_CmdEvtHandler();
  136. }
  137. #endif /* MAC_802_15_4_WB */
  138. #ifdef THREAD_WB
  139. else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
  140. {
  141. HW_IPCC_OT_CmdEvtHandler();
  142. }
  143. #endif /* THREAD_WB */
  144. #ifdef LLD_TESTS_WB
  145. // No TX handler for LLD tests
  146. #endif /* LLD_TESTS_WB */
  147. #ifdef ZIGBEE_WB
  148. if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
  149. {
  150. HW_IPCC_ZIGBEE_CmdEvtHandler();
  151. }
  152. #endif /* ZIGBEE_WB */
  153. else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
  154. {
  155. HW_IPCC_SYS_CmdEvtHandler();
  156. }
  157. else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
  158. {
  159. HW_IPCC_MM_FreeBufHandler();
  160. }
  161. else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
  162. {
  163. HW_IPCC_BLE_AclDataEvtHandler();
  164. }
  165. return;
  166. }
  167. /******************************************************************************
  168. * GENERAL
  169. ******************************************************************************/
  170. void HW_IPCC_Enable( void )
  171. {
  172. /**
  173. * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
  174. when FUS is running on CPU2 and CPU1 enters deep sleep mode
  175. */
  176. LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
  177. /**
  178. * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
  179. */
  180. LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
  181. LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
  182. /**
  183. * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
  184. * In that case, to keep the mechanism transparent to the user application, it shall call the system command
  185. * SHCI_C2_Reinit( ) before jumping to the application.
  186. * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
  187. * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
  188. * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
  189. * So, by default, the application shall both set the event flag and set the C2BOOT bit.
  190. */
  191. __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
  192. __WFE( ); /* Clear the internal event flag */
  193. LL_PWR_EnableBootC2( );
  194. return;
  195. }
  196. void HW_IPCC_Init( void )
  197. {
  198. LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
  199. LL_C1_IPCC_EnableIT_RXO( IPCC );
  200. LL_C1_IPCC_EnableIT_TXF( IPCC );
  201. HAL_NVIC_SetPriority(IPCC_C1_RX_IRQn, 6, 0);
  202. HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
  203. HAL_NVIC_SetPriority(IPCC_C1_TX_IRQn, 6, 0);
  204. HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
  205. return;
  206. }
  207. /******************************************************************************
  208. * BLE
  209. ******************************************************************************/
  210. void HW_IPCC_BLE_Init( void )
  211. {
  212. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
  213. return;
  214. }
  215. void HW_IPCC_BLE_SendCmd( void )
  216. {
  217. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
  218. return;
  219. }
  220. static void HW_IPCC_BLE_EvtHandler( void )
  221. {
  222. HW_IPCC_BLE_RxEvtNot();
  223. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
  224. return;
  225. }
  226. void HW_IPCC_BLE_SendAclData( void )
  227. {
  228. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
  229. LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
  230. return;
  231. }
  232. static void HW_IPCC_BLE_AclDataEvtHandler( void )
  233. {
  234. LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
  235. HW_IPCC_BLE_AclDataAckNot();
  236. return;
  237. }
  238. __weak void HW_IPCC_BLE_AclDataAckNot( void ){};
  239. __weak void HW_IPCC_BLE_RxEvtNot( void ){};
  240. /******************************************************************************
  241. * SYSTEM
  242. ******************************************************************************/
  243. void HW_IPCC_SYS_Init( void )
  244. {
  245. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
  246. return;
  247. }
  248. void HW_IPCC_SYS_SendCmd( void )
  249. {
  250. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
  251. LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
  252. return;
  253. }
  254. static void HW_IPCC_SYS_CmdEvtHandler( void )
  255. {
  256. LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
  257. HW_IPCC_SYS_CmdEvtNot();
  258. return;
  259. }
  260. static void HW_IPCC_SYS_EvtHandler( void )
  261. {
  262. HW_IPCC_SYS_EvtNot();
  263. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
  264. return;
  265. }
  266. __weak void HW_IPCC_SYS_CmdEvtNot( void ){};
  267. __weak void HW_IPCC_SYS_EvtNot( void ){};
  268. /******************************************************************************
  269. * MAC 802.15.4
  270. ******************************************************************************/
  271. #ifdef MAC_802_15_4_WB
  272. void HW_IPCC_MAC_802_15_4_Init( void )
  273. {
  274. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
  275. return;
  276. }
  277. void HW_IPCC_MAC_802_15_4_SendCmd( void )
  278. {
  279. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
  280. LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
  281. return;
  282. }
  283. void HW_IPCC_MAC_802_15_4_SendAck( void )
  284. {
  285. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
  286. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
  287. return;
  288. }
  289. static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
  290. {
  291. LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
  292. HW_IPCC_MAC_802_15_4_CmdEvtNot();
  293. return;
  294. }
  295. static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
  296. {
  297. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
  298. HW_IPCC_MAC_802_15_4_EvtNot();
  299. return;
  300. }
  301. __weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
  302. __weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
  303. #endif
  304. /******************************************************************************
  305. * THREAD
  306. ******************************************************************************/
  307. #ifdef THREAD_WB
  308. void HW_IPCC_THREAD_Init( void )
  309. {
  310. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
  311. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
  312. return;
  313. }
  314. void HW_IPCC_OT_SendCmd( void )
  315. {
  316. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
  317. LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
  318. return;
  319. }
  320. void HW_IPCC_CLI_SendCmd( void )
  321. {
  322. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
  323. return;
  324. }
  325. void HW_IPCC_THREAD_SendAck( void )
  326. {
  327. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
  328. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
  329. return;
  330. }
  331. void HW_IPCC_THREAD_CliSendAck( void )
  332. {
  333. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
  334. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
  335. return;
  336. }
  337. static void HW_IPCC_OT_CmdEvtHandler( void )
  338. {
  339. LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
  340. HW_IPCC_OT_CmdEvtNot();
  341. return;
  342. }
  343. static void HW_IPCC_THREAD_NotEvtHandler( void )
  344. {
  345. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
  346. HW_IPCC_THREAD_EvtNot();
  347. return;
  348. }
  349. static void HW_IPCC_THREAD_CliNotEvtHandler( void )
  350. {
  351. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
  352. HW_IPCC_THREAD_CliEvtNot();
  353. return;
  354. }
  355. __weak void HW_IPCC_OT_CmdEvtNot( void ){};
  356. __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
  357. __weak void HW_IPCC_THREAD_EvtNot( void ){};
  358. #endif /* THREAD_WB */
  359. /******************************************************************************
  360. * LLD TESTS
  361. ******************************************************************************/
  362. #ifdef LLD_TESTS_WB
  363. void HW_IPCC_LLDTESTS_Init( void )
  364. {
  365. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
  366. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
  367. return;
  368. }
  369. void HW_IPCC_LLDTESTS_SendCliCmd( void )
  370. {
  371. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
  372. return;
  373. }
  374. static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
  375. {
  376. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
  377. HW_IPCC_LLDTESTS_ReceiveCliRsp();
  378. return;
  379. }
  380. void HW_IPCC_LLDTESTS_SendCliRspAck( void )
  381. {
  382. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
  383. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
  384. return;
  385. }
  386. static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
  387. {
  388. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
  389. HW_IPCC_LLDTESTS_ReceiveM0Cmd();
  390. return;
  391. }
  392. void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
  393. {
  394. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
  395. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
  396. return;
  397. }
  398. __weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
  399. __weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
  400. #endif /* LLD_TESTS_WB */
  401. /******************************************************************************
  402. * LLD BLE
  403. ******************************************************************************/
  404. #ifdef LLD_BLE_WB
  405. void HW_IPCC_LLD_BLE_Init( void )
  406. {
  407. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
  408. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
  409. return;
  410. }
  411. void HW_IPCC_LLD_BLE_SendCliCmd( void )
  412. {
  413. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
  414. return;
  415. }
  416. /*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
  417. {
  418. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
  419. HW_IPCC_LLD_BLE_ReceiveCliRsp();
  420. return;
  421. }*/
  422. void HW_IPCC_LLD_BLE_SendCliRspAck( void )
  423. {
  424. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
  425. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
  426. return;
  427. }
  428. static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
  429. {
  430. //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
  431. HW_IPCC_LLD_BLE_ReceiveM0Cmd();
  432. return;
  433. }
  434. void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
  435. {
  436. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
  437. //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
  438. return;
  439. }
  440. __weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
  441. __weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
  442. /* Transparent Mode */
  443. void HW_IPCC_LLD_BLE_SendCmd( void )
  444. {
  445. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
  446. return;
  447. }
  448. static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
  449. {
  450. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
  451. HW_IPCC_LLD_BLE_ReceiveRsp();
  452. return;
  453. }
  454. void HW_IPCC_LLD_BLE_SendRspAck( void )
  455. {
  456. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
  457. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
  458. return;
  459. }
  460. #endif /* LLD_BLE_WB */
  461. /******************************************************************************
  462. * ZIGBEE
  463. ******************************************************************************/
  464. #ifdef ZIGBEE_WB
  465. void HW_IPCC_ZIGBEE_Init( void )
  466. {
  467. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
  468. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
  469. return;
  470. }
  471. void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
  472. {
  473. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
  474. LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
  475. return;
  476. }
  477. void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
  478. {
  479. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
  480. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
  481. return;
  482. }
  483. static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
  484. {
  485. LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
  486. HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
  487. return;
  488. }
  489. static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
  490. {
  491. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
  492. HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
  493. return;
  494. }
  495. static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
  496. {
  497. LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
  498. HW_IPCC_ZIGBEE_RecvM0RequestToM4();
  499. return;
  500. }
  501. void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
  502. {
  503. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
  504. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
  505. return;
  506. }
  507. __weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
  508. __weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
  509. __weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
  510. #endif /* ZIGBEE_WB */
  511. /******************************************************************************
  512. * MEMORY MANAGER
  513. ******************************************************************************/
  514. void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
  515. {
  516. if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
  517. {
  518. FreeBufCb = cb;
  519. LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
  520. }
  521. else
  522. {
  523. cb();
  524. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
  525. }
  526. return;
  527. }
  528. static void HW_IPCC_MM_FreeBufHandler( void )
  529. {
  530. LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
  531. FreeBufCb();
  532. LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
  533. return;
  534. }
  535. /******************************************************************************
  536. * TRACES
  537. ******************************************************************************/
  538. void HW_IPCC_TRACES_Init( void )
  539. {
  540. LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
  541. return;
  542. }
  543. static void HW_IPCC_TRACES_EvtHandler( void )
  544. {
  545. HW_IPCC_TRACES_EvtNot();
  546. LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
  547. return;
  548. }
  549. __weak void HW_IPCC_TRACES_EvtNot( void ){};
  550. /******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/