44ad6d0a23
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
823 lines
20 KiB
C
823 lines
20 KiB
C
/****************************************************************************
|
|
* arch/arm/src/nrf52/nrf52_rtc.c
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <assert.h>
|
|
#include <debug.h>
|
|
|
|
#include <nuttx/arch.h>
|
|
#include <nuttx/irq.h>
|
|
|
|
#include "arm_internal.h"
|
|
#include "hardware/nrf52_rtc.h"
|
|
|
|
#include "nrf52_rtc.h"
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Private Types
|
|
****************************************************************************/
|
|
|
|
struct nrf52_rtc_priv_s
|
|
{
|
|
struct nrf52_rtc_ops_s *ops;
|
|
uint32_t base;
|
|
uint32_t irq;
|
|
uint8_t chan;
|
|
bool inuse;
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Private Function Prototypes
|
|
****************************************************************************/
|
|
|
|
/* RTC registers access *****************************************************/
|
|
|
|
static uint32_t nrf52_rtc_getreg(struct nrf52_rtc_dev_s *dev,
|
|
uint32_t offset);
|
|
static void nrf52_rtc_putreg(struct nrf52_rtc_dev_s *dev,
|
|
uint32_t offset,
|
|
uint32_t value);
|
|
|
|
/* RTC helpers **************************************************************/
|
|
|
|
static uint32_t nrf52_rtc_irq2reg(struct nrf52_rtc_dev_s *dev,
|
|
uint8_t s);
|
|
static uint32_t nrf52_rtc_evt2reg(struct nrf52_rtc_dev_s *dev,
|
|
uint8_t evt);
|
|
|
|
/* RTC operations ***********************************************************/
|
|
|
|
static int nrf52_rtc_start(struct nrf52_rtc_dev_s *dev);
|
|
static int nrf52_rtc_stop(struct nrf52_rtc_dev_s *dev);
|
|
static int nrf52_rtc_clear(struct nrf52_rtc_dev_s *dev);
|
|
static int nrf52_rtc_trgovrflw(struct nrf52_rtc_dev_s *dev);
|
|
static int nrf52_rtc_getcounter(struct nrf52_rtc_dev_s *dev,
|
|
uint32_t *cc);
|
|
static int nrf52_rtc_setcc(struct nrf52_rtc_dev_s *dev, uint8_t i,
|
|
uint32_t cc);
|
|
static int nrf52_rtc_getcc(struct nrf52_rtc_dev_s *dev, uint8_t i,
|
|
uint32_t *cc);
|
|
static int nrf52_rtc_setpre(struct nrf52_rtc_dev_s *dev, uint16_t pre);
|
|
static int nrf52_rtc_setisr(struct nrf52_rtc_dev_s *dev, xcpt_t handler,
|
|
void * arg);
|
|
static int nrf52_rtc_enableint(struct nrf52_rtc_dev_s *dev, uint8_t s);
|
|
static int nrf52_rtc_disableint(struct nrf52_rtc_dev_s *dev, uint8_t s);
|
|
static int nrf52_rtc_checkint(struct nrf52_rtc_dev_s *dev, uint8_t s);
|
|
static int nrf52_rtc_ackint(struct nrf52_rtc_dev_s *dev, uint8_t s);
|
|
static int nrf52_rtc_enableevt(struct nrf52_rtc_dev_s *dev, uint8_t evt);
|
|
static int nrf52_rtc_disableevt(struct nrf52_rtc_dev_s *dev,
|
|
uint8_t evt);
|
|
static uint32_t nrf52_rtc_getbase(struct nrf52_rtc_dev_s *dev);
|
|
|
|
/****************************************************************************
|
|
* Private Data
|
|
****************************************************************************/
|
|
|
|
/* NRF52 RTC ops */
|
|
|
|
struct nrf52_rtc_ops_s nrf52_rtc_ops =
|
|
{
|
|
.start = nrf52_rtc_start,
|
|
.stop = nrf52_rtc_stop,
|
|
.clear = nrf52_rtc_clear,
|
|
.trgovrflw = nrf52_rtc_trgovrflw,
|
|
.getcounter = nrf52_rtc_getcounter,
|
|
.setcc = nrf52_rtc_setcc,
|
|
.getcc = nrf52_rtc_getcc,
|
|
.setpre = nrf52_rtc_setpre,
|
|
.setisr = nrf52_rtc_setisr,
|
|
.enableint = nrf52_rtc_enableint,
|
|
.disableint = nrf52_rtc_disableint,
|
|
.checkint = nrf52_rtc_checkint,
|
|
.ackint = nrf52_rtc_ackint,
|
|
.enableevt = nrf52_rtc_enableevt,
|
|
.disableevt = nrf52_rtc_disableevt,
|
|
.getbase = nrf52_rtc_getbase,
|
|
};
|
|
|
|
#ifdef CONFIG_NRF52_RTC0
|
|
/* RTC0 */
|
|
|
|
struct nrf52_rtc_priv_s g_nrf52_rtc0_priv =
|
|
{
|
|
.ops = &nrf52_rtc_ops,
|
|
.base = NRF52_RTC0_BASE,
|
|
.irq = NRF52_IRQ_RTC0,
|
|
.chan = 3,
|
|
.inuse = false,
|
|
};
|
|
#endif
|
|
|
|
#ifdef CONFIG_NRF52_RTC1
|
|
/* RTC1 */
|
|
|
|
struct nrf52_rtc_priv_s g_nrf52_rtc1_priv =
|
|
{
|
|
.ops = &nrf52_rtc_ops,
|
|
.base = NRF52_RTC1_BASE,
|
|
.irq = NRF52_IRQ_RTC1,
|
|
.chan = 4,
|
|
.inuse = false,
|
|
};
|
|
#endif
|
|
|
|
#ifdef CONFIG_NRF52_RTC2
|
|
/* RTC2 */
|
|
|
|
struct nrf52_rtc_priv_s g_nrf52_rtc2_priv =
|
|
{
|
|
.ops = &nrf52_rtc_ops,
|
|
.base = NRF52_RTC2_BASE,
|
|
.irq = NRF52_IRQ_RTC2,
|
|
.chan = 4,
|
|
.inuse = false,
|
|
};
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Private Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_getreg
|
|
*
|
|
* Description:
|
|
* Get a 32-bit register value by offset
|
|
*
|
|
****************************************************************************/
|
|
|
|
static uint32_t nrf52_rtc_getreg(struct nrf52_rtc_dev_s *dev,
|
|
uint32_t offset)
|
|
{
|
|
DEBUGASSERT(dev);
|
|
|
|
return getreg32(((struct nrf52_rtc_priv_s *)dev)->base + offset);
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_putreg
|
|
*
|
|
* Description:
|
|
* Put a 32-bit register value by offset
|
|
*
|
|
****************************************************************************/
|
|
|
|
static void nrf52_rtc_putreg(struct nrf52_rtc_dev_s *dev,
|
|
uint32_t offset,
|
|
uint32_t value)
|
|
{
|
|
DEBUGASSERT(dev);
|
|
|
|
putreg32(value, ((struct nrf52_rtc_priv_s *)dev)->base + offset);
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_irq2reg
|
|
*
|
|
* Description:
|
|
* Get the value of the interrupt register corresponding to the given
|
|
* interrupt source
|
|
*
|
|
****************************************************************************/
|
|
|
|
static uint32_t nrf52_rtc_irq2reg(struct nrf52_rtc_dev_s *dev, uint8_t s)
|
|
{
|
|
uint32_t regval = 0;
|
|
|
|
switch (s)
|
|
{
|
|
case NRF52_RTC_EVT_TICK:
|
|
{
|
|
regval = RTC_INT_TICK;
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_OVRFLW:
|
|
{
|
|
regval = RTC_INT_OVRFLW;
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE0:
|
|
{
|
|
regval = RTC_INT_COMPARE(0);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE1:
|
|
{
|
|
regval = RTC_INT_COMPARE(1);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE2:
|
|
{
|
|
regval = RTC_INT_COMPARE(2);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE3:
|
|
{
|
|
regval = RTC_INT_COMPARE(3);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
rtcerr("ERROR: unsupported IRQ source %d\n", s);
|
|
regval = 0;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
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(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
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_start(struct nrf52_rtc_dev_s *dev)
|
|
{
|
|
DEBUGASSERT(dev);
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_TASKS_START_OFFSET, RTC_TASKS_START);
|
|
|
|
return OK;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_stop
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_stop(struct nrf52_rtc_dev_s *dev)
|
|
{
|
|
DEBUGASSERT(dev);
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_TASKS_STOP_OFFSET, RTC_TASKS_STOP);
|
|
|
|
return OK;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_clear
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_clear(struct nrf52_rtc_dev_s *dev)
|
|
{
|
|
DEBUGASSERT(dev);
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_TASKS_CLEAR_OFFSET, RTC_TASKS_CLEAR);
|
|
|
|
return OK;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_trgovrflw
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_trgovrflw(struct nrf52_rtc_dev_s *dev)
|
|
{
|
|
DEBUGASSERT(dev);
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_TASKS_TRIGOVRFLW_OFFSET,
|
|
RTC_TASKS_TRIGOVRFLW);
|
|
|
|
return OK;
|
|
}
|
|
|
|
static int nrf52_rtc_getcounter(struct nrf52_rtc_dev_s *dev,
|
|
uint32_t *ctr)
|
|
{
|
|
DEBUGASSERT(dev);
|
|
DEBUGASSERT(ctr);
|
|
|
|
*ctr = nrf52_rtc_getreg(dev, NRF52_RTC_COUNTER_OFFSET);
|
|
|
|
return OK;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_setcc
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_setcc(struct nrf52_rtc_dev_s *dev, uint8_t i,
|
|
uint32_t cc)
|
|
{
|
|
struct nrf52_rtc_priv_s *rtc = NULL;
|
|
int ret = OK;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
rtc = (struct nrf52_rtc_priv_s *)dev;
|
|
|
|
/* Is the channel supported? */
|
|
|
|
if (i > rtc->chan)
|
|
{
|
|
rtcerr("ERROR: unsupported RTCER channel %d\n", i);
|
|
ret = -EINVAL;
|
|
goto errout;
|
|
}
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_CC_OFFSET(i), cc);
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_getcc
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_getcc(struct nrf52_rtc_dev_s *dev, uint8_t i,
|
|
uint32_t *cc)
|
|
{
|
|
struct nrf52_rtc_priv_s *rtc = NULL;
|
|
int ret = OK;
|
|
|
|
DEBUGASSERT(dev);
|
|
DEBUGASSERT(cc);
|
|
|
|
rtc = (struct nrf52_rtc_priv_s *)dev;
|
|
|
|
/* Is the channel supported? */
|
|
|
|
if (i > rtc->chan)
|
|
{
|
|
rtcerr("ERROR: unsupported RTCER channel %d\n", i);
|
|
ret = -EINVAL;
|
|
goto errout;
|
|
}
|
|
|
|
*cc = nrf52_rtc_getreg(dev, NRF52_RTC_CC_OFFSET(i));
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_setpre
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_setpre(struct nrf52_rtc_dev_s *dev, uint16_t pre)
|
|
{
|
|
int ret = OK;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
if (pre > RTC_PRESCALER_MAX)
|
|
{
|
|
rtcerr("ERROR: unsupported RTC prescaler %d\n", pre);
|
|
ret = -EINVAL;
|
|
goto errout;
|
|
}
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_PRESCALER_OFFSET, pre);
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_setisr
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_setisr(struct nrf52_rtc_dev_s *dev, xcpt_t handler,
|
|
void *arg)
|
|
{
|
|
struct nrf52_rtc_priv_s *rtc = NULL;
|
|
int ret = OK;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
rtc = (struct nrf52_rtc_priv_s *)dev;
|
|
|
|
/* Disable interrupt when callback is removed */
|
|
|
|
if (!handler)
|
|
{
|
|
up_disable_irq(rtc->irq);
|
|
irq_detach(rtc->irq);
|
|
ret = OK;
|
|
goto errout;
|
|
}
|
|
|
|
/* Otherwise set callback and enable interrupt */
|
|
|
|
irq_attach(rtc->irq, handler, arg);
|
|
up_enable_irq(rtc->irq);
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_enableint
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_enableint(struct nrf52_rtc_dev_s *dev, uint8_t s)
|
|
{
|
|
uint32_t regval = 0;
|
|
int ret = OK;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
/* Get register value for given interrupt source */
|
|
|
|
regval = nrf52_rtc_irq2reg(dev, s);
|
|
if (regval == 0)
|
|
{
|
|
ret = -EINVAL;
|
|
goto errout;
|
|
}
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_INTENSET_OFFSET, regval);
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_disableint
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_disableint(struct nrf52_rtc_dev_s *dev, uint8_t s)
|
|
{
|
|
uint32_t regval = 0;
|
|
int ret = OK;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
/* Get register value for given interrupt source */
|
|
|
|
regval = nrf52_rtc_irq2reg(dev, s);
|
|
if (regval == 0)
|
|
{
|
|
ret = -EINVAL;
|
|
goto errout;
|
|
}
|
|
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_INTENCLR_OFFSET, regval);
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_checkint
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_checkint(struct nrf52_rtc_dev_s *dev, uint8_t s)
|
|
{
|
|
int ret = 0;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
switch (s)
|
|
{
|
|
case NRF52_RTC_EVT_TICK:
|
|
{
|
|
ret = nrf52_rtc_getreg(dev, NRF52_RTC_EVENTS_TICK_OFFSET);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_OVRFLW:
|
|
{
|
|
ret = nrf52_rtc_getreg(dev, NRF52_RTC_EVENTS_OVRFLW_OFFSET);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE0:
|
|
{
|
|
ret = nrf52_rtc_getreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(0));
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE1:
|
|
{
|
|
ret = nrf52_rtc_getreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(1));
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE2:
|
|
{
|
|
ret = nrf52_rtc_getreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(2));
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE3:
|
|
{
|
|
ret = nrf52_rtc_getreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(3));
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
rtcerr("ERROR: unsupported IRQ source %d\n", s);
|
|
ret = -EINVAL;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_ackint
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_ackint(struct nrf52_rtc_dev_s *dev, uint8_t s)
|
|
{
|
|
int ret = 0;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
switch (s)
|
|
{
|
|
case NRF52_RTC_EVT_TICK:
|
|
{
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_EVENTS_TICK_OFFSET, 0);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_OVRFLW:
|
|
{
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_EVENTS_OVRFLW_OFFSET, 0);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE0:
|
|
{
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(0), 0);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE1:
|
|
{
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(1), 0);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE2:
|
|
{
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(2), 0);
|
|
break;
|
|
}
|
|
|
|
case NRF52_RTC_EVT_COMPARE3:
|
|
{
|
|
nrf52_rtc_putreg(dev, NRF52_RTC_EVENTS_COMPARE_OFFSET(3), 0);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
rtcerr("ERROR: unsupported IRQ source %d\n", s);
|
|
ret = -EINVAL;
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
errout:
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_enableevt
|
|
****************************************************************************/
|
|
|
|
static int nrf52_rtc_enableevt(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(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;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_getbase
|
|
****************************************************************************/
|
|
|
|
static uint32_t nrf52_rtc_getbase(struct nrf52_rtc_dev_s *dev)
|
|
{
|
|
struct nrf52_rtc_priv_s *rtc = (struct nrf52_rtc_priv_s *)dev;
|
|
DEBUGASSERT(dev);
|
|
|
|
return rtc->base;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Public Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_init
|
|
*
|
|
* Description:
|
|
* Initialize RTC device
|
|
*
|
|
****************************************************************************/
|
|
|
|
struct nrf52_rtc_dev_s *nrf52_rtc_init(int rtc)
|
|
{
|
|
struct nrf52_rtc_priv_s *priv = NULL;
|
|
|
|
/* Get RTC instance */
|
|
|
|
switch (rtc)
|
|
{
|
|
#ifdef CONFIG_NRF52_RTC0
|
|
case 0:
|
|
{
|
|
priv = &g_nrf52_rtc0_priv;
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_NRF52_RTC1
|
|
case 1:
|
|
{
|
|
priv = &g_nrf52_rtc1_priv;
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_NRF52_RTC2
|
|
case 2:
|
|
{
|
|
priv = &g_nrf52_rtc2_priv;
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
default:
|
|
{
|
|
rtcerr("ERROR: unsupported RTC %d\n", rtc);
|
|
goto errout;
|
|
}
|
|
}
|
|
|
|
if (priv->inuse != false)
|
|
{
|
|
/* RTC already in use */
|
|
|
|
priv = NULL;
|
|
}
|
|
|
|
errout:
|
|
return (struct nrf52_rtc_dev_s *)priv;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Name: nrf52_rtc_deinit
|
|
*
|
|
* Description:
|
|
* Deinit RTC device
|
|
*
|
|
****************************************************************************/
|
|
|
|
int nrf52_rtc_deinit(struct nrf52_rtc_dev_s *dev)
|
|
{
|
|
struct nrf52_rtc_priv_s *rtc = NULL;
|
|
|
|
DEBUGASSERT(dev);
|
|
|
|
rtc = (struct nrf52_rtc_priv_s *)dev;
|
|
|
|
rtc->inuse = false;
|
|
|
|
return OK;
|
|
}
|