1 /*
2  * Copyright (c) 2022 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "hpm_soc.h"
9 #include "hpm_mbx_drv.h"
10 #include "hpm_ipc_event_mgr.h"
11 #include "hpm_ipc_event_mgr_mbx_config.h"
12 #include "hpm_ipc_event_mgr_mbx_internal.h"
13 
14 /*****************************************************************************************************************
15  *
16  *  Definitions
17  *
18  *****************************************************************************************************************/
19 
20 /*****************************************************************************************************************
21  *
22  *  Prototypes
23  *
24  *****************************************************************************************************************/
25 static void mbx_isr(void);
SDK_DECLARE_EXT_ISR_M(IRQn_MBX,mbx_isr)26 SDK_DECLARE_EXT_ISR_M(IRQn_MBX, mbx_isr)
27 
28 /*****************************************************************************************************************
29  *
30  *  Variables
31  *
32  *****************************************************************************************************************/
33 
34 /*****************************************************************************************************************
35  *
36  *  Codes
37  *
38  *****************************************************************************************************************/
39 void ipc_init_internal(void)
40 {
41     mbx_init(HPM_MBX);
42 }
43 
ipc_enable_event_interrupt_internal(uint32_t priority)44 void ipc_enable_event_interrupt_internal(uint32_t priority)
45 {
46     mbx_enable_intr(HPM_MBX, MBX_CR_RWMVIE_MASK);
47     intc_m_enable_irq_with_priority(IRQn_MBX, priority);
48 }
49 
ipc_disable_event_interrupt_internal(void)50 void ipc_disable_event_interrupt_internal(void)
51 {
52     mbx_disable_intr(HPM_MBX, MBX_CR_RWMVIE_MASK);
53     intc_m_disable_irq(IRQn_MBX);
54 }
55 
ipc_tigger_event_internal(uint32_t remote_data)56 hpm_stat_t ipc_tigger_event_internal(uint32_t remote_data)
57 {
58     return mbx_send_message(HPM_MBX, remote_data);
59 }
60 
61 /*!
62  * @brief ISR handler
63  *
64  * This function is called when data from MBX is received
65  */
mbx_isr(void)66 static void mbx_isr(void)
67 {
68     uint32_t data;
69     hpm_stat_t state;
70 
71     state = mbx_retrieve_message(HPM_MBX, &data);
72 
73     if (state == status_success) {
74         ipc_event_handler(data);
75     }
76 }
77