Merge pull request #191 from ObKo/nrf52-pal-new
NRF5x: Add support for PAL events.
This commit is contained in:
commit
9abc320aa5
|
@ -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
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -80,6 +80,8 @@ void hal_lld_init(void)
|
|||
(NRF5_SYSTEM_TICKS == NRF5_SYSTEM_TICKS_AS_RTC)
|
||||
NRF_CLOCK->TASKS_LFCLKSTART = 1;
|
||||
#endif
|
||||
|
||||
irqInit();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -94,7 +94,7 @@
|
|||
/*===========================================================================*/
|
||||
|
||||
#include "nvic.h"
|
||||
|
||||
#include "nrf51_isr.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
|
@ -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();
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
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 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
|
||||
}
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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
|
||||
|
|
|
@ -87,6 +87,8 @@ void hal_lld_init(void)
|
|||
NRF_CLOCK->TASKS_LFCLKSTART = 1;
|
||||
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0);
|
||||
#endif
|
||||
|
||||
irqInit();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
#endif
|
||||
|
||||
#include "nvic.h"
|
||||
#include "nrf52_isr.h"
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
||||
/**
|
|
@ -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.
|
||||
*/
|
||||
|
@ -107,7 +95,8 @@ 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;
|
Loading…
Reference in New Issue