Skip to content

Commit 56c2c82

Browse files
committed
drivers: timer: Use sys_clock_hw_cycles_per_tick in nrf_rtc_timer.
The nrf_rtc_timer used own method to calculate number of timer cycles per tick. As the result value was different than the one used by the kernel, the reported time was incorrect. This commit fixes the problem described above by using global sys_clock_hw_cycles_per_tick instead of custom RTC_TICKS_PER_SYS_TICK. Signed-off-by: Piotr Zięcik <[email protected]>
1 parent fd561dd commit 56c2c82

File tree

1 file changed

+17
-23
lines changed

1 file changed

+17
-23
lines changed

drivers/timer/nrf_rtc_timer.c

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,10 @@
3030
*/
3131
#define RTC_HALF (RTC_MASK / 2)
3232

33-
#define RTC_TICKS_PER_SYS_TICK ((u32_t)((((u64_t)1000000UL / \
34-
sys_clock_ticks_per_sec) * \
35-
1000000000UL) / 30517578125UL) & RTC_MASK)
36-
37-
extern s32_t _sys_idle_elapsed_ticks;
38-
3933
/*
4034
* rtc_past holds the value of RTC_COUNTER at the time the last sys tick was
4135
* announced, in RTC ticks. It is therefore always a multiple of
42-
* RTC_TICKS_PER_SYS_TICK.
36+
* sys_clock_hw_cycles_per_tick.
4337
*/
4438
static u32_t rtc_past;
4539

@@ -115,12 +109,12 @@ static void rtc_announce_set_next(void)
115109
/* If no sys ticks have elapsed, there is no point in incrementing the
116110
* counters or announcing it.
117111
*/
118-
if (rtc_elapsed >= RTC_TICKS_PER_SYS_TICK) {
112+
if (rtc_elapsed >= sys_clock_hw_cycles_per_tick) {
119113
#ifdef CONFIG_TICKLESS_IDLE
120114
/* Calculate how many sys ticks elapsed since the last sys tick
121115
* and notify the kernel if necessary.
122116
*/
123-
sys_elapsed = rtc_elapsed / RTC_TICKS_PER_SYS_TICK;
117+
sys_elapsed = rtc_elapsed / sys_clock_hw_cycles_per_tick;
124118

125119
if (sys_elapsed > expected_sys_ticks) {
126120
/* Never announce more sys ticks than the kernel asked
@@ -142,15 +136,15 @@ static void rtc_announce_set_next(void)
142136
* has passed.
143137
*/
144138
rtc_past = (rtc_past +
145-
(sys_elapsed * RTC_TICKS_PER_SYS_TICK)
139+
(sys_elapsed * sys_clock_hw_cycles_per_tick)
146140
) & RTC_MASK;
147141

148142
_sys_idle_elapsed_ticks = sys_elapsed;
149143
_sys_clock_tick_announce();
150144
}
151145

152146
/* Set the RTC to the next sys tick */
153-
rtc_compare_set(rtc_past + RTC_TICKS_PER_SYS_TICK);
147+
rtc_compare_set(rtc_past + sys_clock_hw_cycles_per_tick);
154148
}
155149
#endif
156150

@@ -197,16 +191,16 @@ void _timer_idle_enter(s32_t sys_ticks)
197191
#else
198192
/* Restrict ticks to max supported by RTC without risking overflow*/
199193
if ((sys_ticks < 0) ||
200-
(sys_ticks > (RTC_HALF / RTC_TICKS_PER_SYS_TICK))) {
201-
sys_ticks = RTC_HALF / RTC_TICKS_PER_SYS_TICK;
194+
(sys_ticks > (RTC_HALF / sys_clock_hw_cycles_per_tick))) {
195+
sys_ticks = RTC_HALF / sys_clock_hw_cycles_per_tick;
202196
}
203197

204198
expected_sys_ticks = sys_ticks;
205199

206200
/* If ticks is 0, the RTC interrupt handler will be set pending
207201
* immediately, meaning that we will not go to sleep.
208202
*/
209-
rtc_compare_set(rtc_past + (sys_ticks * RTC_TICKS_PER_SYS_TICK));
203+
rtc_compare_set(rtc_past + (sys_ticks * sys_clock_hw_cycles_per_tick));
210204
#endif
211205
}
212206

@@ -265,7 +259,7 @@ u32_t _get_elapsed_program_time(void)
265259
} while (rtc_prev != rtc_now);
266260

267261
/*Convert number of Machine cycles to SYS TICS*/
268-
return (rtc_elapsed / RTC_TICKS_PER_SYS_TICK);
262+
return (rtc_elapsed / sys_clock_hw_cycles_per_tick);
269263
}
270264

271265

@@ -289,14 +283,14 @@ void _set_time(u32_t time)
289283
expected_sys_ticks = time;
290284
_sys_clock_tick_count = _get_elapsed_clock_time();
291285
/* Update rtc_past to track rtc timer count*/
292-
rtc_past = (_sys_clock_tick_count * RTC_TICKS_PER_SYS_TICK) & RTC_MASK;
286+
rtc_past = (_sys_clock_tick_count * sys_clock_hw_cycles_per_tick) & RTC_MASK;
293287

294288
expected_sys_ticks = expected_sys_ticks > _get_max_clock_time() ?
295289
_get_max_clock_time() : expected_sys_ticks;
296290

297291
/* Programe RTC compare register to generate interrupt*/
298292
rtc_compare_set(rtc_past +
299-
(expected_sys_ticks * RTC_TICKS_PER_SYS_TICK));
293+
(expected_sys_ticks * sys_clock_hw_cycles_per_tick));
300294

301295
}
302296

@@ -324,8 +318,8 @@ s32_t _get_max_clock_time(void)
324318
} while (rtc_now != rtc_prev);
325319

326320
/* Convert RTC Ticks to SYS TICKS*/
327-
if (rtc_away >= RTC_TICKS_PER_SYS_TICK) {
328-
sys_away = rtc_away / RTC_TICKS_PER_SYS_TICK;
321+
if (rtc_away >= sys_clock_hw_cycles_per_tick) {
322+
sys_away = rtc_away / sys_clock_hw_cycles_per_tick;
329323
}
330324
return sys_away;
331325
}
@@ -366,9 +360,9 @@ u64_t _get_elapsed_clock_time(void)
366360
rtc_now = RTC_COUNTER;
367361
} while (rtc_now != rtc_prev);
368362

369-
if (rtc_elapsed >= RTC_TICKS_PER_SYS_TICK) {
363+
if (rtc_elapsed >= sys_clock_hw_cycles_per_tick) {
370364
/* Convert RTC cycles to SYS TICKS*/
371-
sys_elapsed = rtc_elapsed / RTC_TICKS_PER_SYS_TICK;
365+
sys_elapsed = rtc_elapsed / sys_clock_hw_cycles_per_tick;
372366
/* Update total number of SYS_TICKS passed*/
373367
elapsed += sys_elapsed;
374368
}
@@ -502,7 +496,7 @@ int _sys_clock_driver_init(struct device *device)
502496

503497
/* TODO: replace with counter driver to access RTC */
504498
SYS_CLOCK_RTC->PRESCALER = 0;
505-
SYS_CLOCK_RTC->CC[0] = RTC_TICKS_PER_SYS_TICK;
499+
SYS_CLOCK_RTC->CC[0] = sys_clock_hw_cycles_per_tick;
506500
SYS_CLOCK_RTC->EVTENSET = RTC_EVTENSET_COMPARE0_Msk;
507501
SYS_CLOCK_RTC->INTENSET = RTC_INTENSET_COMPARE0_Msk;
508502

@@ -531,7 +525,7 @@ u32_t _timer_cycle_get_32(void)
531525
do {
532526
sys_clock_tick_count = _sys_clock_tick_count;
533527
elapsed_cycles = (rtc_now - (sys_clock_tick_count *
534-
RTC_TICKS_PER_SYS_TICK)) &
528+
sys_clock_hw_cycles_per_tick)) &
535529
RTC_MASK;
536530
rtc_prev = rtc_now;
537531
rtc_now = RTC_COUNTER;

0 commit comments

Comments
 (0)