You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by je...@apache.org on 2025/11/18 12:02:36 UTC
(nuttx) 01/06: arch/arm64: revert oneshot drivers to timespec API.
This is an automated email from the ASF dual-hosted git repository.
jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit ec45923cbe39c772c053c075b95b3842479f193b
Author: ouyangxiangzhen <ou...@xiaomi.com>
AuthorDate: Fri Aug 29 21:24:42 2025 +0800
arch/arm64: revert oneshot drivers to timespec API.
This commit reverted oneshot drivers to timespec API.
Signed-off-by: ouyangxiangzhen <ou...@xiaomi.com>
---
arch/arm64/src/common/arm64_arch_timer.c | 131 ++++++++-----------------------
1 file changed, 34 insertions(+), 97 deletions(-)
diff --git a/arch/arm64/src/common/arm64_arch_timer.c b/arch/arm64/src/common/arm64_arch_timer.c
index 3aac9b1615f..b487221e205 100644
--- a/arch/arm64/src/common/arm64_arch_timer.c
+++ b/arch/arm64/src/common/arm64_arch_timer.c
@@ -89,38 +89,14 @@ static inline void arm64_arch_timer_set_compare(uint64_t value)
static inline void arm64_arch_timer_enable(bool enable)
{
- uint64_t value;
-
- value = read_sysreg(cntv_ctl_el0);
-
- if (enable)
- {
- value |= CNTV_CTL_ENABLE_BIT;
- }
- else
- {
- value &= ~CNTV_CTL_ENABLE_BIT;
- }
-
- write_sysreg(value, cntv_ctl_el0);
+ modify_sysreg(enable ? CNTV_CTL_ENABLE_BIT : 0u,
+ CNTV_CTL_ENABLE_BIT, cntv_ctl_el0);
}
static inline void arm64_arch_timer_set_irq_mask(bool mask)
{
- uint64_t value;
-
- value = read_sysreg(cntv_ctl_el0);
-
- if (mask)
- {
- value |= CNTV_CTL_IMASK_BIT;
- }
- else
- {
- value &= ~CNTV_CTL_IMASK_BIT;
- }
-
- write_sysreg(value, cntv_ctl_el0);
+ modify_sysreg(mask ? CNTV_CTL_IMASK_BIT : 0u,
+ CNTV_CTL_IMASK_BIT, cntv_ctl_el0);
}
static inline uint64_t arm64_arch_timer_count(void)
@@ -133,45 +109,6 @@ static inline uint64_t arm64_arch_timer_get_cntfrq(void)
return read_sysreg(cntfrq_el0);
}
-static inline uint64_t arm64_arch_cnt2tick(uint64_t count, uint64_t freq)
-{
- uint64_t sec;
- uint64_t ticks;
-
- /* In case of count * TICK_PER_SEC overflow.
- * We should divide the count into two parts:
- * The second part and sub-second part.
- */
-
- sec = count / freq;
- ticks = sec * TICK_PER_SEC;
-
- /* Here we convert the sub-second part to ticks. */
-
- count -= sec * freq;
- ticks += count * TICK_PER_SEC / freq;
-
- return ticks;
-}
-
-static inline uint64_t arm64_arch_tick2cnt(uint64_t ticks, uint64_t freq)
-{
- uint64_t count;
- uint64_t sec;
-
- /* First we convert the second part to count. */
-
- sec = div_const(ticks, TICK_PER_SEC);
- count = sec * freq;
-
- /* Here we convert the sub-second part to count. */
-
- ticks -= sec * TICK_PER_SEC;
- count += div_const(ticks * freq, TICK_PER_SEC);
-
- return count;
-}
-
/****************************************************************************
* Private Functions
****************************************************************************/
@@ -227,12 +164,15 @@ static int arm64_arch_timer_compare_isr(int irq, void *regs, void *arg)
*
****************************************************************************/
-static int arm64_tick_max_delay(struct oneshot_lowerhalf_s *lower,
- clock_t *ticks)
+static int arm64_max_delay(struct oneshot_lowerhalf_s *lower,
+ struct timespec *ts)
{
- DEBUGASSERT(ticks != NULL);
+ uint64_t freq = arm64_arch_timer_get_cntfrq();
- *ticks = (clock_t)UINT32_MAX;
+ DEBUGASSERT(ts != NULL);
+
+ ts->tv_sec = UINT64_MAX / freq;
+ ts->tv_nsec = UINT64_MAX % freq * NSEC_PER_SEC / freq;
return OK;
}
@@ -260,13 +200,13 @@ static int arm64_tick_max_delay(struct oneshot_lowerhalf_s *lower,
*
****************************************************************************/
-static int arm64_tick_cancel(struct oneshot_lowerhalf_s *lower,
- clock_t *ticks)
+static int arm64_cancel(struct oneshot_lowerhalf_s *lower,
+ struct timespec *ts)
{
struct arm64_oneshot_lowerhalf_s *priv =
(struct arm64_oneshot_lowerhalf_s *)lower;
- DEBUGASSERT(priv != NULL && ticks != NULL);
+ DEBUGASSERT(priv != NULL && ts != NULL);
/* Disable int */
@@ -296,17 +236,16 @@ static int arm64_tick_cancel(struct oneshot_lowerhalf_s *lower,
*
****************************************************************************/
-static int arm64_tick_start(struct oneshot_lowerhalf_s *lower,
- oneshot_callback_t callback, void *arg,
- clock_t ticks)
+static int arm64_start(struct oneshot_lowerhalf_s *lower,
+ oneshot_callback_t callback, void *arg,
+ const struct timespec *ts)
{
- uint64_t next_cnt;
- uint64_t next_tick;
+ uint64_t count;
struct arm64_oneshot_lowerhalf_s *priv =
(struct arm64_oneshot_lowerhalf_s *)lower;
uint64_t freq = priv->frequency;
- DEBUGASSERT(priv != NULL && callback != NULL);
+ DEBUGASSERT(priv && callback && ts);
/* Save the new handler and its argument */
@@ -315,16 +254,11 @@ static int arm64_tick_start(struct oneshot_lowerhalf_s *lower,
priv->running = this_cpu();
- /* Align the timer count to the tick boundary.
- * Notice that this is just a work-around. We should pass both
- * the current system ticks and the delay ticks as input parameters.
- * But we only have the delay tick here due to the oneshot interface.
- */
-
- next_tick = arm64_arch_cnt2tick(arm64_arch_timer_count(), freq) + ticks;
- next_cnt = arm64_arch_tick2cnt(next_tick, freq);
+ count = arm64_arch_timer_count();
+ count += (uint64_t)ts->tv_sec * freq +
+ (uint64_t)ts->tv_nsec * freq / NSEC_PER_SEC;
- arm64_arch_timer_set_compare(next_cnt);
+ arm64_arch_timer_set_compare(count);
arm64_arch_timer_set_irq_mask(false);
@@ -345,18 +279,21 @@ static int arm64_tick_start(struct oneshot_lowerhalf_s *lower,
*
****************************************************************************/
-static int arm64_tick_current(struct oneshot_lowerhalf_s *lower,
- clock_t *ticks)
+static int arm64_current(struct oneshot_lowerhalf_s *lower,
+ struct timespec *ts)
{
uint64_t count;
+ uint64_t freq;
struct arm64_oneshot_lowerhalf_s *priv =
(struct arm64_oneshot_lowerhalf_s *)lower;
- DEBUGASSERT(ticks != NULL);
+ DEBUGASSERT(ts != NULL);
+ freq = priv->frequency;
count = arm64_arch_timer_count();
- *ticks = arm64_arch_cnt2tick(count, priv->frequency);
+ ts->tv_sec = count / freq;
+ ts->tv_nsec = (count % freq) * NSEC_PER_SEC / freq;
return OK;
}
@@ -389,10 +326,10 @@ static void arm64_oneshot_initialize_per_cpu(void)
static const struct oneshot_operations_s g_oneshot_ops =
{
- .tick_start = arm64_tick_start,
- .tick_current = arm64_tick_current,
- .tick_max_delay = arm64_tick_max_delay,
- .tick_cancel = arm64_tick_cancel,
+ .start = arm64_start,
+ .current = arm64_current,
+ .max_delay = arm64_max_delay,
+ .cancel = arm64_cancel,
};
/****************************************************************************