arch/nrf{52|53|91}: fix timer for small intervals and correct CC overflow check

This commit is contained in:
raiden00pl 2023-09-28 16:29:19 +02:00 committed by Xiang Xiao
parent 0611f39cdc
commit 4ea825ef9e
3 changed files with 24 additions and 12 deletions

View File

@ -46,10 +46,14 @@
#define NRF52_TIMER_CC (NRF52_TIM_CC0)
#define NRF52_TIMER_INT (NRF52_TIM_INT_COMPARE0)
#define NRF52_TIMER_RES (NRF52_TIM_WIDTH_32B)
#define NRF52_TIMER_MAX (0xffffffff)
#define NRF52_TIMER_MAX (4294967295ul)
#define NRF52_TIMER_PRE (NRF52_TIM_PRE_1000000)
#define NRF52_TIMER_PER (1000000)
/* Maximum supported timeout */
#define NRF52_TIMER_MAXTIMEOUT (NRF52_TIMER_MAX * 1000000 / NRF52_TIMER_PER)
/****************************************************************************
* Private Types
****************************************************************************/
@ -350,7 +354,7 @@ static int nrf52_timer_settimeout(struct timer_lowerhalf_s *lower,
{
struct nrf52_timer_lowerhalf_s *priv =
(struct nrf52_timer_lowerhalf_s *)lower;
uint64_t cc = 0;
uint32_t cc = 0;
int ret = OK;
DEBUGASSERT(priv);
@ -361,13 +365,13 @@ static int nrf52_timer_settimeout(struct timer_lowerhalf_s *lower,
goto errout;
}
if (timeout > NRF52_TIMER_MAX)
if (timeout > NRF52_TIMER_MAXTIMEOUT)
{
ret = -EINVAL;
goto errout;
}
cc = (timeout / 1000000) * NRF52_TIMER_PER;
cc = (timeout * NRF52_TIMER_PER / 1000000);
NRF52_TIM_SETCC(priv->tim, NRF52_TIMER_CC, cc);
errout:

View File

@ -46,10 +46,14 @@
#define NRF53_TIMER_CC (NRF53_TIM_CC0)
#define NRF53_TIMER_INT (NRF53_TIM_INT_COMPARE0)
#define NRF53_TIMER_RES (NRF53_TIM_WIDTH_32B)
#define NRF53_TIMER_MAX (0xffffffff)
#define NRF53_TIMER_MAX (4294967295ul)
#define NRF53_TIMER_PRE (NRF53_TIM_PRE_1000000)
#define NRF53_TIMER_PER (1000000)
/* Maximum supported timeout */
#define NRF53_TIMER_MAXTIMEOUT (NRF53_TIMER_MAX * 1000000 / NRF53_TIMER_PER)
/****************************************************************************
* Private Types
****************************************************************************/
@ -350,7 +354,7 @@ static int nrf53_timer_settimeout(struct timer_lowerhalf_s *lower,
{
struct nrf53_timer_lowerhalf_s *priv =
(struct nrf53_timer_lowerhalf_s *)lower;
uint64_t cc = 0;
uint32_t cc = 0;
int ret = OK;
DEBUGASSERT(priv);
@ -361,13 +365,13 @@ static int nrf53_timer_settimeout(struct timer_lowerhalf_s *lower,
goto errout;
}
if (timeout > NRF53_TIMER_MAX)
if (timeout > NRF53_TIMER_MAXTIMEOUT)
{
ret = -EINVAL;
goto errout;
}
cc = (timeout / 1000000) * NRF53_TIMER_PER;
cc = (timeout * NRF53_TIMER_PER / 1000000);
NRF53_TIM_SETCC(priv->tim, NRF53_TIMER_CC, cc);
errout:

View File

@ -46,10 +46,14 @@
#define NRF91_TIMER_CC (NRF91_TIM_CC0)
#define NRF91_TIMER_INT (NRF91_TIM_INT_COMPARE0)
#define NRF91_TIMER_RES (NRF91_TIM_WIDTH_32B)
#define NRF91_TIMER_MAX (0xffffffff)
#define NRF91_TIMER_MAX (4294967295ul)
#define NRF91_TIMER_PRE (NRF91_TIM_PRE_1000000)
#define NRF91_TIMER_PER (1000000)
/* Maximum supported timeout */
#define NRF91_TIMER_MAXTIMEOUT (NRF91_TIMER_MAX * 1000000 / NRF91_TIMER_PER)
/****************************************************************************
* Private Types
****************************************************************************/
@ -350,7 +354,7 @@ static int nrf91_timer_settimeout(struct timer_lowerhalf_s *lower,
{
struct nrf91_timer_lowerhalf_s *priv =
(struct nrf91_timer_lowerhalf_s *)lower;
uint64_t cc = 0;
uint32_t cc = 0;
int ret = OK;
DEBUGASSERT(priv);
@ -361,13 +365,13 @@ static int nrf91_timer_settimeout(struct timer_lowerhalf_s *lower,
goto errout;
}
if (timeout > NRF91_TIMER_MAX)
if (timeout > NRF91_TIMER_MAXTIMEOUT)
{
ret = -EINVAL;
goto errout;
}
cc = (timeout / 1000000) * NRF91_TIMER_PER;
cc = (timeout * NRF91_TIMER_PER / 1000000);
NRF91_TIM_SETCC(priv->tim, NRF91_TIMER_CC, cc);
errout: