Skip to content
This repository was archived by the owner on Oct 23, 2025. It is now read-only.

Commit 842dac6

Browse files
committed
timer: Add support for DPPI to TIMER
Add use of DPPI to TIMER if DPPI is defined. Signed-off-by: Sletnes Bjørlo, Aurora <[email protected]>
1 parent 1e64248 commit 842dac6

File tree

2 files changed

+341
-1
lines changed

2 files changed

+341
-1
lines changed

src/HW_models/NRF_TIMER.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@
88
#include "time_machine_if.h"
99
#include "NRF_TIMER.h"
1010
#include "NRF_HW_model_top.h"
11+
#if defined(PPI_PRESENT)
1112
#include "NRF_PPI.h"
13+
#elif defined(DPPI_PRESENT)
14+
#include "NRF_DPPI.h"
15+
#endif
1216
#include "irq_ctrl.h"
1317
#include "irq_sources.h"
1418
#include "bs_tracing.h"
@@ -344,6 +348,7 @@ void nrf_timer_timer_triggered() {
344348

345349
NRF_TIMER_regs[t].EVENTS_COMPARE[cc] = 1;
346350

351+
#if !defined(DPPI_PRESENT)
347352
ppi_event_types_t event_cc;
348353
switch (t) {
349354
case 0:
@@ -365,6 +370,13 @@ void nrf_timer_timer_triggered() {
365370
}
366371

367372
nrf_ppi_event(event_cc + cc);
373+
#else
374+
if (NRF_TIMER_regs[t].PUBLISH_COMPARE[cc] & TIMER_PUBLISH_COMPARE_EN_Msk)
375+
{
376+
uint8_t channel = NRF_TIMER_regs[t].PUBLISH_COMPARE[cc] & TIMER_PUBLISH_COMPARE_CHIDX_Msk;
377+
nrf_dppi_publish(channel);
378+
}
379+
#endif
368380

369381
if ( TIMER_INTEN[t] & (TIMER_INTENSET_COMPARE0_Msk << cc) ){
370382
int irq = NRF5_IRQ_TIMER0_IRQn;
@@ -391,4 +403,3 @@ void nrf_timer_timer_triggered() {
391403
}//for t(imer)
392404
update_master_timer();
393405
}
394-

src/nrfx/hal/nrf_timer.c

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
#include "hal/nrf_timer.h"
99
#include "bs_tracing.h"
1010
#include "NRF_TIMER.h"
11+
#if defined(DPPI_PRESENT)
12+
#include "NRF_DPPI.h"
13+
#endif
1114

1215
static int timer_number_from_ptr(NRF_TIMER_Type * p_reg){
1316
int i = ( (int)p_reg - (int)&NRF_TIMER_regs[0] ) / sizeof(NRF_TIMER_Type);
@@ -83,6 +86,332 @@ void nrf_timer_int_disable(NRF_TIMER_Type * p_reg,
8386
nrf_timer_regw_sideeffects_INTENCLR(i);
8487
}
8588

89+
#if defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
90+
91+
void nrf_timer_subscriber_add(int timer_number, nrf_timer_task_t task, uint8_t channel)
92+
{
93+
switch(task)
94+
{
95+
case NRF_TIMER_TASK_START:
96+
switch(timer_number)
97+
{
98+
case 0:
99+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_START);
100+
break;
101+
case 1:
102+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_START);
103+
break;
104+
case 2:
105+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_START);
106+
break;
107+
}
108+
break;
109+
case NRF_TIMER_TASK_STOP:
110+
switch(timer_number)
111+
{
112+
case 0:
113+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_STOP);
114+
break;
115+
case 1:
116+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_STOP);
117+
break;
118+
case 2:
119+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_STOP);
120+
break;
121+
}
122+
break;
123+
case NRF_TIMER_TASK_COUNT:
124+
switch(timer_number)
125+
{
126+
case 0:
127+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_COUNT);
128+
break;
129+
case 1:
130+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_COUNT);
131+
break;
132+
case 2:
133+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_COUNT);
134+
break;
135+
}
136+
break;
137+
case NRF_TIMER_TASK_CLEAR:
138+
switch(timer_number)
139+
{
140+
case 0:
141+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_CLEAR);
142+
break;
143+
case 1:
144+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_CLEAR);
145+
break;
146+
case 2:
147+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_CLEAR);
148+
break;
149+
}
150+
break;
151+
case NRF_TIMER_TASK_CAPTURE0:
152+
switch(timer_number)
153+
{
154+
case 0:
155+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_CAPTURE_0);
156+
break;
157+
case 1:
158+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_CAPTURE_0);
159+
break;
160+
case 2:
161+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_CAPTURE_0);
162+
break;
163+
}
164+
break;
165+
case NRF_TIMER_TASK_CAPTURE1:
166+
switch(timer_number)
167+
{
168+
case 0:
169+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_CAPTURE_1);
170+
break;
171+
case 1:
172+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_CAPTURE_1);
173+
break;
174+
case 2:
175+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_CAPTURE_1);
176+
break;
177+
}
178+
break;
179+
case NRF_TIMER_TASK_CAPTURE2:
180+
switch(timer_number)
181+
{
182+
case 0:
183+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_CAPTURE_2);
184+
break;
185+
case 1:
186+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_CAPTURE_2);
187+
break;
188+
case 2:
189+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_CAPTURE_2);
190+
break;
191+
}
192+
break;
193+
case NRF_TIMER_TASK_CAPTURE3:
194+
switch(timer_number)
195+
{
196+
case 0:
197+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_CAPTURE_3);
198+
break;
199+
case 1:
200+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_CAPTURE_3);
201+
break;
202+
case 2:
203+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_CAPTURE_3);
204+
break;
205+
}
206+
break;
207+
#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__)
208+
case NRF_TIMER_TASK_CAPTURE4:
209+
switch(timer_number)
210+
{
211+
case 0:
212+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_CAPTURE_4);
213+
break;
214+
case 1:
215+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_CAPTURE_4);
216+
break;
217+
case 2:
218+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_CAPTURE_4);
219+
break;
220+
}
221+
break;
222+
#endif
223+
#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__)
224+
case NRF_TIMER_TASK_CAPTURE5:
225+
switch(timer_number)
226+
{
227+
case 0:
228+
nrf_dppi_subscriber_add(channel, nrf_timer0_TASK_CAPTURE_5);
229+
break;
230+
case 1:
231+
nrf_dppi_subscriber_add(channel, nrf_timer1_TASK_CAPTURE_5);
232+
break;
233+
case 2:
234+
nrf_dppi_subscriber_add(channel, nrf_timer2_TASK_CAPTURE_5);
235+
break;
236+
}
237+
break;
238+
#endif
239+
default:
240+
break;
241+
}
242+
}
243+
244+
void nrf_timer_subscriber_remove(int timer_number, nrf_timer_task_t task)
245+
{
246+
switch(task)
247+
{
248+
case NRF_TIMER_TASK_START:
249+
switch(timer_number)
250+
{
251+
case 0:
252+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_START);
253+
break;
254+
case 1:
255+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_START);
256+
break;
257+
case 2:
258+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_START);
259+
break;
260+
}
261+
break;
262+
case NRF_TIMER_TASK_STOP:
263+
switch(timer_number)
264+
{
265+
case 0:
266+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_STOP);
267+
break;
268+
case 1:
269+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_STOP);
270+
break;
271+
case 2:
272+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_STOP);
273+
break;
274+
}
275+
break;
276+
case NRF_TIMER_TASK_COUNT:
277+
switch(timer_number)
278+
{
279+
case 0:
280+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_COUNT);
281+
break;
282+
case 1:
283+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_COUNT);
284+
break;
285+
case 2:
286+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_COUNT);
287+
break;
288+
}
289+
break;
290+
case NRF_TIMER_TASK_CLEAR:
291+
switch(timer_number)
292+
{
293+
case 0:
294+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_CLEAR);
295+
break;
296+
case 1:
297+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_CLEAR);
298+
break;
299+
case 2:
300+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_CLEAR);
301+
break;
302+
}
303+
break;
304+
case NRF_TIMER_TASK_CAPTURE0:
305+
switch(timer_number)
306+
{
307+
case 0:
308+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_CAPTURE_0);
309+
break;
310+
case 1:
311+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_CAPTURE_0);
312+
break;
313+
case 2:
314+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_CAPTURE_0);
315+
break;
316+
}
317+
break;
318+
case NRF_TIMER_TASK_CAPTURE1:
319+
switch(timer_number)
320+
{
321+
case 0:
322+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_CAPTURE_1);
323+
break;
324+
case 1:
325+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_CAPTURE_1);
326+
break;
327+
case 2:
328+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_CAPTURE_1);
329+
break;
330+
}
331+
break;
332+
case NRF_TIMER_TASK_CAPTURE2:
333+
switch(timer_number)
334+
{
335+
case 0:
336+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_CAPTURE_2);
337+
break;
338+
case 1:
339+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_CAPTURE_2);
340+
break;
341+
case 2:
342+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_CAPTURE_2);
343+
break;
344+
}
345+
break;
346+
case NRF_TIMER_TASK_CAPTURE3:
347+
switch(timer_number)
348+
{
349+
case 0:
350+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_CAPTURE_3);
351+
break;
352+
case 1:
353+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_CAPTURE_3);
354+
break;
355+
case 2:
356+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_CAPTURE_3);
357+
break;
358+
}
359+
break;
360+
#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__)
361+
case NRF_TIMER_TASK_CAPTURE4:
362+
switch(timer_number)
363+
{
364+
case 0:
365+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_CAPTURE_4);
366+
break;
367+
case 1:
368+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_CAPTURE_4);
369+
break;
370+
case 2:
371+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_CAPTURE_4);
372+
break;
373+
}
374+
break;
375+
#endif
376+
#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__)
377+
case NRF_TIMER_TASK_CAPTURE5:
378+
switch(timer_number)
379+
{
380+
case 0:
381+
nrf_dppi_subscriber_remove(nrf_timer0_TASK_CAPTURE_5);
382+
break;
383+
case 1:
384+
nrf_dppi_subscriber_remove(nrf_timer1_TASK_CAPTURE_5);
385+
break;
386+
case 2:
387+
nrf_dppi_subscriber_remove(nrf_timer2_TASK_CAPTURE_5);
388+
break;
389+
}
390+
break;
391+
#endif
392+
default:
393+
break;
394+
}
395+
}
396+
397+
void nrf_timer_subscribe_set(NRF_TIMER_Type * p_reg,
398+
nrf_timer_task_t task,
399+
uint8_t channel)
400+
{
401+
*((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) =
402+
((uint32_t)channel | TIMER_SUBSCRIBE_START_EN_Msk);
403+
nrf_timer_subscriber_add(timer_number_from_ptr(p_reg), task, channel);
404+
}
405+
406+
void nrf_timer_subscribe_clear(NRF_TIMER_Type * p_reg,
407+
nrf_timer_task_t task)
408+
{
409+
*((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) = 0;
410+
nrf_timer_subscriber_remove(timer_number_from_ptr(p_reg), task);
411+
}
412+
413+
#endif // defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
414+
86415
void nrf_timer_mode_set(NRF_TIMER_Type * p_reg,
87416
nrf_timer_mode_t mode)
88417
{

0 commit comments

Comments
 (0)