NRF5: Add support for PAL events, EXT driver removed.

This commit is contained in:
Konstantin Oblaukhov 2018-11-24 21:45:27 +07:00 committed by Konstantin K. Oblaukhov
parent 4decb6aed3
commit a9b84aa036
15 changed files with 326 additions and 395 deletions

View File

@ -1,9 +0,0 @@
ifeq ($(USE_SMART_BUILD),yes)
ifneq ($(findstring HAL_USE_EXT TRUE,$(HALCONF)),)
PLATFORMSRC_CONTRIB += ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.c
endif
else
PLATFORMSRC_CONTRIB += ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.c
endif
PLATFORMINC_CONTRIB += ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/GPIOTEv1

View File

@ -1,168 +0,0 @@
/*
Copyright (C) 2015 Stephen Caudle
Licensed 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.
*/
/**
* @file GPIOTEv1/ext_lld.c
* @brief NRF51 EXT subsystem low level driver source.
*
* @addtogroup EXT
* @{
*/
#include "hal.h"
#if HAL_USE_EXT || defined(__DOXYGEN__)
#include "hal_ext_lld_isr.h"
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/**
* @brief EXTD1 driver identifier.
*/
EXTDriver EXTD1;
/*===========================================================================*/
/* Driver local variables and types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief Low level EXT driver initialization.
*
* @notapi
*/
void ext_lld_init(void) {
/* Driver initialization.*/
extObjectInit(&EXTD1);
}
/**
* @brief Configures and activates the EXT peripheral.
*
* @param[in] extp pointer to the @p EXTDriver object
*
* @notapi
*/
void ext_lld_start(EXTDriver *extp) {
unsigned i;
ext_lld_exti_irq_enable();
/* Configuration of automatic channels.*/
for (i = 0; i < EXT_MAX_CHANNELS; i++) {
uint32_t config = 0;
uint32_t pad = (extp->config->channels[i].mode & EXT_MODE_GPIO_MASK)
>> EXT_MODE_GPIO_OFFSET;
if (extp->config->channels[i].mode & EXT_CH_MODE_BOTH_EDGES)
config |= (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos);
else if (extp->config->channels[i].mode & EXT_CH_MODE_RISING_EDGE)
config |= (GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos);
else
config |= (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos);
config |= (pad << GPIOTE_CONFIG_PSEL_Pos);
NRF_GPIOTE->CONFIG[i] = config;
NRF_GPIOTE->EVENTS_PORT = 0;
NRF_GPIOTE->EVENTS_IN[i] = 0;
if (extp->config->channels[i].mode & EXT_CH_MODE_AUTOSTART)
ext_lld_channel_enable(extp, i);
else
ext_lld_channel_disable(extp, i);
}
}
/**
* @brief Deactivates the EXT peripheral.
*
* @param[in] extp pointer to the @p EXTDriver object
*
* @notapi
*/
void ext_lld_stop(EXTDriver *extp) {
unsigned i;
(void)extp;
ext_lld_exti_irq_disable();
for (i = 0; i < EXT_MAX_CHANNELS; i++)
NRF_GPIOTE->CONFIG[i] = 0;
NRF_GPIOTE->INTENCLR =
(GPIOTE_INTENCLR_IN3_Msk | GPIOTE_INTENCLR_IN2_Msk |
GPIOTE_INTENCLR_IN1_Msk | GPIOTE_INTENCLR_IN0_Msk);
}
/**
* @brief Enables an EXT channel.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be enabled
*
* @notapi
*/
void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel) {
uint32_t config = NRF_GPIOTE->CONFIG[channel] & ~GPIOTE_CONFIG_MODE_Msk;
(void)extp;
config |= (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);
NRF_GPIOTE->CONFIG[channel] = config;
NRF_GPIOTE->INTENSET = (1 << channel);
}
/**
* @brief Disables an EXT channel.
*
* @param[in] extp pointer to the @p EXTDriver object
* @param[in] channel channel to be disabled
*
* @notapi
*/
void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel) {
(void)extp;
NRF_GPIOTE->CONFIG[channel] &= ~GPIOTE_CONFIG_MODE_Msk;
NRF_GPIOTE->INTENCLR = (1 << channel);
}
#endif /* HAL_USE_EXT */
/** @} */

View File

@ -1,139 +0,0 @@
/*
Copyright (C) 2015 Stephen Caudle
Licensed 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.
*/
/**
* @file GPIOTEv1/ext_lld.h
* @brief NRF51 EXT subsystem low level driver header.
*
* @addtogroup EXT
* @{
*/
#ifndef HAL_EXT_LLD_H
#define HAL_EXT_LLD_H
#if HAL_USE_EXT || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/**
* @brief Available number of EXT channels.
*/
#define EXT_MAX_CHANNELS 4
#define EXT_MODE_GPIO_MASK 0xF8 /**< @brief Pad field mask. */
#define EXT_MODE_GPIO_OFFSET 3 /**< @brief Pad field offset. */
/** @} */
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
/**
* @brief EXT channel identifier.
*/
typedef uint32_t expchannel_t;
/**
* @brief Type of an EXT generic notification callback.
*
* @param[in] extp pointer to the @p EXPDriver object triggering the
* callback
*/
typedef void (*extcallback_t)(EXTDriver *extp, expchannel_t channel);
/**
* @brief Channel configuration structure.
*/
typedef struct {
/**
* @brief Channel mode.
*/
uint32_t mode;
/**
* @brief Channel callback.
* @details In the STM32 implementation a @p NULL callback pointer is
* valid and configures the channel as an event sources instead
* of an interrupt source.
*/
extcallback_t cb;
} EXTChannelConfig;
/**
* @brief Driver configuration structure.
* @note It could be empty on some architectures.
*/
typedef struct {
/**
* @brief Channel configurations.
*/
EXTChannelConfig channels[EXT_MAX_CHANNELS];
/* End of the mandatory fields.*/
} EXTConfig;
/**
* @brief Structure representing an EXT driver.
*/
struct EXTDriver {
/**
* @brief Driver state.
*/
extstate_t state;
/**
* @brief Current configuration data.
*/
const EXTConfig *config;
/* End of the mandatory fields.*/
};
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#if !defined(__DOXYGEN__)
extern EXTDriver EXTD1;
#endif
#ifdef __cplusplus
extern "C" {
#endif
void ext_lld_init(void);
void ext_lld_start(EXTDriver *extp);
void ext_lld_stop(EXTDriver *extp);
void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel);
void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel);
#ifdef __cplusplus
}
#endif
#endif /* HAL_USE_EXT */
#endif /* HAL_EXT_LLD_H */
/** @} */

View File

@ -1,4 +1,5 @@
/*
Copyright (C) 2018 Konstantin Oblaukhov
Copyright (C) 2015 Fabio Utzig
Licensed under the Apache License, Version 2.0 (the "License");
@ -35,6 +36,11 @@
/* Driver exported variables. */
/*===========================================================================*/
/**
* @brief Event records for the GPIOTE channels.
*/
palevent_t _pal_events[NRF5_GPIOTE_NUM_CHANNELS];
/*===========================================================================*/
/* Driver local variables and types. */
/*===========================================================================*/
@ -127,6 +133,12 @@ void _pal_lld_init(const PALConfig *config)
for (i = 0; i < TOTAL_GPIO_PADS; i++) {
pal_lld_setpadmode(IOPORT1, i, config->pads[i]);
}
#if PAL_USE_CALLBACKS || PAL_USE_WAIT || defined(__DOXYGEN__)
for (i = 0; i < NRF5_GPIOTE_NUM_CHANNELS; i++) {
_pal_init_event(i);
}
#endif
}
/**
@ -153,6 +165,76 @@ void _pal_lld_setgroupmode(ioportid_t port,
}
}
#if PAL_USE_CALLBACKS || PAL_USE_WAIT || defined(__DOXYGEN__)
/**
* @brief Pad event enable.
* @note Programming an unknown or unsupported mode is silently ignored.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
* @param[in] mode pad event mode
*
* @notapi
*/
void _pal_lld_enablepadevent(ioportid_t port,
iopadid_t pad,
ioeventmode_t mode) {
(void)port;
int ch = NRF5_PAL_PAD_TO_EVENT(pad);
uint32_t config = NRF_GPIOTE->CONFIG[ch];
osalDbgAssert((((config & GPIOTE_CONFIG_PSEL_Msk) >> GPIOTE_CONFIG_PSEL_Pos) == pad) ||
(((config & GPIOTE_CONFIG_MODE_Msk) >> GPIOTE_CONFIG_MODE_Pos) != GPIOTE_CONFIG_MODE_Event),
"channel already in use");
if ((mode & PAL_EVENT_MODE_RISING_EDGE) && (mode & PAL_EVENT_MODE_FALLING_EDGE))
config |= (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos);
else if (mode & PAL_EVENT_MODE_RISING_EDGE)
config |= (GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos);
else
config |= (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos);
config |= (pad << GPIOTE_CONFIG_PSEL_Pos);
config |= (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);
NRF_GPIOTE->CONFIG[ch] = config;
NRF_GPIOTE->EVENTS_PORT = 0;
NRF_GPIOTE->EVENTS_IN[ch] = 0;
NRF_GPIOTE->INTENSET = (1 << ch);
}
/**
* @brief Pad event disable.
* @details This function disables previously programmed event callbacks.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
*
* @notapi
*/
void _pal_lld_disablepadevent(ioportid_t port, iopadid_t pad) {
(void)port;
int ch = NRF5_PAL_PAD_TO_EVENT(pad);
uint32_t config = NRF_GPIOTE->CONFIG[ch];
if (((config & GPIOTE_CONFIG_MODE_Msk) >> GPIOTE_CONFIG_MODE_Pos) == GPIOTE_CONFIG_MODE_Event)
{
osalDbgAssert(((config & GPIOTE_CONFIG_PSEL_Msk) >> GPIOTE_CONFIG_PSEL_Pos) == pad,
"channel mapped on different pad");
NRF_GPIOTE->INTENSET &= ~(1 << ch);
NRF_GPIOTE->CONFIG[ch] = 0;
#if PAL_USE_CALLBACKS || PAL_USE_WAIT
/* Callback cleared and/or thread reset.*/
_pal_clear_event(pad);
#endif
}
}
#endif /* PAL_USE_CALLBACKS || PAL_USE_WAIT */
#endif /* HAL_USE_PAL == TRUE */
/** @} */

View File

@ -1,4 +1,5 @@
/*
Copyright (C) 2018 Konstantin Oblaukhov
Copyright (C) 2015 Fabio Utzig
Licensed under the Apache License, Version 2.0 (the "License");
@ -111,6 +112,11 @@ typedef uint8_t iomode_t;
*/
typedef uint32_t ioline_t;
/**
* @brief Type of an event mode.
*/
typedef uint32_t ioeventmode_t;
/**
* @brief Port Identifier.
* @details This type can be a scalar or some kind of pointer, do not make
@ -139,6 +145,16 @@ typedef uint32_t iopadid_t;
#define IOPORT1 NRF_P0
#endif
/**
* @brief Number of PAL events.
* @details Maximum number of GPIO events supported by GPIOTE peripheral
*/
#if NRF_SERIES == 51
#define NRF5_GPIOTE_NUM_CHANNELS (4)
#else
#define NRF5_GPIOTE_NUM_CHANNELS (8)
#endif
/*===========================================================================*/
/* Implementation, some of the following macros could be implemented as */
/* functions, if so please put them in pal_lld.c. */
@ -331,8 +347,55 @@ typedef uint32_t iopadid_t;
*/
#define pal_lld_setpadmode(port, pad, mode) _pal_lld_setpadmode(port, pad, mode)
/**
* @brief Pad event enable.
* @note Programming an unknown or unsupported mode is silently ignored.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
* @param[in] mode pad event mode
*
* @notapi
*/
#define pal_lld_enablepadevent(port, pad, mode) \
_pal_lld_enablepadevent(port, pad, mode)
/**
* @brief Pad event disable.
* @details This function disables previously programmed event callbacks.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
*
* @notapi
*/
#define pal_lld_disablepadevent(port, pad) \
_pal_lld_disablepadevent(port, pad)
/**
* @brief Returns a PAL event structure associated to a pad.
*
* @param[in] port port identifier
* @param[in] pad pad number within the port
*
* @notapi
*/
#define pal_lld_get_pad_event(port, pad) \
&_pal_events[NRF5_PAL_PAD_TO_EVENT(pad)]; (void)(port)
/**
* @brief Returns a PAL event structure associated to a line.
*
* @param[in] line line identifier
*
* @notapi
*/
#define pal_lld_get_line_event(line) \
&_pal_events[NRF5_PAL_PAD_TO_EVENT(PAL_PAD(line))]
#if !defined(__DOXYGEN__)
extern const PALConfig pal_default_config;
extern palevent_t _pal_events[NRF5_GPIOTE_NUM_CHANNELS];
#endif
#ifdef __cplusplus
@ -345,6 +408,12 @@ extern "C" {
void _pal_lld_setpadmode(ioportid_t port,
uint8_t pad,
iomode_t mode);
#if PAL_USE_CALLBACKS || PAL_USE_WAIT
void _pal_lld_enablepadevent(ioportid_t port,
iopadid_t pad,
ioeventmode_t mode);
void _pal_lld_disablepadevent(ioportid_t port, iopadid_t pad);
#endif
#ifdef __cplusplus
}
#endif

View File

@ -80,6 +80,8 @@ void hal_lld_init(void)
(NRF5_SYSTEM_TICKS == NRF5_SYSTEM_TICKS_AS_RTC)
NRF_CLOCK->TASKS_LFCLKSTART = 1;
#endif
irqInit();
}
/**

View File

@ -94,7 +94,7 @@
/*===========================================================================*/
#include "nvic.h"
#include "nrf51_isr.h"
#ifdef __cplusplus
extern "C" {

View File

@ -1,4 +1,5 @@
/*
Copyright (C) 2018 Konstantin Oblaukhov
Copyright (C) 2015 Stephen Caudle
Licensed under the Apache License, Version 2.0 (the "License");
@ -15,19 +16,15 @@
*/
/**
* @file NRF51x22/ext_lld_isr.h
* @brief NRF51x22 EXT subsystem low level driver ISR code.
* @file NRF51822/nrf51_isr.c
* @brief NRF51822 ISR handler code.
*
* @addtogroup EXT
* @addtogroup NRF51822_ISR
* @{
*/
#include "hal.h"
#if HAL_USE_EXT || defined(__DOXYGEN__)
#include "hal_ext_lld_isr.h"
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
@ -49,33 +46,21 @@
/*===========================================================================*/
/**
* @brief EXTI[0]...EXTI[1] interrupt handler.
* @brief GPIOTE interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(Vector58) {
OSAL_IRQ_PROLOGUE();
if (NRF_GPIOTE->EVENTS_IN[0])
for (int ch = 0; ch < NRF5_GPIOTE_NUM_CHANNELS; ch++)
{
NRF_GPIOTE->EVENTS_IN[0] = 0;
EXTD1.config->channels[0].cb(&EXTD1, 0);
}
if (NRF_GPIOTE->EVENTS_IN[1])
{
NRF_GPIOTE->EVENTS_IN[1] = 0;
EXTD1.config->channels[1].cb(&EXTD1, 1);
}
if (NRF_GPIOTE->EVENTS_IN[2])
{
NRF_GPIOTE->EVENTS_IN[2] = 0;
EXTD1.config->channels[2].cb(&EXTD1, 2);
}
if (NRF_GPIOTE->EVENTS_IN[3])
{
NRF_GPIOTE->EVENTS_IN[3] = 0;
EXTD1.config->channels[3].cb(&EXTD1, 3);
if (NRF_GPIOTE->EVENTS_IN[ch])
{
NRF_GPIOTE->EVENTS_IN[ch] = 0;
_pal_isr_code(ch);
}
}
OSAL_IRQ_EPILOGUE();
@ -84,27 +69,28 @@ OSAL_IRQ_HANDLER(Vector58) {
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief Enables EXTI IRQ sources.
* @brief Enables IRQ sources.
*
* @notapi
*/
void ext_lld_exti_irq_enable(void) {
void irqInit(void) {
nvicEnableVector(GPIOTE_IRQn, NRF5_EXT_GPIOTE_IRQ_PRIORITY);
#if HAL_USE_PAL
nvicEnableVector(GPIOTE_IRQn, NRF5_IRQ_GPIOTE_PRIORITY);
#endif
}
/**
* @brief Disables EXTI IRQ sources.
* @brief Disables IRQ sources.
*
* @notapi
*/
void ext_lld_exti_irq_disable(void) {
void irqDeinit(void) {
#if HAL_USE_PAL
nvicDisableVector(GPIOTE_IRQn);
#endif
}
#endif /* HAL_USE_EXT */
/** @} */

View File

@ -0,0 +1,44 @@
/*
Copyright (C) 2018 Konstantin Oblaukhov
Copyright (C) 2015 Stephen Caudle
Licensed 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.
*/
/**
* @file NRF51822/nrf51_isr.h
* @brief NRF51822 ISR handler header.
*
* @addtogroup NRF51822_ISR
* @{
*/
#ifndef NRF51_ISR_H
#define NRF51_ISR_H
#if !defined(NRF5_IRQ_GPIOTE_PRIORITY) || defined(__DOXYGEN__)
#define NRF5_IRQ_GPIOTE_PRIORITY 3
#endif
#ifdef __cplusplus
extern "C" {
#endif
void irqInit(void);
void irqDeinit(void);
#ifdef __cplusplus
}
#endif
#endif /* NRF51_ISR_H */
/** @} */

View File

@ -1,6 +1,6 @@
PLATFORMSRC_CONTRIB := ${CHIBIOS}/os/hal/ports/common/ARMCMx/nvic.c \
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/NRF51822/hal_lld.c \
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/NRF51822/hal_ext_lld_isr.c \
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/NRF51822/nrf51_isr.c \
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/TIMERv1/hal_st_lld.c
PLATFORMINC_CONTRIB := ${CHIBIOS}/os/hal/ports/common/ARMCMx \
@ -21,7 +21,6 @@ endif
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/GPIOv1/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/UARTv1/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/SPIv1/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/GPIOTEv1/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/TWIv1/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/ADCv1/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/TIMERv1/driver.mk

View File

@ -87,6 +87,8 @@ void hal_lld_init(void)
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0);
#endif
irqInit();
}
/**

View File

@ -115,6 +115,7 @@
#endif
#include "nvic.h"
#include "nrf52_isr.h"
#ifdef __cplusplus

View File

@ -1,4 +1,5 @@
/*
Copyright (C) 2018 Konstantin Oblaukhov
Copyright (C) 2015 Stephen Caudle
Licensed under the Apache License, Version 2.0 (the "License");
@ -15,65 +16,81 @@
*/
/**
* @file NRF51x22/ext_lld_isr.h
* @brief NRF51x22 EXT subsystem low level driver ISR header.
* @file NRF52832/nrf52_isr.c
* @brief NRF52832 ISR handler code.
*
* @addtogroup EXT
* @addtogroup NRF52832_ISR
* @{
*/
#ifndef HAL_EXT_LLD_ISR_H
#define HAL_EXT_LLD_ISR_H
#if HAL_USE_EXT || defined(__DOXYGEN__)
#include "hal.h"
/*===========================================================================*/
/* Driver constants. */
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver pre-compile time settings. */
/* Driver exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/**
* @name Configuration options
* @{
* @brief GPIOTE interrupt handler.
*
* @isr
*/
/**
* @brief GPIOTE interrupt priority level setting.
*/
#if !defined(NRF5_EXT_GPIOTE_IRQ_PRIORITY) || defined(__DOXYGEN__)
#define NRF5_EXT_GPIOTE_IRQ_PRIORITY 3
#endif
/** @} */
OSAL_IRQ_HANDLER(Vector58) {
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
OSAL_IRQ_PROLOGUE();
for (int ch = 0; ch < NRF5_GPIOTE_NUM_CHANNELS; ch++)
{
if (NRF_GPIOTE->EVENTS_IN[ch])
{
NRF_GPIOTE->EVENTS_IN[ch] = 0;
_pal_isr_code(ch);
}
}
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
void ext_lld_exti_irq_enable(void);
void ext_lld_exti_irq_disable(void);
#ifdef __cplusplus
OSAL_IRQ_EPILOGUE();
}
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief Enables IRQ sources.
*
* @notapi
*/
void irqInit(void) {
#if HAL_USE_PAL
nvicEnableVector(GPIOTE_IRQn, NRF5_IRQ_GPIOTE_PRIORITY);
#endif
}
#endif /* HAL_USE_EXT */
/**
* @brief Disables IRQ sources.
*
* @notapi
*/
void irqDeinit(void) {
#endif /* HAL_EXT_LLD_ISR_H */
#if HAL_USE_PAL
nvicDisableVector(GPIOTE_IRQn);
#endif
}
/** @} */

View File

@ -0,0 +1,44 @@
/*
Copyright (C) 2018 Konstantin Oblaukhov
Copyright (C) 2015 Stephen Caudle
Licensed 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.
*/
/**
* @file NRF52832/nrf52_isr.h
* @brief NRF52832 ISR handler header.
*
* @addtogroup NRF52832_ISR
* @{
*/
#ifndef NRF52_ISR_H
#define NRF52_ISR_H
#if !defined(NRF5_IRQ_GPIOTE_PRIORITY) || defined(__DOXYGEN__)
#define NRF5_IRQ_GPIOTE_PRIORITY 3
#endif
#ifdef __cplusplus
extern "C" {
#endif
void irqInit(void);
void irqDeinit(void);
#ifdef __cplusplus
}
#endif
#endif /* NRF52_ISR_H */
/** @} */

View File

@ -1,5 +1,6 @@
PLATFORMSRC_CONTRIB := ${CHIBIOS}/os/hal/ports/common/ARMCMx/nvic.c \
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/NRF52832/hal_lld.c \
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/NRF52832/nrf52_isr.c \
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/TIMERv1/hal_st_lld.c
PLATFORMINC_CONTRIB := ${CHIBIOS}/os/hal/ports/common/ARMCMx \