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
|
Copyright (C) 2015 Fabio Utzig
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@ -35,6 +36,11 @@
|
||||||
/* Driver exported variables. */
|
/* Driver exported variables. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Event records for the GPIOTE channels.
|
||||||
|
*/
|
||||||
|
palevent_t _pal_events[NRF5_GPIOTE_NUM_CHANNELS];
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver local variables and types. */
|
/* Driver local variables and types. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -127,6 +133,12 @@ void _pal_lld_init(const PALConfig *config)
|
||||||
for (i = 0; i < TOTAL_GPIO_PADS; i++) {
|
for (i = 0; i < TOTAL_GPIO_PADS; i++) {
|
||||||
pal_lld_setpadmode(IOPORT1, i, config->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 */
|
#endif /* HAL_USE_PAL == TRUE */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/*
|
||||||
|
Copyright (C) 2018 Konstantin Oblaukhov
|
||||||
Copyright (C) 2015 Fabio Utzig
|
Copyright (C) 2015 Fabio Utzig
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@ -111,6 +112,11 @@ typedef uint8_t iomode_t;
|
||||||
*/
|
*/
|
||||||
typedef uint32_t ioline_t;
|
typedef uint32_t ioline_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Type of an event mode.
|
||||||
|
*/
|
||||||
|
typedef uint32_t ioeventmode_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Port Identifier.
|
* @brief Port Identifier.
|
||||||
* @details This type can be a scalar or some kind of pointer, do not make
|
* @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
|
#define IOPORT1 NRF_P0
|
||||||
#endif
|
#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 */
|
/* Implementation, some of the following macros could be implemented as */
|
||||||
/* functions, if so please put them in pal_lld.c. */
|
/* 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)
|
#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__)
|
#if !defined(__DOXYGEN__)
|
||||||
extern const PALConfig pal_default_config;
|
extern const PALConfig pal_default_config;
|
||||||
|
extern palevent_t _pal_events[NRF5_GPIOTE_NUM_CHANNELS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -345,6 +416,12 @@ extern "C" {
|
||||||
void _pal_lld_setpadmode(ioportid_t port,
|
void _pal_lld_setpadmode(ioportid_t port,
|
||||||
uint8_t pad,
|
uint8_t pad,
|
||||||
iomode_t mode);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -301,25 +301,6 @@ static void start_channels(ICUDriver *icup) {
|
||||||
/* Driver interrupt handlers. */
|
/* 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
|
#if NRF5_ICU_USE_TIMER0
|
||||||
/**
|
/**
|
||||||
* @brief TIMER0 compare interrupt handler.
|
* @brief TIMER0 compare interrupt handler.
|
||||||
|
|
|
@ -80,6 +80,8 @@ void hal_lld_init(void)
|
||||||
(NRF5_SYSTEM_TICKS == NRF5_SYSTEM_TICKS_AS_RTC)
|
(NRF5_SYSTEM_TICKS == NRF5_SYSTEM_TICKS_AS_RTC)
|
||||||
NRF_CLOCK->TASKS_LFCLKSTART = 1;
|
NRF_CLOCK->TASKS_LFCLKSTART = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
irqInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -94,7 +94,7 @@
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#include "nvic.h"
|
#include "nvic.h"
|
||||||
|
#include "nrf51_isr.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/*
|
||||||
|
Copyright (C) 2018 Konstantin Oblaukhov
|
||||||
Copyright (C) 2015 Stephen Caudle
|
Copyright (C) 2015 Stephen Caudle
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@ -15,65 +16,81 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file NRF51x22/ext_lld_isr.h
|
* @file NRF51822/nrf51_isr.c
|
||||||
* @brief NRF51x22 EXT subsystem low level driver ISR header.
|
* @brief NRF51822 ISR handler code.
|
||||||
*
|
*
|
||||||
* @addtogroup EXT
|
* @addtogroup NRF51822_ISR
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef HAL_EXT_LLD_ISR_H
|
#include "hal.h"
|
||||||
#define HAL_EXT_LLD_ISR_H
|
|
||||||
|
|
||||||
#if HAL_USE_EXT || defined(__DOXYGEN__)
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* 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
|
||||||
*/
|
*/
|
||||||
/**
|
OSAL_IRQ_HANDLER(Vector58) {
|
||||||
* @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_PROLOGUE();
|
||||||
/* Derived constants and error checks. */
|
|
||||||
/*===========================================================================*/
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
for (int ch = 0; ch < NRF5_GPIOTE_NUM_CHANNELS; ch++)
|
||||||
/* Driver data structures and types. */
|
{
|
||||||
/*===========================================================================*/
|
if (NRF_GPIOTE->EVENTS_IN[ch])
|
||||||
|
{
|
||||||
|
NRF_GPIOTE->EVENTS_IN[ch] = 0;
|
||||||
|
_pal_isr_code(ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*===========================================================================*/
|
OSAL_IRQ_EPILOGUE();
|
||||||
/* 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* Driver exported functions. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
/**
|
||||||
|
* @brief Enables IRQ sources.
|
||||||
|
*
|
||||||
|
* @notapi
|
||||||
|
*/
|
||||||
|
void irqInit(void) {
|
||||||
|
|
||||||
|
#if HAL_USE_PAL
|
||||||
|
nvicEnableVector(GPIOTE_IRQn, NRF5_IRQ_GPIOTE_PRIORITY);
|
||||||
#endif
|
#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 \
|
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_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
|
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/TIMERv1/hal_st_lld.c
|
||||||
|
|
||||||
PLATFORMINC_CONTRIB := ${CHIBIOS}/os/hal/ports/common/ARMCMx \
|
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/GPIOv1/driver.mk
|
||||||
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/UARTv1/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/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/TWIv1/driver.mk
|
||||||
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/ADCv1/driver.mk
|
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/ADCv1/driver.mk
|
||||||
include ${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/TIMERv1/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;
|
NRF_CLOCK->TASKS_LFCLKSTART = 1;
|
||||||
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0);
|
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
irqInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -115,6 +115,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "nvic.h"
|
#include "nvic.h"
|
||||||
|
#include "nrf52_isr.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/*
|
||||||
|
Copyright (C) 2018 Konstantin Oblaukhov
|
||||||
Copyright (C) 2015 Stephen Caudle
|
Copyright (C) 2015 Stephen Caudle
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@ -15,19 +16,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file NRF51x22/ext_lld_isr.h
|
* @file NRF52832/nrf52_isr.c
|
||||||
* @brief NRF51x22 EXT subsystem low level driver ISR code.
|
* @brief NRF52832 ISR handler code.
|
||||||
*
|
*
|
||||||
* @addtogroup EXT
|
* @addtogroup NRF52832_ISR
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
|
|
||||||
#if HAL_USE_EXT || defined(__DOXYGEN__)
|
|
||||||
|
|
||||||
#include "hal_ext_lld_isr.h"
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver local definitions. */
|
/* Driver local definitions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -44,12 +41,16 @@
|
||||||
/* Driver local functions. */
|
/* 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. */
|
/* Driver interrupt handlers. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief EXTI[0]...EXTI[1] interrupt handler.
|
* @brief GPIOTE interrupt handler.
|
||||||
*
|
*
|
||||||
* @isr
|
* @isr
|
||||||
*/
|
*/
|
||||||
|
@ -57,26 +58,20 @@ OSAL_IRQ_HANDLER(Vector58) {
|
||||||
|
|
||||||
OSAL_IRQ_PROLOGUE();
|
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;
|
if (NRF_GPIOTE->EVENTS_IN[ch])
|
||||||
EXTD1.config->channels[0].cb(&EXTD1, 0);
|
|
||||||
}
|
|
||||||
if (NRF_GPIOTE->EVENTS_IN[1])
|
|
||||||
{
|
{
|
||||||
NRF_GPIOTE->EVENTS_IN[1] = 0;
|
NRF_GPIOTE->EVENTS_IN[ch] = 0;
|
||||||
EXTD1.config->channels[1].cb(&EXTD1, 1);
|
_pal_isr_code(ch);
|
||||||
}
|
}
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
OSAL_IRQ_EPILOGUE();
|
OSAL_IRQ_EPILOGUE();
|
||||||
}
|
}
|
||||||
|
@ -84,27 +79,28 @@ OSAL_IRQ_HANDLER(Vector58) {
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver exported functions. */
|
/* Driver exported functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Enables EXTI IRQ sources.
|
* @brief Enables IRQ sources.
|
||||||
*
|
*
|
||||||
* @notapi
|
* @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
|
* @notapi
|
||||||
*/
|
*/
|
||||||
void ext_lld_exti_irq_disable(void) {
|
void irqDeinit(void) {
|
||||||
|
|
||||||
|
#if HAL_USE_PAL
|
||||||
nvicDisableVector(GPIOTE_IRQn);
|
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 \
|
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/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
|
${CHIBIOS_CONTRIB}/os/hal/ports/NRF5/LLD/TIMERv1/hal_st_lld.c
|
||||||
|
|
||||||
PLATFORMINC_CONTRIB := ${CHIBIOS}/os/hal/ports/common/ARMCMx \
|
PLATFORMINC_CONTRIB := ${CHIBIOS}/os/hal/ports/common/ARMCMx \
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
* @brief Enables the EXT subsystem.
|
* @brief Enables the EXT subsystem.
|
||||||
*/
|
*/
|
||||||
#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
|
#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
|
||||||
#define HAL_USE_EXT TRUE
|
#define HAL_USE_EXT FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -42,11 +42,9 @@ static void led2toggle(void *arg) {
|
||||||
debouncing2 = false;
|
debouncing2 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void extcb1(EXTDriver *extp, expchannel_t channel)
|
static void extcb1(void *arg)
|
||||||
{
|
{
|
||||||
(void)extp;
|
(void)arg;
|
||||||
(void)channel;
|
|
||||||
|
|
||||||
uint8_t pad1 = palReadPad(IOPORT1, KEY1);
|
uint8_t pad1 = palReadPad(IOPORT1, KEY1);
|
||||||
|
|
||||||
if (!debouncing1 && (pad1 == PAL_LOW)) {
|
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)arg;
|
||||||
(void)channel;
|
|
||||||
|
|
||||||
uint8_t pad2 = palReadPad(IOPORT1, KEY2);
|
uint8_t pad2 = palReadPad(IOPORT1, KEY2);
|
||||||
|
|
||||||
if (!debouncing2 && (pad2 == PAL_LOW)) {
|
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.
|
* Application entry point.
|
||||||
*/
|
*/
|
||||||
|
@ -107,7 +95,8 @@ int main(void)
|
||||||
halInit();
|
halInit();
|
||||||
chSysInit();
|
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
|
* Normal main() thread activity, in this demo it enables and disables the
|
||||||
|
@ -116,12 +105,12 @@ int main(void)
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
palSetPad(IOPORT1, LED0);
|
palSetPad(IOPORT1, LED0);
|
||||||
chThdSleepMilliseconds(5000);
|
chThdSleepMilliseconds(5000);
|
||||||
extChannelDisable(&EXTD1, 0);
|
palDisablePadEvent(IOPORT1, KEY1);
|
||||||
extChannelDisable(&EXTD1, 1);
|
palDisablePadEvent(IOPORT1, KEY2);
|
||||||
palClearPad(IOPORT1, LED0);
|
palClearPad(IOPORT1, LED0);
|
||||||
chThdSleepMilliseconds(5000);
|
chThdSleepMilliseconds(5000);
|
||||||
extChannelEnable(&EXTD1, 0);
|
palEnablePadEvent(IOPORT1, KEY1, PAL_EVENT_MODE_FALLING_EDGE);
|
||||||
extChannelEnable(&EXTD1, 1);
|
palEnablePadEvent(IOPORT1, KEY2, PAL_EVENT_MODE_RISING_EDGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
Loading…
Reference in New Issue