hw_ipcc.c 19 KB

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