1 /*
2  * Copyright (c) 2023 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Note that the function prototypes are taken from the NRFx HAL
7  */
8 #include "hal/nrf_ipc.h"
9 #include "bs_tracing.h"
10 #include "NHW_IPC.h"
11 
ipc_number_from_ptr(NRF_IPC_Type const * p_reg)12 static int ipc_number_from_ptr(NRF_IPC_Type const * p_reg){
13   int i = ( (int)p_reg - (int)&NRF_IPC_regs[0] ) / sizeof(NRF_IPC_Type);
14   return i;
15 }
16 
nrf_ipc_task_trigger(NRF_IPC_Type * p_reg,nrf_ipc_task_t ipc_task)17 void nrf_ipc_task_trigger(NRF_IPC_Type * p_reg, nrf_ipc_task_t ipc_task)
18 {
19   *((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)ipc_task)) = 0x1UL;
20 
21   int i = ipc_number_from_ptr(p_reg);
22   int task_nbr = (ipc_task - NRF_IPC_TASK_SEND_0)/sizeof(uint32_t);
23   nhw_IPC_regw_sideeffects_TASKS_SEND(i, task_nbr);
24 }
25 
nrf_ipc_event_clear(NRF_IPC_Type * p_reg,nrf_ipc_event_t ipc_event)26 void nrf_ipc_event_clear(NRF_IPC_Type * p_reg, nrf_ipc_event_t ipc_event)
27 {
28   *((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)ipc_event)) = 0x0UL;
29 
30   int i = ipc_number_from_ptr(p_reg);
31   nhw_IPC_regw_sideeffects_EVENTS_all(i);
32 }
33 
nrf_ipc_int_enable(NRF_IPC_Type * p_reg,uint32_t mask)34 void nrf_ipc_int_enable(NRF_IPC_Type * p_reg, uint32_t mask)
35 {
36   p_reg->INTENSET = mask;
37 
38   int i = ipc_number_from_ptr(p_reg);
39   nhw_IPC_regw_sideeffects_INTENSET(i);
40 }
41 
nrf_ipc_int_disable(NRF_IPC_Type * p_reg,uint32_t mask)42 void nrf_ipc_int_disable(NRF_IPC_Type * p_reg, uint32_t mask)
43 {
44   p_reg->INTENCLR = mask;
45 
46   int i = ipc_number_from_ptr(p_reg);
47   nhw_IPC_regw_sideeffects_INTENCLR(i);
48 }
49 
50 #if defined(DPPI_PRESENT)
nrf_ipc_subscribe_set(NRF_IPC_Type * p_reg,nrf_ipc_task_t task,uint8_t channel)51 void nrf_ipc_subscribe_set(NRF_IPC_Type * p_reg,
52                            nrf_ipc_task_t task,
53                            uint8_t        channel)
54 {
55   NRFX_ASSERT(p_reg);
56   *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) =
57           ((uint32_t)channel | NRF_SUBSCRIBE_PUBLISH_ENABLE);
58 
59   int i = ipc_number_from_ptr(p_reg);
60   int task_nbr = (task - NRF_IPC_TASK_SEND_0)/sizeof(uint32_t);
61 
62   nhw_IPC_regw_sideeffects_SUBSCRIBE_SEND(i, task_nbr);
63 }
64 
nrf_ipc_subscribe_clear(NRF_IPC_Type * p_reg,nrf_ipc_task_t task)65 void nrf_ipc_subscribe_clear(NRF_IPC_Type * p_reg,
66                              nrf_ipc_task_t task)
67 {
68   NRFX_ASSERT(p_reg);
69   *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) = 0;
70 
71   int i = ipc_number_from_ptr(p_reg);
72   int task_nbr = (task - NRF_IPC_TASK_SEND_0)/sizeof(uint32_t);
73 
74   nhw_IPC_regw_sideeffects_SUBSCRIBE_SEND(i, task_nbr);
75 }
76 #endif // defined(DPPI_PRESENT)
77