nRF54L15 UART21 shell RX on P2 only works with CONSTLAT

nRF54L15: UARTE on P2 pins (P2.07/P2.08) shell RX only reliable when `SOC_NRF_FORCE_CONSTLAT=y`

Environment

- SoC: nRF54L15 (CPUAPP)
- Board: custom board (`battery_nrf54_mps`)
- SDK/Zephyr basis in workspace:
  - Zephyr: `4.3.0`
  - NCS-style workspace layout (`/workspace/nrf`, `/workspace/zephyr`, custom board repo)
- Serial terminal: `picocom -b 115200 /dev/ttyUSB0`

Board/UART setup

- Console + shell are assigned to `uart21`
- UART pins:
  - TX: `P2.08`
  - RX: `P2.07`
- DTS snippet:
  - `zephyr,console = &uart21;`
  - `zephyr,shell-uart = &uart21;`
- Pinctrl snippet:
  - RX is in separate group with `bias-pull-up`
  - sleep state has `low-power-enable`

Relevant custom snippets

`board.dts`:

- chosen:
  - `zephyr,console = &uart21;`
  - `zephyr,shell-uart = &uart21;`

`boards/festool/battery_nrf54_mps/battery_nrf54_mps-pinctrl.dtsi`:

- `uart21_default`: `UART_TX P2.08`, `UART_RX P2.07`, RX with `bias-pull-up`
- `uart21_sleep`: same pins with `low-power-enable`

`/samples/boards/basic_shell/prj.conf` (working config):

- `CONFIG_SHELL=y`
- `CONFIG_SHELL_BACKEND_SERIAL=y`
- `CONFIG_UART_INTERRUPT_DRIVEN=y`
- `CONFIG_SHELL_BACKEND_SERIAL_API_INTERRUPT_DRIVEN=y`
- `CONFIG_NRF_SYS_EVENT=y`
- `CONFIG_SOC_NRF_FORCE_CONSTLAT=y`

Problem description

Symptom observed repeatedly:

- Shell prompt appears (`uart:~$`) and TX works.
- But RX input is not processed (typing commands does nothing), unless CONSTLAT is forced.

Reproduction (before workaround)

1. Build/flash shell sample for custom board with UART on P2 (`uart21` on P2.07/P2.08).
2. Connect serial terminal at 115200.
3. Observe:
   - prompt appears
   - entered characters/commands are not handled reliably (often no response)

Workaround that makes it work reliably

Enable:

- `CONFIG_NRF_SYS_EVENT=y`
- `CONFIG_SOC_NRF_FORCE_CONSTLAT=y`

After enabling these options and reflashing, shell input works reliably.

Why we suspect this is expected behavior for P2

From nRF54L15 datasheet excerpt (Port/domain section):

- P2 is in MCU domain, intended for fast signals.
- P2 GPIO cannot wake from sleep; no GPIO SENSE/DETECT/GPIOTE on P2.
- Peripherals must use pins in their own domain, **except** some P2 serial use cases in **Constant Latency sub-power mode**.

This matches our observation: using P2 for UARTE shell RX becomes reliable when CONSTLAT is forced.


Questions for Nordic (what we want to confirm)

1. Is requiring CONSTLAT for stable UARTE operation on P2 (MCU domain) expected on nRF54L15?
2. Are there any recommended constraints for using UARTE on P2 in System ON sleep scenarios?
3. Is `low-power-enable` in UART sleep pinctrl state expected to worsen RX robustness for P2 unless CONSTLAT is active?
4. For production low power, is Nordic recommendation to move UART shell pins to P0/P1 when possible?

Expected outcome

We want confirmation of the intended architectural behavior and Nordic best-practice guidance for:

- debug shell over UARTE on P2,
- low-power operation without forcing CONSTLAT globally.
Parents Reply Children
No Data
Related