You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2026/09/07 11:20:24 UTC
(nuttx) 01/02: arch/arm/nrf53: fix inverted GPIOTE per-instance channel index
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang781216 pushed a commit to branch releases/13.0
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 448276c70daafb818fc401adea7aa9e546baff48
Author: AlmAck <gl...@gmail.com>
AuthorDate: Sat Aug 29 19:00:22 2026 +0200
arch/arm/nrf53: fix inverted GPIOTE per-instance channel index
The driver presents a single channel space of GPIOTE_CHANNELS entries
across the application core's two GPIOTE peripherals, and splits it:
inst = (channel < GPIOTE_PER_CHANNEL) ? 0 : 1;
rchan = (inst == 1) ? channel : (channel - GPIOTE_PER_CHANNEL);
rchan is the channel index within the selected instance, used to build
the per-channel register offsets, so it must be
rchan = channel - GPIOTE_PER_CHANNEL * inst
The ternary has the two arms the other way round: a channel on instance
0 gets rchan = channel - GPIOTE_PER_CHANNEL, which is negative, and a
channel on instance 1 gets an index still offset by a full instance.
The interrupt handler in this same file already applies that mapping in
the opposite direction, converting a per-instance channel back to the
global one:
off = i + GPIOTE_PER_CHANNEL * inst;
so the two were inconsistent, and it is the rchan sites that were wrong.
Per the nRF5340 Product Specification, 'GPIOTE - GPIO tasks and
events', the application core has two GPIOTE instances, GPIOTE0 (secure,
base 0x5000D000) and GPIOTE1 (non-secure, base 0x4002F000), each with
eight channels and its own CONFIG[n] array at offset 0x510 + 4n for
n = 0..7. This matches GPIOTE_PER_CHANNEL == 8, the two base addresses
in hardware/nrf53_memorymap_cpuapp.h, and NRF53_GPIOTE_CONFIG_OFFSET()
in hardware/nrf53_gpiote.h, so rchan is required to be in 0..7 and a
negative value cannot address a CONFIG register.
With a negative rchan the CONFIG register write for a channel on
instance 0 lands below the instance base instead of in CONFIG[n], so the
channel is never configured and its GPIOTE interrupt is never enabled.
On nrf5340-dk this makes the board buttons dead.
Both call sites are corrected.
Signed-off-by: AlmAck <gl...@gmail.com>
---
arch/arm/src/nrf53/nrf53_gpiote.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/src/nrf53/nrf53_gpiote.c b/arch/arm/src/nrf53/nrf53_gpiote.c
index 3f5a6fb7679..139e4f8945b 100644
--- a/arch/arm/src/nrf53/nrf53_gpiote.c
+++ b/arch/arm/src/nrf53/nrf53_gpiote.c
@@ -405,7 +405,7 @@ void nrf53_gpiote_set_ch_event(uint32_t pinset, int channel,
inst = 0;
#endif
- rchan = (inst == 1) ? channel : (channel - GPIOTE_PER_CHANNEL);
+ rchan = (inst == 1) ? (channel - GPIOTE_PER_CHANNEL) : channel;
/* NOTE: GPIOTE module has priority over GPIO module
* so GPIO configuration will be ignored
@@ -567,7 +567,7 @@ void nrf53_gpiote_set_task(uint32_t pinset, int channel,
inst = 0;
#endif
- rchan = (inst == 1) ? channel : (channel - GPIOTE_PER_CHANNEL);
+ rchan = (inst == 1) ? (channel - GPIOTE_PER_CHANNEL) : channel;
/* Select GPIOTE pin */