Skip to content

drivers: serial: nrfx_uarte: Add extension that uses TIMER byte counting on nrf54x devices #92767

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from

Conversation

nordic-krch
Copy link
Collaborator

Extend uart_nrfx_uarte driver to support a mode of operation that is using bounce buffers and TIMER to count bytes (only applies to Asynchronous API). UARTE may lose or get a corrupted byte if new data appears on the line when RX timeout expired. In that case receiver is restarted and if there is a byte on the line when that restart happens then that byte will be lost or corrupted. This is relevant only to reception without HWFC.

Mode is using a TIMER instance and DPPI to count bytes using UARTE RXDRDY event. There is already a similar mode that is enabled using CONFIG_UART_x_NRF_HW_ASYNC for legacy platforms but it cannot be used on newer SoCs due to different DMA behavior.

New mode is enabled by specifying a timer property which points to the TIMER instance (e.g.. timer = <&timer21>). Timer node that is used for that should be reserved.

Overlay example:

&timer21 {
  status = "reserved";
};
&uart21 {
  timer = <&timer21>;
};

PR extends uart_async_dual stress test with a case which validates that the receiver is able to received chopped data (data sent in chunks with random gaps between).

@github-actions github-actions bot added platform: nRF Nordic nRFx area: UART Universal Asynchronous Receiver-Transmitter labels Jul 7, 2025
Copy link

github-actions bot commented Jul 7, 2025

The following west manifest projects have changed revision in this Pull Request:

Name Old Revision New Revision Diff
hal_nordic zephyrproject-rtos/hal_nordic@9587b1d (master) zephyrproject-rtos/hal_nordic#306 zephyrproject-rtos/hal_nordic#306/files

DNM label due to: 1 project with PR revision

Note: This message is automatically posted and updated by the Manifest GitHub Action.

@github-actions github-actions bot added manifest manifest-hal_nordic DNM (manifest) This PR should not be merged (controlled by action-manifest) labels Jul 7, 2025
Update hal_nordic with nrf_uarte change. Add functions for setting
PTR and MAXCNT separately.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Timer property indicates which TIMER instance should be used for
byte counting. If timer property is present then given instance
is using TIMER to count received bytes.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Rearrange code to prepare for upcoming extension that adds special
receive mode.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
@nordic-krch nordic-krch force-pushed the uart_byte_count branch 6 times, most recently from 07a11f1 to c4cd989 Compare July 9, 2025 05:48
Add mode to be used on UARTE with frame timeout which is using a bounce
buffers and TIMER to count bytes. This mode shall be used to reliably
receive data without HWFC as frame timeout approach is not 100% reliable
because it can loose or corrupt a byte when new byte arrives after
frame timeout is detected but before it is fully handled. This mode is
similar to the one enabled with CONFIG_UART_x_NRF_HW_ASYNC but
additional bounce buffers are used and UARTE is receiving data to
internal buffers and copies data to the user buffer. Legacy apporach
cannot be used because in new SoC DMA attempts to copy data in words
so when byte is received it stays in the DMA internal buffer until
4 bytes are received or end of transfer happens then internal DMA
buffer is flushed.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Add reporting about the test progress. Test lasts few seconds and
progress report helps to see if test stuck or how it is progressing.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Extend test with a mode where HWFC is off and receiver is providing
buffers on time. In that case receiver should be able to continuously
receive data without losing any byte (even without HWFC). Additionally,
TX data is chopped to verify that receiver does not loose bytes when
new TX data collides with detected RX timeout.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Add timer property to the uart device under test.
Add zephyr,pm-device-runtime-auto to the uart device under test.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Add workaround timer to instances that are used for reception in the
test.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Stress test is executed on CPUs with slow clock (16MHz). Handling of test
data in UART_RX_RDY event is optimized to reduce time spent in the
interrupt context. Since payload is always a decrementing sequence, fixed
array is used to compare memory which allows to use standard memcmp
instead of byte by byte comparison.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: UART Universal Asynchronous Receiver-Transmitter DNM (manifest) This PR should not be merged (controlled by action-manifest) manifest manifest-hal_nordic platform: nRF Nordic nRFx
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants