nrf52 RTC: add event handling support

This commit is contained in:
Matias N 2020-07-24 22:59:05 -03:00 committed by Mateusz Szafoni
parent 407667480a
commit fa6bb5411d
2 changed files with 143 additions and 3 deletions

View File

@ -68,6 +68,8 @@ static void nrf52_rtc_putreg(FAR struct nrf52_rtc_dev_s *dev,
static uint32_t nrf52_rtc_irq2reg(FAR struct nrf52_rtc_dev_s *dev,
uint8_t s);
static uint32_t nrf52_rtc_evt2reg(FAR struct nrf52_rtc_dev_s *dev,
uint8_t evt);
/* RTC operations ***********************************************************/
@ -86,6 +88,8 @@ static int nrf52_rtc_enableint(FAR struct nrf52_rtc_dev_s *dev, uint8_t s);
static int nrf52_rtc_disableint(FAR struct nrf52_rtc_dev_s *dev, uint8_t s);
static int nrf52_rtc_checkint(FAR struct nrf52_rtc_dev_s *dev, uint8_t s);
static int nrf52_rtc_ackint(FAR struct nrf52_rtc_dev_s *dev, uint8_t s);
static int nrf52_rtc_enableevt(FAR struct nrf52_rtc_dev_s *dev, uint8_t evt);
static int nrf52_rtc_disableevt(FAR struct nrf52_rtc_dev_s *dev, uint8_t evt);
/****************************************************************************
* Private Data
@ -106,7 +110,9 @@ struct nrf52_rtc_ops_s nrf52_rtc_ops =
.enableint = nrf52_rtc_enableint,
.disableint = nrf52_rtc_disableint,
.checkint = nrf52_rtc_checkint,
.ackint = nrf52_rtc_ackint
.ackint = nrf52_rtc_ackint,
.enableevt = nrf52_rtc_enableevt,
.disableevt = nrf52_rtc_disableevt,
};
#ifdef CONFIG_NRF52_RTC0
@ -189,7 +195,7 @@ static void nrf52_rtc_putreg(FAR struct nrf52_rtc_dev_s *dev,
* Name: nrf52_rtc_irq2reg
*
* Description:
* Get the vaule of the interrupt register corresponding to the given
* Get the value of the interrupt register corresponding to the given
* interrupt source
*
****************************************************************************/
@ -248,6 +254,69 @@ errout:
return regval;
}
/****************************************************************************
* Name: nrf52_rtc_evt2reg
*
* Description:
* Get the offset of the event register corresponding to the given event
*
****************************************************************************/
static uint32_t nrf52_rtc_evt2reg(FAR struct nrf52_rtc_dev_s *dev,
uint8_t evt)
{
uint32_t regval;
switch (evt)
{
case NRF52_RTC_EVT_TICK:
{
regval = RTC_EVTEN_TICK;
break;
}
case NRF52_RTC_EVT_OVRFLW:
{
regval = RTC_EVTEN_OVRFLW;
break;
}
case NRF52_RTC_EVT_COMPARE0:
{
regval = RTC_EVTEN_COMPARE(0);
break;
}
case NRF52_RTC_EVT_COMPARE1:
{
regval = RTC_EVTEN_COMPARE(1);
break;
}
case NRF52_RTC_EVT_COMPARE2:
{
regval = RTC_EVTEN_COMPARE(2);
break;
}
case NRF52_RTC_EVT_COMPARE3:
{
regval = RTC_EVTEN_COMPARE(3);
break;
}
default:
{
rtcerr("ERROR: unsupported EVENT %d\n", evt);
regval = 0;
goto errout;
}
}
errout:
return regval;
}
/****************************************************************************
* Name: nrf52_rtc_start
****************************************************************************/
@ -588,6 +657,58 @@ errout:
return ret;
}
/****************************************************************************
* Name: nrf52_rtc_enableevt
****************************************************************************/
static int nrf52_rtc_enableevt(FAR struct nrf52_rtc_dev_s *dev, uint8_t evt)
{
uint32_t regval = 0;
int ret = OK;
DEBUGASSERT(dev);
/* Get register value for given event */
regval = nrf52_rtc_evt2reg(dev, evt);
if (regval == 0)
{
ret = -EINVAL;
goto errout;
}
nrf52_rtc_putreg(dev, NRF52_RTC_EVTENSET_OFFSET, regval);
errout:
return ret;
}
/****************************************************************************
* Name: nrf52_rtc_disableevt
****************************************************************************/
static int nrf52_rtc_disableevt(FAR struct nrf52_rtc_dev_s *dev, uint8_t evt)
{
uint32_t regval = 0;
int ret = OK;
DEBUGASSERT(dev);
/* Get register value for given event */
regval = nrf52_rtc_evt2reg(dev, evt);
if (regval == 0)
{
ret = -EINVAL;
goto errout;
}
nrf52_rtc_putreg(dev, NRF52_RTC_EVTENCLR_OFFSET, regval);
errout:
return ret;
}
/****************************************************************************
* Public Functions
****************************************************************************/

View File

@ -42,11 +42,13 @@
#define NRF52_RTC_SETCC(d, i, cc) ((d)->ops->setcc(d, i, cc))
#define NRF52_RTC_GETCC(d, i, cc) ((d)->ops->setcc(d, i, cc))
#define NRF52_RTC_SETPRE(d, pre) ((d)->ops->setpre(d, pre))
#define NRF52_RTC_SETISR(d, hnd, arg, s) ((d)->ops->setisr(d, hnd, arg, s))
#define NRF52_RTC_SETISR(d, hnd, arg) ((d)->ops->setisr(d, hnd, arg))
#define NRF52_RTC_ENABLEINT(d, s) ((d)->ops->enableint(d, s))
#define NRF52_RTC_DISABLEINT(d, s) ((d)->ops->disableint(d, s))
#define NRF52_RTC_CHECKINT(d, s) ((d)->ops->checkint(d, s))
#define NRF52_RTC_ACKINT(d, s) ((d)->ops->ackint(d, s))
#define NRF52_RTC_ENABLEEVT(d, s) ((d)->ops->enableevt(d, s))
#define NRF52_RTC_DISABLEEVT(d, s) ((d)->ops->disableevt(d, s))
/****************************************************************************
* Public Types
@ -74,6 +76,18 @@ enum nrf52_rtc_irq_e
NRF52_RTC_INT_COMPARE3 = 5,
};
/* RTC Events */
enum nrf52_rtc_evt_e
{
NRF52_RTC_EVT_TICK = 0,
NRF52_RTC_EVT_OVRFLW = 1,
NRF52_RTC_EVT_COMPARE0 = 2,
NRF52_RTC_EVT_COMPARE1 = 3,
NRF52_RTC_EVT_COMPARE2 = 4,
NRF52_RTC_EVT_COMPARE3 = 5,
};
/* NRF52 RTC device */
struct nrf52_rtc_dev_s
@ -107,6 +121,11 @@ struct nrf52_rtc_ops_s
CODE int (*disableint)(FAR struct nrf52_rtc_dev_s *dev, uint8_t source);
CODE int (*checkint)(FAR struct nrf52_rtc_dev_s *dev, uint8_t source);
CODE int (*ackint)(FAR struct nrf52_rtc_dev_s *dev, uint8_t source);
/* RTC events */
CODE int (*enableevt)(FAR struct nrf52_rtc_dev_s *dev, uint8_t evt);
CODE int (*disableevt)(FAR struct nrf52_rtc_dev_s *dev, uint8_t evt);
};
/****************************************************************************