diff --git a/drivers/console/console_bm_uarte.c b/drivers/console/console_bm_uarte.c index 470d25cd1c..5a2a544a20 100644 --- a/drivers/console/console_bm_uarte.c +++ b/drivers/console/console_bm_uarte.c @@ -6,6 +6,7 @@ #include #include +#include #include @@ -13,6 +14,12 @@ static const nrfx_uarte_t uarte_inst = NRFX_UARTE_INSTANCE(BOARD_CONSOLE_UARTE_INST); +ISR_DIRECT_DECLARE(console_uarte_isr) +{ + NRFX_UARTE_INST_HANDLER_GET(BOARD_CONSOLE_UARTE_INST)(); + return 0; +} + static int uarte_init(void) { int err; @@ -33,10 +40,12 @@ static int uarte_init(void) uarte_config.interrupt_priority = CONFIG_BM_UARTE_CONSOLE_UARTE_IRQ_PRIO; /** We need to connect the IRQ ourselves. */ - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET( - NRF_UARTE_INST_GET(BOARD_CONSOLE_UARTE_INST)), + IRQ_DIRECT_CONNECT( + NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_CONSOLE_UARTE_INST)), CONFIG_BM_UARTE_CONSOLE_UARTE_IRQ_PRIO, - NRFX_UARTE_INST_HANDLER_GET(BOARD_CONSOLE_UARTE_INST), 0, 0); + console_uarte_isr, + 0 + ); irq_enable(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_CONSOLE_UARTE_INST))); diff --git a/lib/bm_buttons/bm_buttons.c b/lib/bm_buttons/bm_buttons.c index d596e98f7e..dba43435a6 100644 --- a/lib/bm_buttons/bm_buttons.c +++ b/lib/bm_buttons/bm_buttons.c @@ -90,6 +90,26 @@ static void gpiote_uninit(void) #endif } +#if defined(CONFIG_SOC_SERIES_NRF52X) +ISR_DIRECT_DECLARE(buttons_gpiote0_isr) +{ + NRFX_GPIOTE_INST_HANDLER_GET(0)(); + return 0; +} +#elif defined(CONFIG_SOC_SERIES_NRF54LX) +ISR_DIRECT_DECLARE(buttons_gpiote20_isr) +{ + NRFX_GPIOTE_INST_HANDLER_GET(20)(); + return 0; +} + +ISR_DIRECT_DECLARE(buttons_gpiote30_isr) +{ + NRFX_GPIOTE_INST_HANDLER_GET(30)(); + return 0; +} +#endif + static int gpiote_init(void) { int err; @@ -102,8 +122,8 @@ static int gpiote_init(void) return -EIO; } - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_GPIOTE_INST_GET(0)), IRQ_PRIO, - NRFX_GPIOTE_INST_HANDLER_GET(0), 0, 0); + IRQ_DIRECT_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_GPIOTE_INST_GET(0)), IRQ_PRIO, + buttons_gpiote0_isr, 0); } #elif defined(CONFIG_SOC_SERIES_NRF54LX) if (!nrfx_gpiote_init_check(&gpiote20_instance)) { @@ -113,8 +133,9 @@ static int gpiote_init(void) return -EIO; } - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_GPIOTE_INST_GET(20)) + NRF_GPIOTE_IRQ_GROUP, - IRQ_PRIO, NRFX_GPIOTE_INST_HANDLER_GET(20), 0, 0); + IRQ_DIRECT_CONNECT( + NRFX_IRQ_NUMBER_GET(NRF_GPIOTE_INST_GET(20)) + NRF_GPIOTE_IRQ_GROUP, + IRQ_PRIO, buttons_gpiote20_isr, 0); } if (!nrfx_gpiote_init_check(&gpiote30_instance)) { @@ -124,8 +145,9 @@ static int gpiote_init(void) return -EIO; } - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_GPIOTE_INST_GET(30)) + NRF_GPIOTE_IRQ_GROUP, - IRQ_PRIO, NRFX_GPIOTE_INST_HANDLER_GET(30), 0, 0); + IRQ_DIRECT_CONNECT( + NRFX_IRQ_NUMBER_GET(NRF_GPIOTE_INST_GET(30)) + NRF_GPIOTE_IRQ_GROUP, + IRQ_PRIO, buttons_gpiote30_isr, 0); } #endif return 0; diff --git a/samples/Kconfig b/samples/Kconfig index b7a0000714..75bc8a7b33 100644 --- a/samples/Kconfig +++ b/samples/Kconfig @@ -14,3 +14,7 @@ config MULTITHREADING # Need this when building without sysbuild config PARTITION_MANAGER_ENABLED default n + +# All these samples use IRQ_DIRECT_CONNECT, so software ISR table is not needed +config GEN_SW_ISR_TABLE + default n if !UNITY diff --git a/samples/bluetooth/ble_nus/src/main.c b/samples/bluetooth/ble_nus/src/main.c index 1a4a122242..5833c54e1d 100644 --- a/samples/bluetooth/ble_nus/src/main.c +++ b/samples/bluetooth/ble_nus/src/main.c @@ -283,6 +283,20 @@ static void ble_nus_evt_handler(const struct ble_nus_evt *evt) } } +#if defined(CONFIG_SOC_SERIES_NRF52X) +ISR_DIRECT_DECLARE(nus_uarte0_isr) +{ + NRFX_UARTE_INST_HANDLER_GET(0)(); + return 0; +} +#elif defined(CONFIG_SOC_SERIES_NRF54LX) +ISR_DIRECT_DECLARE(nus_uarte30_isr) +{ + NRFX_UARTE_INST_HANDLER_GET(30)(); + return 0; +} +#endif + /** * @brief Initalize UARTE driver. */ @@ -307,13 +321,13 @@ static int uarte_init(void) /** We need to connect the IRQ ourselves. */ #if defined(CONFIG_SOC_SERIES_NRF52X) - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(0)), CONFIG_BLE_UART_IRQ_PRIO, - NRFX_UARTE_INST_HANDLER_GET(0), 0, 0); + IRQ_DIRECT_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(0)), CONFIG_BLE_UART_IRQ_PRIO, + nus_uarte0_isr, 0); - irq_enable(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(0))); + irq_enable(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(0))); #elif defined(CONFIG_SOC_SERIES_NRF54LX) - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(30)), CONFIG_BLE_UART_IRQ_PRIO, - NRFX_UARTE_INST_HANDLER_GET(30), 0, 0); + IRQ_DIRECT_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(30)), CONFIG_BLE_UART_IRQ_PRIO, + nus_uarte30_isr, 0); irq_enable(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(30))); #endif diff --git a/samples/mcumgr/uart_mcumgr/src/uart_mcumgr.c b/samples/mcumgr/uart_mcumgr/src/uart_mcumgr.c index f91e27deff..827fa4a27d 100644 --- a/samples/mcumgr/uart_mcumgr/src/uart_mcumgr.c +++ b/samples/mcumgr/uart_mcumgr/src/uart_mcumgr.c @@ -207,6 +207,12 @@ void uart_mcumgr_register(uart_mcumgr_recv_fn *cb) uart_mcumgr_recv_cb = cb; } +ISR_DIRECT_DECLARE(mcumgr_uarte_isr) +{ + NRFX_UARTE_INST_HANDLER_GET(BOARD_APP_UARTE_INST)(); + return 0; +} + /** * @brief Initialize UARTE driver. */ @@ -230,9 +236,10 @@ static int uarte_init(void) uarte_config.interrupt_priority = CONFIG_UARTE_IRQ_PRIO; /** We need to connect the IRQ ourselves. */ - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_APP_UARTE_INST)), - CONFIG_UARTE_IRQ_PRIO, NRFX_UARTE_INST_HANDLER_GET(BOARD_APP_UARTE_INST), - 0, 0); + IRQ_DIRECT_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_APP_UARTE_INST)), + CONFIG_UARTE_IRQ_PRIO, + mcumgr_uarte_isr, + 0); irq_enable(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_APP_UARTE_INST))); diff --git a/samples/peripherals/uarte/src/main.c b/samples/peripherals/uarte/src/main.c index 8ba028cf92..8916849ed6 100644 --- a/samples/peripherals/uarte/src/main.c +++ b/samples/peripherals/uarte/src/main.c @@ -83,6 +83,12 @@ static void uarte_event_handler(nrfx_uarte_event_t const *event, void *ctx) } } +ISR_DIRECT_DECLARE(sample_uarte_isr) +{ + NRFX_UARTE_INST_HANDLER_GET(BOARD_APP_UARTE_INST)(); + return 0; +} + /* Initialize UARTE driver. */ static int uarte_init(void) { @@ -104,9 +110,9 @@ static int uarte_init(void) uarte_config.interrupt_priority = CONFIG_UARTE_IRQ_PRIO; /* We need to connect the IRQ ourselves. */ - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_APP_UARTE_INST)), - CONFIG_UARTE_IRQ_PRIO, - NRFX_UARTE_INST_HANDLER_GET(BOARD_APP_UARTE_INST), 0, 0); + IRQ_DIRECT_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_APP_UARTE_INST)), + CONFIG_UARTE_IRQ_PRIO, + sample_uarte_isr, 0); irq_enable(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_APP_UARTE_INST))); diff --git a/subsys/logging/backends/log_backend_bm_uarte.c b/subsys/logging/backends/log_backend_bm_uarte.c index 0871b80d71..32cd502d81 100644 --- a/subsys/logging/backends/log_backend_bm_uarte.c +++ b/subsys/logging/backends/log_backend_bm_uarte.c @@ -20,6 +20,12 @@ static char uarte_tx_buf[CONFIG_LOG_BACKEND_BM_UARTE_BUFFER_SIZE]; static int log_out(uint8_t *data, size_t length, void *ctx); LOG_OUTPUT_DEFINE(bm_lbu_output, log_out, lbu_buffer, CONFIG_LOG_BACKEND_BM_UARTE_BUFFER_SIZE); +ISR_DIRECT_DECLARE(log_uarte_isr) +{ + NRFX_UARTE_INST_HANDLER_GET(BOARD_CONSOLE_UARTE_INST)(); + return 0; +} + static int uarte_init(void) { int err; @@ -42,10 +48,11 @@ static int uarte_init(void) uarte_config.tx_cache.length = sizeof(uarte_tx_buf); /** We need to connect the IRQ ourselves. */ - IRQ_CONNECT(NRFX_IRQ_NUMBER_GET( + IRQ_DIRECT_CONNECT(NRFX_IRQ_NUMBER_GET( NRF_UARTE_INST_GET(BOARD_CONSOLE_UARTE_INST)), CONFIG_LOG_BACKEND_BM_UARTE_IRQ_PRIO, - NRFX_UARTE_INST_HANDLER_GET(BOARD_CONSOLE_UARTE_INST), 0, 0); + log_uarte_isr, + 0); irq_enable(NRFX_IRQ_NUMBER_GET(NRF_UARTE_INST_GET(BOARD_CONSOLE_UARTE_INST))); diff --git a/subsys/softdevice_handler/irq_connect.c b/subsys/softdevice_handler/irq_connect.c index 634d5313ac..78a47a7118 100644 --- a/subsys/softdevice_handler/irq_connect.c +++ b/subsys/softdevice_handler/irq_connect.c @@ -19,6 +19,14 @@ void relocate_vector_table(void) /* Empty, but needed */ } +#ifdef CONFIG_NRF5_SDK_IRQ_CONNECT_GPIOTE +ISR_DIRECT_DECLARE(gpiote0_isr) +{ + nrfx_gpiote_0_irq_handler(); + return 0; +} +#endif + static int irq_init(void) { int err; @@ -27,7 +35,7 @@ static int irq_init(void) /** TODO: rework */ #ifdef CONFIG_NRF5_SDK_IRQ_CONNECT_GPIOTE - IRQ_CONNECT(GPIOTE_IRQn, 5, nrfx_isr, nrfx_gpiote_0_irq_handler, 0); + IRQ_DIRECT_CONNECT(GPIOTE_IRQn, 5, gpiote0_isr, 0); #endif err = sd_softdevice_vector_table_base_set(VECTOR_ADDRESS); diff --git a/subsys/softdevice_handler/nrf_sdh.c b/subsys/softdevice_handler/nrf_sdh.c index 295816df5c..74fe03b851 100644 --- a/subsys/softdevice_handler/nrf_sdh.c +++ b/subsys/softdevice_handler/nrf_sdh.c @@ -280,15 +280,15 @@ void SD_EVT_IRQHandler(void) #endif /* NRF_SDH_DISPATCH_MODEL */ -static void isr_handler(const void *arg) +ISR_DIRECT_DECLARE(sd_evt_isr) { - ARG_UNUSED(arg); SD_EVT_IRQHandler(); + return 0; } static int sd_irq_init(void) { - IRQ_CONNECT(SD_EVT_IRQn, 4, isr_handler, NULL, 0); + IRQ_DIRECT_CONNECT(SD_EVT_IRQn, 4, sd_evt_isr, 0); irq_enable(SD_EVT_IRQn); return 0; diff --git a/west.yml b/west.yml index 9b1ca583be..ad76c9adc6 100644 --- a/west.yml +++ b/west.yml @@ -14,7 +14,7 @@ manifest: projects: - name: nrf repo-path: sdk-nrf - revision: v3.1.0-rc1 + revision: pull/23793/head import: name-allowlist: - cmsis_6