diff --git a/os/hal/ports/NRF5/LLD/GPIOTEv1/driver.mk b/os/hal/ports/NRF5/LLD/GPIOTEv1/driver.mk deleted file mode 100644 index 97e0660d..00000000 --- a/os/hal/ports/NRF5/LLD/GPIOTEv1/driver.mk +++ /dev/null @@ -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 diff --git a/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.c b/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.c deleted file mode 100644 index f38fa0c4..00000000 --- a/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.c +++ /dev/null @@ -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 */ - -/** @} */ diff --git a/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.h b/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.h deleted file mode 100644 index 8a93b6de..00000000 --- a/os/hal/ports/NRF5/LLD/GPIOTEv1/hal_ext_lld.h +++ /dev/null @@ -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 */ - -/** @} */ diff --git a/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_lld.c b/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_lld.c index 9cfad8d4..30293677 100644 --- a/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_lld.c +++ b/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_lld.c @@ -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 */ /** @} */ diff --git a/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_lld.h b/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_lld.h index a005d50c..e9021eb4 100644 --- a/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_lld.h +++ b/os/hal/ports/NRF5/LLD/GPIOv1/hal_pal_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"); @@ -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 diff --git a/os/hal/ports/NRF5/LLD/TIMERv1/hal_icu_lld.c b/os/hal/ports/NRF5/LLD/TIMERv1/hal_icu_lld.c index 49660078..bca88557 100644 --- a/os/hal/ports/NRF5/LLD/TIMERv1/hal_icu_lld.c +++ b/os/hal/ports/NRF5/LLD/TIMERv1/hal_icu_lld.c @@ -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. diff --git a/os/hal/ports/NRF5/NRF51822/hal_lld.c b/os/hal/ports/NRF5/NRF51822/hal_lld.c index f33fddae..412cfea4 100644 --- a/os/hal/ports/NRF5/NRF51822/hal_lld.c +++ b/os/hal/ports/NRF5/NRF51822/hal_lld.c @@ -80,6 +80,8 @@ void hal_lld_init(void) (NRF5_SYSTEM_TICKS == NRF5_SYSTEM_TICKS_AS_RTC) NRF_CLOCK->TASKS_LFCLKSTART = 1; #endif + + irqInit(); } /** diff --git a/os/hal/ports/NRF5/NRF51822/hal_lld.h b/os/hal/ports/NRF5/NRF51822/hal_lld.h index a1d2460b..178bb424 100644 --- a/os/hal/ports/NRF5/NRF51822/hal_lld.h +++ b/os/hal/ports/NRF5/NRF51822/hal_lld.h @@ -94,7 +94,7 @@ /*===========================================================================*/ #include "nvic.h" - +#include "nrf51_isr.h" #ifdef __cplusplus extern "C" { diff --git a/os/hal/ports/NRF5/NRF51822/hal_ext_lld_isr.h b/os/hal/ports/NRF5/NRF51822/nrf51_isr.c similarity index 58% rename from os/hal/ports/NRF5/NRF51822/hal_ext_lld_isr.h rename to os/hal/ports/NRF5/NRF51822/nrf51_isr.c index d606866d..9a2bd942 100644 --- a/os/hal/ports/NRF5/NRF51822/hal_ext_lld_isr.h +++ b/os/hal/ports/NRF5/NRF51822/nrf51_isr.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(); + + 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 +} /** @} */ diff --git a/os/hal/ports/NRF5/NRF51822/nrf51_isr.h b/os/hal/ports/NRF5/NRF51822/nrf51_isr.h new file mode 100644 index 00000000..832d2c3d --- /dev/null +++ b/os/hal/ports/NRF5/NRF51822/nrf51_isr.h @@ -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 */ + +/** @} */ diff --git a/os/hal/ports/NRF5/NRF51822/platform.mk b/os/hal/ports/NRF5/NRF51822/platform.mk index 298a85ce..711a625f 100644 --- a/os/hal/ports/NRF5/NRF51822/platform.mk +++ b/os/hal/ports/NRF5/NRF51822/platform.mk @@ -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 diff --git a/os/hal/ports/NRF5/NRF52832/hal_lld.c b/os/hal/ports/NRF5/NRF52832/hal_lld.c index e63e57ec..11307f82 100644 --- a/os/hal/ports/NRF5/NRF52832/hal_lld.c +++ b/os/hal/ports/NRF5/NRF52832/hal_lld.c @@ -87,6 +87,8 @@ void hal_lld_init(void) NRF_CLOCK->TASKS_LFCLKSTART = 1; while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0); #endif + + irqInit(); } /** diff --git a/os/hal/ports/NRF5/NRF52832/hal_lld.h b/os/hal/ports/NRF5/NRF52832/hal_lld.h index a2a8cc33..0620b5f9 100644 --- a/os/hal/ports/NRF5/NRF52832/hal_lld.h +++ b/os/hal/ports/NRF5/NRF52832/hal_lld.h @@ -115,6 +115,7 @@ #endif #include "nvic.h" +#include "nrf52_isr.h" #ifdef __cplusplus diff --git a/os/hal/ports/NRF5/NRF51822/hal_ext_lld_isr.c b/os/hal/ports/NRF5/NRF52832/nrf52_isr.c similarity index 68% rename from os/hal/ports/NRF5/NRF51822/hal_ext_lld_isr.c rename to os/hal/ports/NRF5/NRF52832/nrf52_isr.c index ca8e24d2..431bb3b9 100644 --- a/os/hal/ports/NRF5/NRF51822/hal_ext_lld_isr.c +++ b/os/hal/ports/NRF5/NRF52832/nrf52_isr.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,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 */ - /** @} */ diff --git a/os/hal/ports/NRF5/NRF52832/nrf52_isr.h b/os/hal/ports/NRF5/NRF52832/nrf52_isr.h new file mode 100644 index 00000000..b9f81d08 --- /dev/null +++ b/os/hal/ports/NRF5/NRF52832/nrf52_isr.h @@ -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 */ + +/** @} */ diff --git a/os/hal/ports/NRF5/NRF52832/platform.mk b/os/hal/ports/NRF5/NRF52832/platform.mk index f1fcfe76..1e0a1afe 100644 --- a/os/hal/ports/NRF5/NRF52832/platform.mk +++ b/os/hal/ports/NRF5/NRF52832/platform.mk @@ -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 \ diff --git a/testhal/NRF51/NRF51822/EXT/Makefile b/testhal/NRF51/NRF51822/PAL/Makefile similarity index 100% rename from testhal/NRF51/NRF51822/EXT/Makefile rename to testhal/NRF51/NRF51822/PAL/Makefile diff --git a/testhal/NRF51/NRF51822/EXT/chconf.h b/testhal/NRF51/NRF51822/PAL/chconf.h similarity index 100% rename from testhal/NRF51/NRF51822/EXT/chconf.h rename to testhal/NRF51/NRF51822/PAL/chconf.h diff --git a/testhal/NRF51/NRF51822/EXT/halconf.h b/testhal/NRF51/NRF51822/PAL/halconf.h similarity index 99% rename from testhal/NRF51/NRF51822/EXT/halconf.h rename to testhal/NRF51/NRF51822/PAL/halconf.h index 407dd2fc..c8c556ae 100644 --- a/testhal/NRF51/NRF51822/EXT/halconf.h +++ b/testhal/NRF51/NRF51822/PAL/halconf.h @@ -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 /** diff --git a/testhal/NRF51/NRF51822/EXT/halconf_community.h b/testhal/NRF51/NRF51822/PAL/halconf_community.h similarity index 100% rename from testhal/NRF51/NRF51822/EXT/halconf_community.h rename to testhal/NRF51/NRF51822/PAL/halconf_community.h diff --git a/testhal/NRF51/NRF51822/EXT/main.c b/testhal/NRF51/NRF51822/PAL/main.c similarity index 81% rename from testhal/NRF51/NRF51822/EXT/main.c rename to testhal/NRF51/NRF51822/PAL/main.c index f24eb5dd..313291ca 100644 --- a/testhal/NRF51/NRF51822/EXT/main.c +++ b/testhal/NRF51/NRF51822/PAL/main.c @@ -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; diff --git a/testhal/NRF51/NRF51822/EXT/mcuconf.h b/testhal/NRF51/NRF51822/PAL/mcuconf.h similarity index 100% rename from testhal/NRF51/NRF51822/EXT/mcuconf.h rename to testhal/NRF51/NRF51822/PAL/mcuconf.h