How to use async UART on one instance and interrupt-driven on another (NCS 3.1.0)

Hi,

I'm using the nRF54L15 (custom board, nRF54L15 DK base) with NCS v3.1.0.

I have two UARTs:

  • uart30 — Shell/console (needs CONFIG_SHELL_BACKEND_SERIAL=y, which requires interrupt-driven)
  • uart21 — External modem (LARA-R6001) using async/DMA API (uart_callback_set, uart_tx, uart_rx_enable)

Problem: When CONFIG_UART_INTERRUPT_DRIVEN=y is enabled (required by the shell), uart_callback_set() on uart21 returns -ENOSYS (-88). When I disable interrupt-driven, the modem works but the shell doesn't.

What I've tried:

  • CONFIG_UART_NRFX_UARTE_LEGACY_SHIM=n — still returns -88
  • CONFIG_SHELL_BACKEND_SERIAL_API_ASYNC=y — config resolves but no serial output
  • CONFIG_SHELL_BACKEND_SERIAL_API_POLLING=y — prompt appears but cannot type (RX doesn't work)
  • CONFIG_UART_ASYNC_ADAPTER=y — still returns -88
  • Both CONFIG_UART_ASYNC_API=y and CONFIG_UART_INTERRUPT_DRIVEN=y simultaneously — modem still gets -88

My overlay (relevant parts):

dts
chosen {
    zephyr,console = &uart30;
    zephyr,shell-uart = &uart30;
};

&uart21 {
    status = "okay";
    current-speed = <115200>;
    pinctrl-0 = <&uart21_default>;
    pinctrl-1 = <&uart21_sleep>;
    pinctrl-names = "default", "sleep";
};

&uart30 {
    status = "okay";
    current-speed = <1000000>;
    pinctrl-0 = <&uart30_default>;
    pinctrl-1 = <&uart30_sleep>;
    pinctrl-names = "default", "sleep";
};
```

My prj.conf:
```
CONFIG_UART_ASYNC_API=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_NRFX_UARTE21=y
CONFIG_SHELL=y
CONFIG_SHELL_BACKEND_SERIAL=y
CONFIG_UART_CONSOLE=y
CONFIG_SOC_NRF_FORCE_CONSTLAT=y

Is there a way to configure per-instance UART API selection on the nRF54L15 with NCS 3.1.0? For example, uart30 using interrupt-driven and uart21 using async/DMA?

Thank you.

Parents Reply Children
No Data
Related