nrf52 RTC: add event handling support
This commit is contained in:
parent
407667480a
commit
fa6bb5411d
@ -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
|
||||
****************************************************************************/
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user