Merge pull request #191 from ObKo/nrf52-pal-new

NRF5x: Add support for PAL events.
This commit is contained in:
Fabien Poussin 2019-04-09 11:44:44 +02:00 committed by GitHub
commit 9abc320aa5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 355 additions and 436 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,24 @@ 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
/**
* @brief Pad to event number
* @details Converts pad to GPIOTE peripheral pad event number
*/
#if !defined(NRF5_PAL_PAD_TO_EVENT) || defined(__DOXYGEN__)
#define NRF5_PAL_PAD_TO_EVENT(pad) ((pad) % NRF5_GPIOTE_NUM_CHANNELS)
#endif
/*===========================================================================*/
/* Implementation, some of the following macros could be implemented as */
/* functions, if so please put them in pal_lld.c. */
@ -331,8 +355,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 +416,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

@ -301,25 +301,6 @@ static void start_channels(ICUDriver *icup) {
/* Driver interrupt handlers. */
/*===========================================================================*/
#if NRF5_ICU_USE_GPIOTE_PPI
/**
* @brief GPIOTE events interrupt handler.
* @note It is assumed that the various sources are only activated if the
* associated callback pointer is not equal to @p NULL in order to not
* perform an extra check in a potentially critical interrupt handler.
*
* @isr
*/
OSAL_IRQ_HANDLER(Vector58) {
OSAL_IRQ_PROLOGUE();
icu_lld_serve_gpiote_interrupt(&ICUD1);
OSAL_IRQ_EPILOGUE();
}
#endif /* NRF5_ICU_USE_GPIOTE_PPI */
#if NRF5_ICU_USE_TIMER0
/**
* @brief TIMER0 compare interrupt handler.

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,65 +16,81 @@
*/
/**
* @file NRF51x22/ext_lld_isr.h
* @brief NRF51x22 EXT subsystem low level driver ISR header.
* @file NRF51822/nrf51_isr.c
* @brief NRF51822 ISR handler code.
*
* @addtogroup EXT
* @addtogroup NRF51822_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 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,19 +16,15 @@
*/
/**
* @file NRF51x22/ext_lld_isr.h
* @brief NRF51x22 EXT subsystem low level driver ISR code.
* @file NRF52832/nrf52_isr.c
* @brief NRF52832 ISR handler code.
*
* @addtogroup EXT
* @addtogroup NRF52832_ISR
* @{
*/
#include "hal.h"
#if HAL_USE_EXT || defined(__DOXYGEN__)
#include "hal_ext_lld_isr.h"
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
@ -44,12 +41,16 @@
/* Driver local functions. */
/*===========================================================================*/
#if (HAL_USE_ICU && NRF5_ICU_USE_GPIOTE_PPI)
extern void icu_lld_serve_gpiote_interrupt(ICUDriver *icup);
#endif
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/**
* @brief EXTI[0]...EXTI[1] interrupt handler.
* @brief GPIOTE interrupt handler.
*
* @isr
*/
@ -57,26 +58,20 @@ OSAL_IRQ_HANDLER(Vector58) {
OSAL_IRQ_PROLOGUE();
if (NRF_GPIOTE->EVENTS_IN[0])
#if (HAL_USE_ICU && NRF5_ICU_USE_GPIOTE_PPI)
icu_lld_serve_gpiote_interrupt(&ICUD1);
#endif
#if (HAL_USE_PAL && (PAL_USE_WAIT || PAL_USE_CALLBACKS))
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);
}
}
#endif
OSAL_IRQ_EPILOGUE();
}
@ -84,27 +79,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 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 \

View File

@ -55,7 +55,7 @@
* @brief Enables the EXT subsystem.
*/
#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
#define HAL_USE_EXT TRUE
#define HAL_USE_EXT FALSE
#endif
/**

View File

@ -42,11 +42,9 @@ static void led2toggle(void *arg) {
debouncing2 = false;
}
static void extcb1(EXTDriver *extp, expchannel_t channel)
static void extcb1(void *arg)
{
(void)extp;
(void)channel;
(void)arg;
uint8_t pad1 = palReadPad(IOPORT1, KEY1);
if (!debouncing1 && (pad1 == PAL_LOW)) {
@ -63,11 +61,9 @@ static void extcb1(EXTDriver *extp, expchannel_t channel)
}
}
static void extcb2(EXTDriver *extp, expchannel_t channel)
static void extcb2(void *arg)
{
(void)extp;
(void)channel;
(void)arg;
uint8_t pad2 = palReadPad(IOPORT1, KEY2);
if (!debouncing2 && (pad2 == PAL_LOW)) {
@ -84,14 +80,6 @@ static void extcb2(EXTDriver *extp, expchannel_t channel)
}
}
static const EXTConfig extcfg =
{
{
{EXT_CH_MODE_FALLING_EDGE | EXT_CH_MODE_AUTOSTART | (KEY1 << EXT_MODE_GPIO_OFFSET), extcb1},
{EXT_CH_MODE_RISING_EDGE | EXT_CH_MODE_AUTOSTART | (KEY2 << EXT_MODE_GPIO_OFFSET), extcb2},
}
};
/*
* Application entry point.
*/
@ -106,8 +94,9 @@ int main(void)
*/
halInit();
chSysInit();
extStart(&EXTD1, &extcfg);
palSetPadCallback(IOPORT1, KEY1, extcb1, NULL);
palSetPadCallback(IOPORT1, KEY2, extcb2, NULL);
/*
* Normal main() thread activity, in this demo it enables and disables the
@ -116,12 +105,12 @@ int main(void)
while (TRUE) {
palSetPad(IOPORT1, LED0);
chThdSleepMilliseconds(5000);
extChannelDisable(&EXTD1, 0);
extChannelDisable(&EXTD1, 1);
palDisablePadEvent(IOPORT1, KEY1);
palDisablePadEvent(IOPORT1, KEY2);
palClearPad(IOPORT1, LED0);
chThdSleepMilliseconds(5000);
extChannelEnable(&EXTD1, 0);
extChannelEnable(&EXTD1, 1);
palEnablePadEvent(IOPORT1, KEY1, PAL_EVENT_MODE_FALLING_EDGE);
palEnablePadEvent(IOPORT1, KEY2, PAL_EVENT_MODE_RISING_EDGE);
}
return 0;