55 */
66
77#include "./backend/backend.h"
8+ #include "./hrt/hrt.h"
9+
810#include <zephyr/kernel.h>
911#include <zephyr/drivers/gpio.h>
1012#include <zephyr/dt-bindings/gpio/nordic-nrf-gpio.h>
1315#include <hal/nrf_vpr_csr_vio.h>
1416#include <haly/nrfy_gpio.h>
1517
18+ #define HRT_IRQ_PRIORITY 2
19+ #define HRT_VEVIF_IDX_GPIO_CLEAR 17
20+ #define HRT_VEVIF_IDX_GPIO_SET 18
21+ #define HRT_VEVIF_IDX_GPIO_TOGGLE 19
22+
23+ #define VEVIF_IRQN (vevif ) VEVIF_IRQN_1(vevif)
24+ #define VEVIF_IRQN_1 (vevif ) VPRCLIC_##vevif##_IRQn
25+
26+ volatile uint16_t irq_arg ;
27+
1628static nrf_gpio_pin_pull_t get_pull (gpio_flags_t flags )
1729{
1830 if (flags & GPIO_PULL_UP ) {
@@ -93,25 +105,6 @@ static int gpio_nrfe_pin_configure(uint8_t port, uint16_t pin, uint32_t flags)
93105 return 0 ;
94106}
95107
96- static void gpio_nrfe_port_set_bits_raw (uint16_t set_mask )
97- {
98- uint16_t outs = nrf_vpr_csr_vio_out_get ();
99-
100- nrf_vpr_csr_vio_out_set (outs | set_mask );
101- }
102-
103- static void gpio_nrfe_port_clear_bits_raw (uint16_t clear_mask )
104- {
105- uint16_t outs = nrf_vpr_csr_vio_out_get ();
106-
107- nrf_vpr_csr_vio_out_set (outs & ~clear_mask );
108- }
109-
110- static void gpio_nrfe_port_toggle_bits (uint16_t toggle_mask )
111- {
112- nrf_vpr_csr_vio_out_toggle_set (toggle_mask );
113- }
114-
115108void process_packet (nrfe_gpio_data_packet_t * packet )
116109{
117110 if (packet -> port != 2 ) {
@@ -124,15 +117,18 @@ void process_packet(nrfe_gpio_data_packet_t *packet)
124117 break ;
125118 }
126119 case NRFE_GPIO_PIN_CLEAR : {
127- gpio_nrfe_port_clear_bits_raw (packet -> pin );
120+ irq_arg = packet -> pin ;
121+ nrf_vpr_clic_int_pending_set (NRF_VPRCLIC , VEVIF_IRQN (HRT_VEVIF_IDX_GPIO_CLEAR ));
128122 break ;
129123 }
130124 case NRFE_GPIO_PIN_SET : {
131- gpio_nrfe_port_set_bits_raw (packet -> pin );
125+ irq_arg = packet -> pin ;
126+ nrf_vpr_clic_int_pending_set (NRF_VPRCLIC , VEVIF_IRQN (HRT_VEVIF_IDX_GPIO_SET ));
132127 break ;
133128 }
134129 case NRFE_GPIO_PIN_TOGGLE : {
135- gpio_nrfe_port_toggle_bits (packet -> pin );
130+ irq_arg = packet -> pin ;
131+ nrf_vpr_clic_int_pending_set (NRF_VPRCLIC , VEVIF_IRQN (HRT_VEVIF_IDX_GPIO_TOGGLE ));
136132 break ;
137133 }
138134 default : {
@@ -141,6 +137,26 @@ void process_packet(nrfe_gpio_data_packet_t *packet)
141137 }
142138}
143139
140+ #define HRT_CONNECT (vevif , handler ) \
141+ IRQ_DIRECT_CONNECT(vevif, HRT_IRQ_PRIORITY, handler, 0); \
142+ nrf_vpr_clic_int_enable_set(NRF_VPRCLIC, VEVIF_IRQN(vevif), true)
143+
144+
145+ __attribute__ ((interrupt )) void hrt_handler_clear_bits (void )
146+ {
147+ hrt_clear_bits ();
148+ }
149+
150+ __attribute__ ((interrupt )) void hrt_handler_set_bits (void )
151+ {
152+ hrt_set_bits ();
153+ }
154+
155+ __attribute__ ((interrupt )) void hrt_handler_toggle_bits (void )
156+ {
157+ hrt_toggle_bits ();
158+ }
159+
144160int main (void )
145161{
146162 int ret = 0 ;
@@ -150,9 +166,11 @@ int main(void)
150166 return 0 ;
151167 }
152168
153- if (!nrf_vpr_csr_rtperiph_enable_check ()) {
154- nrf_vpr_csr_rtperiph_enable_set (true);
155- }
169+ HRT_CONNECT (HRT_VEVIF_IDX_GPIO_CLEAR , hrt_handler_clear_bits );
170+ HRT_CONNECT (HRT_VEVIF_IDX_GPIO_SET , hrt_handler_set_bits );
171+ HRT_CONNECT (HRT_VEVIF_IDX_GPIO_TOGGLE , hrt_handler_toggle_bits );
172+
173+ nrf_vpr_csr_rtperiph_enable_set (true);
156174
157175 while (true) {
158176 k_cpu_idle ();
0 commit comments