Skip to content

Commit d5dea1a

Browse files
nordic-baminordic-piks
authored andcommitted
tests: drivers: uart: Add UARTE fifo rx amount handling test
Test the driver RX AMOUNT handling with multiple transfers. Signed-off-by: Bartosz Miller <[email protected]>
1 parent f5c4cf1 commit d5dea1a

File tree

9 files changed

+387
-0
lines changed

9 files changed

+387
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#
2+
# Copyright (c) 2025 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
7+
cmake_minimum_required(VERSION 3.20.0)
8+
9+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
10+
11+
project(uart_fifo_flush)
12+
13+
target_sources(app PRIVATE src/main.c)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
/ {
8+
chosen {
9+
zephyr,console = &uart1;
10+
};
11+
};
12+
13+
&pinctrl {
14+
uart1_default_alt: uart1_default_alt {
15+
group1 {
16+
psels = <NRF_PSEL(UART_TX, 0, 6)>,
17+
<NRF_PSEL(UART_RX, 0, 8)>;
18+
};
19+
};
20+
21+
uart1_sleep_alt: uart1_sleep_alt {
22+
group1 {
23+
psels = <NRF_PSEL(UART_TX, 0, 6)>,
24+
<NRF_PSEL(UART_RX, 0, 8)>;
25+
low-power-enable;
26+
};
27+
};
28+
29+
uart0_default_alt: uart0_default_alt {
30+
group1 {
31+
psels = <NRF_PSEL(UART_TX, 1, 1)>,
32+
<NRF_PSEL(UART_RX, 1, 2)>,
33+
<NRF_PSEL(UART_RTS, 1, 3)>,
34+
<NRF_PSEL(UART_CTS, 1, 4)>;
35+
};
36+
};
37+
38+
uart0_sleep_alt: uart0_sleep_alt {
39+
group1 {
40+
psels = <NRF_PSEL(UART_TX, 1, 1)>,
41+
<NRF_PSEL(UART_RX, 1, 2)>,
42+
<NRF_PSEL(UART_RTS, 1, 3)>,
43+
<NRF_PSEL(UART_CTS, 1, 4)>;
44+
low-power-enable;
45+
};
46+
};
47+
};
48+
49+
&uart1 {
50+
current-speed = <115200>;
51+
status = "okay";
52+
pinctrl-0 = <&uart1_default_alt>;
53+
pinctrl-1 = <&uart1_sleep_alt>;
54+
pinctrl-names = "default", "sleep";
55+
};
56+
57+
dut: &uart0 {
58+
compatible = "nordic,nrf-uarte";
59+
current-speed = <115200>;
60+
status = "okay";
61+
pinctrl-0 = <&uart0_default_alt>;
62+
pinctrl-1 = <&uart0_sleep_alt>;
63+
pinctrl-names = "default", "sleep";
64+
hw-flow-control;
65+
};
66+
67+
&timer0 {
68+
status = "okay";
69+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
&pinctrl {
8+
uart1_default_alt: uart1_default_alt {
9+
group1 {
10+
psels = <NRF_PSEL(UART_TX, 0, 4)>,
11+
<NRF_PSEL(UART_RX, 0, 5)>,
12+
<NRF_PSEL(UART_RTS, 0, 6)>,
13+
<NRF_PSEL(UART_CTS, 0, 7)>;
14+
};
15+
};
16+
17+
uart1_sleep_alt: uart1_sleep_alt {
18+
group1 {
19+
psels = <NRF_PSEL(UART_TX, 0, 4)>,
20+
<NRF_PSEL(UART_RX, 0, 5)>,
21+
<NRF_PSEL(UART_RTS, 0, 6)>,
22+
<NRF_PSEL(UART_CTS, 0, 7)>;
23+
low-power-enable;
24+
};
25+
};
26+
};
27+
28+
dut: &uart1 {
29+
current-speed = <115200>;
30+
compatible = "nordic,nrf-uarte";
31+
status = "okay";
32+
pinctrl-0 = <&uart1_default_alt>;
33+
pinctrl-1 = <&uart1_sleep_alt>;
34+
pinctrl-names = "default", "sleep";
35+
hw-flow-control;
36+
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
/* UART device used for test
8+
* not the default UART assignment for the LD
9+
*/
10+
&pinctrl {
11+
uart131_default_alt: uart131_default_alt {
12+
group1 {
13+
psels = <NRF_PSEL(UART_TX, 0, 6)>,
14+
<NRF_PSEL(UART_RX, 0, 7)>,
15+
<NRF_PSEL(UART_RTS, 0, 8)>,
16+
<NRF_PSEL(UART_CTS, 0, 9)>;
17+
};
18+
};
19+
20+
uart131_sleep_alt: uart131_sleep_alt {
21+
group1 {
22+
psels = <NRF_PSEL(UART_TX, 0, 6)>,
23+
<NRF_PSEL(UART_RX, 0, 7)>,
24+
<NRF_PSEL(UART_RTS, 0, 8)>,
25+
<NRF_PSEL(UART_CTS, 0, 9)>;
26+
low-power-enable;
27+
};
28+
};
29+
};
30+
31+
&cpuapp_dma_region {
32+
status="okay";
33+
};
34+
35+
dut: &uart131 {
36+
status = "okay";
37+
memory-regions = <&cpuapp_dma_region>;
38+
pinctrl-0 = <&uart131_default_alt>;
39+
pinctrl-1 = <&uart131_sleep_alt>;
40+
pinctrl-names = "default", "sleep";
41+
current-speed = <115200>;
42+
hw-flow-control;
43+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
&pinctrl {
8+
uart21_default: uart21_default {
9+
group1 {
10+
psels = <NRF_PSEL(UART_TX, 1, 10)>,
11+
<NRF_PSEL(UART_RX, 1, 11)>,
12+
<NRF_PSEL(UART_RTS, 1, 8)>,
13+
<NRF_PSEL(UART_CTS, 1, 9)>;
14+
};
15+
};
16+
17+
uart21_sleep: uart21_sleep {
18+
group1 {
19+
psels = <NRF_PSEL(UART_TX, 1, 10)>,
20+
<NRF_PSEL(UART_RX, 1, 11)>,
21+
<NRF_PSEL(UART_RTS, 1, 8)>,
22+
<NRF_PSEL(UART_CTS, 1, 9)>;
23+
low-power-enable;
24+
};
25+
};
26+
};
27+
28+
dut: &uart21 {
29+
status = "okay";
30+
current-speed = <115200>;
31+
pinctrl-0 = <&uart21_default>;
32+
pinctrl-1 = <&uart21_sleep>;
33+
pinctrl-names = "default", "sleep";
34+
hw-flow-control;
35+
};
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
/*
8+
* Required loopbacks:
9+
* P1.13 <-> P1.14
10+
* P1.23 <-> P1.24
11+
*/
12+
13+
&pinctrl {
14+
uart21_default: uart21_default {
15+
group1 {
16+
psels = <NRF_PSEL(UART_TX, 1, 13)>,
17+
<NRF_PSEL(UART_RX, 1, 14)>,
18+
<NRF_PSEL(UART_RTS, 1, 23)>,
19+
<NRF_PSEL(UART_CTS, 1, 24)>;
20+
};
21+
};
22+
23+
uart21_sleep: uart21_sleep {
24+
group1 {
25+
psels = <NRF_PSEL(UART_TX, 1, 13)>,
26+
<NRF_PSEL(UART_RX, 1, 14)>,
27+
<NRF_PSEL(UART_RTS, 1, 23)>,
28+
<NRF_PSEL(UART_CTS, 1, 24)>;
29+
low-power-enable;
30+
};
31+
};
32+
};
33+
34+
dut: &uart21 {
35+
status = "okay";
36+
current-speed = <115200>;
37+
pinctrl-0 = <&uart21_default>;
38+
pinctrl-1 = <&uart21_sleep>;
39+
pinctrl-names = "default", "sleep";
40+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CONFIG_SERIAL=y
2+
CONFIG_UART_ASYNC_API=y
3+
4+
CONFIG_ZTEST=y
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include <zephyr/kernel.h>
8+
#include <zephyr/ztest.h>
9+
#include <zephyr/drivers/uart.h>
10+
#include "nrfx_uarte.h"
11+
12+
#define UART_TIMEOUT_US 50000
13+
#define SLEEP_TIME_MS 10
14+
#define RX_BUFFER_A_SIZE 17
15+
#define RX_BUFFER_B_SIZE 9
16+
#define TX_BUFFER_SIZE RX_BUFFER_A_SIZE + RX_BUFFER_B_SIZE
17+
#define UART_NODE DT_NODELABEL(dut)
18+
19+
static K_SEM_DEFINE(uart_rx_buf_released_sem, 0, 1);
20+
21+
uint8_t tx_buffer[TX_BUFFER_SIZE];
22+
uint8_t rx_buffer_a[RX_BUFFER_A_SIZE];
23+
uint8_t rx_buffer_b[RX_BUFFER_B_SIZE];
24+
static volatile uint8_t rx_buffer_release_counter;
25+
26+
const struct device *const uart_dev = DEVICE_DT_GET(UART_NODE);
27+
NRF_UARTE_Type *uart_reg = (NRF_UARTE_Type *)DT_REG_ADDR(UART_NODE);
28+
29+
static void async_uart_callback(const struct device *dev, struct uart_event *evt, void *user_data)
30+
{
31+
uint32_t rx_amount;
32+
33+
switch (evt->type) {
34+
case UART_TX_DONE:
35+
break;
36+
case UART_TX_ABORTED:
37+
break;
38+
case UART_RX_RDY:
39+
break;
40+
case UART_RX_BUF_RELEASED:
41+
rx_amount = nrf_uarte_rx_amount_get(uart_reg);
42+
rx_buffer_release_counter++;
43+
if (rx_buffer_release_counter == 1) {
44+
zassert_equal(rx_amount, RX_BUFFER_A_SIZE);
45+
} else if (rx_buffer_release_counter == 2) {
46+
zassert_equal(rx_amount, RX_BUFFER_B_SIZE);
47+
k_sem_give(&uart_rx_buf_released_sem);
48+
}
49+
break;
50+
case UART_RX_BUF_REQUEST:
51+
zassert_ok(uart_rx_buf_rsp(uart_dev, rx_buffer_b, RX_BUFFER_B_SIZE),
52+
"uart_rx_buf_rsp failed\n");
53+
break;
54+
case UART_RX_DISABLED:
55+
break;
56+
default:
57+
break;
58+
}
59+
}
60+
61+
static void enable_uart_rx(uint8_t *rx_buffer)
62+
{
63+
int err;
64+
65+
do {
66+
err = uart_rx_enable(uart_dev, rx_buffer, RX_BUFFER_A_SIZE, UART_TIMEOUT_US);
67+
} while (err == -EBUSY);
68+
zassert_ok(err, "UART RX disable failed, err = %d\n", err);
69+
}
70+
71+
static void set_test_pattern(uint8_t *tx_buffer)
72+
{
73+
for (int i = 0; i < TX_BUFFER_SIZE; i++) {
74+
tx_buffer[i] = i;
75+
}
76+
}
77+
78+
ZTEST(uart_fifo_flush, test_rx_amount_handling)
79+
{
80+
set_test_pattern(tx_buffer);
81+
memset(rx_buffer_a, 0xFF, RX_BUFFER_A_SIZE);
82+
memset(rx_buffer_b, 0xFF, RX_BUFFER_B_SIZE);
83+
84+
zassert_ok(uart_callback_set(uart_dev, async_uart_callback, NULL),
85+
"uart_callback_set failed\n");
86+
enable_uart_rx(rx_buffer_a);
87+
zassert_ok(uart_tx(uart_dev, tx_buffer, TX_BUFFER_SIZE, UART_TIMEOUT_US),
88+
"uart_tx failed\n");
89+
90+
while (k_sem_take(&uart_rx_buf_released_sem, K_NO_WAIT) != 0) {
91+
k_msleep(SLEEP_TIME_MS);
92+
};
93+
94+
for (int i = 0; i < TX_BUFFER_SIZE; i++) {
95+
if (i < RX_BUFFER_A_SIZE) {
96+
if (rx_buffer_a[i] != tx_buffer[i]) {
97+
TC_PRINT("rx_buffer_a[%d] != tx_buffer[%d], 0x%x != 0x%x\n", i, i,
98+
rx_buffer_a[i], tx_buffer[i]);
99+
zassert_true(false, "RX buffer A does not match pattern\n");
100+
}
101+
} else {
102+
if (rx_buffer_b[i - RX_BUFFER_A_SIZE] != tx_buffer[i]) {
103+
TC_PRINT("rx_buffer_b[%d] != tx_buffer[%d], 0x%x != 0x%x\n",
104+
i - RX_BUFFER_A_SIZE, i, rx_buffer_b[i - RX_BUFFER_A_SIZE],
105+
tx_buffer[i]);
106+
zassert_true(false, "RX buffer B does not match pattern\n");
107+
}
108+
}
109+
}
110+
uart_rx_disable(uart_dev);
111+
TC_PRINT("Transmission done\n");
112+
zassert_equal(nrf_uarte_rx_amount_get(uart_reg), 0,
113+
"RX AMOUNT should be 0 after RX disable\n");
114+
}
115+
116+
void *test_setup(void)
117+
{
118+
zassert_true(device_is_ready(uart_dev), "UART device is not ready");
119+
120+
return NULL;
121+
}
122+
123+
ZTEST_SUITE(uart_fifo_flush, NULL, test_setup, NULL, NULL, NULL);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
common:
2+
sysbuild: true
3+
depends_on: gpio
4+
tags:
5+
- drivers
6+
- uart
7+
- ci_tests_drivers_uart
8+
harness: ztest
9+
harness_config:
10+
fixture: gpio_loopback
11+
12+
tests:
13+
drivers.uart.uart_fifo_flush:
14+
platform_allow:
15+
- nrf52840dk/nrf52840
16+
- nrf5340dk/nrf5340/cpuapp
17+
- nrf54h20dk/nrf54h20/cpuapp
18+
- nrf54l15dk/nrf54l15/cpuapp
19+
- nrf54lm20dk/nrf54lm20a/cpuapp
20+
integration_platforms:
21+
- nrf52840dk/nrf52840
22+
- nrf5340dk/nrf5340/cpuapp
23+
- nrf54h20dk/nrf54h20/cpuapp
24+
- nrf54l15dk/nrf54l15/cpuapp

0 commit comments

Comments
 (0)