Skip to content

Commit aa8b258

Browse files
nordic-krchkartben
authored andcommitted
drivers: serial: nrfx_uarte: Add support for direct interrupts
Add option to use direct ISR. Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
1 parent e59451a commit aa8b258

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

drivers/serial/Kconfig.nrfx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ config UART_ASYNC_TX_CACHE_SIZE
6363
in RAM, because EasyDMA in UARTE peripherals can only transfer data
6464
from RAM.
6565

66+
config UART_NRFX_UARTE_DIRECT_ISR
67+
bool "Use direct ISR"
68+
6669
if HAS_HW_NRF_UART0 || HAS_HW_NRF_UARTE0
6770
nrfx_uart_num = 0
6871
rsource "Kconfig.nrfx_uart_instance"

drivers/serial/uart_nrfx_uarte.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2435,11 +2435,30 @@ static int uarte_instance_init(const struct device *dev,
24352435
return pm_device_driver_init(dev, uarte_nrfx_pm_action);
24362436
}
24372437

2438-
#define UARTE_IRQ_CONFIGURE(idx, isr_handler) \
2439-
do { \
2440-
IRQ_CONNECT(DT_IRQN(UARTE(idx)), DT_IRQ(UARTE(idx), priority), \
2441-
isr_handler, DEVICE_DT_GET(UARTE(idx)), 0); \
2442-
irq_enable(DT_IRQN(UARTE(idx))); \
2438+
#define UARTE_GET_ISR(idx) \
2439+
COND_CODE_1(CONFIG_UART_##idx##_ASYNC, (uarte_nrfx_isr_async), (uarte_nrfx_isr_int))
2440+
2441+
/* Declare interrupt handler for direct ISR. */
2442+
#define UARTE_DIRECT_ISR_DECLARE(idx) \
2443+
IF_ENABLED(CONFIG_UART_NRFX_UARTE_DIRECT_ISR, ( \
2444+
ISR_DIRECT_DECLARE(uarte_##idx##_direct_isr) \
2445+
{ \
2446+
ISR_DIRECT_PM(); \
2447+
UARTE_GET_ISR(idx)(DEVICE_DT_GET(UARTE(idx))); \
2448+
return 1; \
2449+
} \
2450+
))
2451+
2452+
/* Depending on configuration standard or direct IRQ is connected. */
2453+
#define UARTE_IRQ_CONNECT(idx, irqn, prio) \
2454+
COND_CODE_1(CONFIG_UART_NRFX_UARTE_DIRECT_ISR, \
2455+
(IRQ_DIRECT_CONNECT(irqn, prio, uarte_##idx##_direct_isr, 0)), \
2456+
(IRQ_CONNECT(irqn, prio, UARTE_GET_ISR(idx), DEVICE_DT_GET(UARTE(idx)), 0)))
2457+
2458+
#define UARTE_IRQ_CONFIGURE(idx) \
2459+
do { \
2460+
UARTE_IRQ_CONNECT(idx, DT_IRQN(UARTE(idx)), DT_IRQ(UARTE(idx), priority)); \
2461+
irq_enable(DT_IRQN(UARTE(idx))); \
24432462
} while (false)
24442463

24452464
/* Low power mode is used when disable_rx is not defined or in async mode if
@@ -2585,11 +2604,10 @@ static int uarte_instance_init(const struct device *dev,
25852604
.precision = NRF_CLOCK_CONTROL_PRECISION_DEFAULT,\
25862605
},)) \
25872606
}; \
2607+
UARTE_DIRECT_ISR_DECLARE(idx) \
25882608
static int uarte_##idx##_init(const struct device *dev) \
25892609
{ \
2590-
COND_CODE_1(CONFIG_UART_##idx##_ASYNC, \
2591-
(UARTE_IRQ_CONFIGURE(idx, uarte_nrfx_isr_async);), \
2592-
(UARTE_IRQ_CONFIGURE(idx, uarte_nrfx_isr_int);)) \
2610+
UARTE_IRQ_CONFIGURE(idx); \
25932611
return uarte_instance_init( \
25942612
dev, \
25952613
IS_ENABLED(CONFIG_UART_##idx##_INTERRUPT_DRIVEN)); \

0 commit comments

Comments
 (0)