Skip to content

Commit ee1f4d7

Browse files
committed
tests: drivers: uart: Add UART mode to mode full duplex transmission test
This test suite verifies data transmission between two UART instances operating in different modes (ASYNC, INT, POLL). Signed-off-by: Bartosz Miller <bartosz.miller@nordicsemi.no>
1 parent 6f26006 commit ee1f4d7

File tree

12 files changed

+737
-0
lines changed

12 files changed

+737
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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_mode_to_mode)
12+
13+
if(CONFIG_ASYNC_TO_INT)
14+
FILE(GLOB app_sources src/async_int.c)
15+
elseif(CONFIG_ASYNC_TO_POLL)
16+
FILE(GLOB app_sources src/async_poll.c)
17+
else()
18+
FILE(GLOB app_sources src/int_poll.c)
19+
endif()
20+
21+
target_sources(app PRIVATE src/common.c ${app_sources})
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#
2+
# Copyright (c) 2025 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
7+
source "Kconfig.zephyr"
8+
9+
config ASYNC_TO_INT
10+
bool "Enable async to int mode uart transmission test"
11+
12+
config ASYNC_TO_POLL
13+
bool "Enable async to poll mode uart transmission test"
14+
15+
config INT_TO_POLL
16+
bool "Enable int to poll mode uart transmission test"
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
/*
8+
* Required loopbacks:
9+
* P0.08 <-> P0.09
10+
* P0.06 <-> P0.07
11+
*/
12+
13+
&pinctrl {
14+
uart134_default_test: uart134_default_test {
15+
group1 {
16+
psels = <NRF_PSEL(UART_RX, 0, 9)>;
17+
bias-pull-up;
18+
};
19+
group2 {
20+
psels = <NRF_PSEL(UART_TX, 0, 6)>;
21+
};
22+
};
23+
24+
uart134_sleep_test: uart134_sleep_test {
25+
group1 {
26+
psels = <NRF_PSEL(UART_TX, 0, 6)>,
27+
<NRF_PSEL(UART_RX, 0, 9)>;
28+
low-power-enable;
29+
};
30+
};
31+
32+
uart131_default_test: uart131_default_test {
33+
group1 {
34+
psels = <NRF_PSEL(UART_RX, 0, 7)>;
35+
bias-pull-up;
36+
};
37+
group2 {
38+
psels = <NRF_PSEL(UART_TX, 0, 8)>;
39+
};
40+
};
41+
42+
uart131_sleep_test: uart131_sleep_test {
43+
group1 {
44+
psels = <NRF_PSEL(UART_TX, 0, 7)>,
45+
<NRF_PSEL(UART_RX, 0, 8)>;
46+
low-power-enable;
47+
};
48+
};
49+
};
50+
51+
&cpuapp_dma_region {
52+
status = "okay";
53+
};
54+
55+
dut_uart_a: &uart134 {
56+
compatible = "nordic,nrf-uarte";
57+
current-speed = <115200>;
58+
status = "okay";
59+
memory-regions = <&cpuapp_dma_region>;
60+
pinctrl-0 = <&uart134_default_test>;
61+
pinctrl-1 = <&uart134_sleep_test>;
62+
pinctrl-names = "default", "sleep";
63+
/delete-property/ hw-flow-control;
64+
};
65+
66+
dut_uart_b: &uart131 {
67+
compatible = "nordic,nrf-uarte";
68+
current-speed = <115200>;
69+
status = "okay";
70+
memory-regions = <&cpuapp_dma_region>;
71+
pinctrl-0 = <&uart131_default_test>;
72+
pinctrl-1 = <&uart131_sleep_test>;
73+
pinctrl-names = "default", "sleep";
74+
/delete-property/ hw-flow-control;
75+
};
76+
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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.08 <-> P1.09
10+
* P1.10 <-> P1.11
11+
*/
12+
13+
&pinctrl {
14+
uart21_default: uart21_default {
15+
group1 {
16+
psels = <NRF_PSEL(UART_TX, 1, 10)>,
17+
<NRF_PSEL(UART_RX, 1, 8)>;
18+
bias-pull-up;
19+
};
20+
};
21+
22+
uart21_sleep: uart21_sleep {
23+
group1 {
24+
psels = <NRF_PSEL(UART_TX, 1, 10)>,
25+
<NRF_PSEL(UART_RX, 1, 8)>;
26+
low-power-enable;
27+
};
28+
};
29+
30+
uart22_default: uart22_default {
31+
group1 {
32+
psels = <NRF_PSEL(UART_TX, 1, 9)>,
33+
<NRF_PSEL(UART_RX, 1, 11)>;
34+
bias-pull-up;
35+
};
36+
};
37+
38+
uart22_sleep: uart22_sleep {
39+
group1 {
40+
psels = <NRF_PSEL(UART_TX, 1, 9)>,
41+
<NRF_PSEL(UART_RX, 1, 11)>;
42+
low-power-enable;
43+
};
44+
};
45+
};
46+
47+
dut_uart_a: &uart21 {
48+
status = "okay";
49+
current-speed = <115200>;
50+
pinctrl-0 = <&uart21_default>;
51+
pinctrl-1 = <&uart21_sleep>;
52+
pinctrl-names = "default", "sleep";
53+
};
54+
55+
dut_uart_b: &uart22 {
56+
status = "okay";
57+
current-speed = <115200>;
58+
pinctrl-0 = <&uart22_default>;
59+
pinctrl-1 = <&uart22_sleep>;
60+
pinctrl-names = "default", "sleep";
61+
};
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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.13
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, 23)>;
18+
bias-pull-up;
19+
};
20+
};
21+
22+
uart21_sleep: uart21_sleep {
23+
group1 {
24+
psels = <NRF_PSEL(UART_TX, 1, 13)>,
25+
<NRF_PSEL(UART_RX, 1, 23)>;
26+
low-power-enable;
27+
};
28+
};
29+
30+
uart22_default: uart22_default {
31+
group1 {
32+
psels = <NRF_PSEL(UART_TX, 1, 24)>,
33+
<NRF_PSEL(UART_RX, 1, 14)>;
34+
bias-pull-up;
35+
};
36+
};
37+
38+
uart22_sleep: uart22_sleep {
39+
group1 {
40+
psels = <NRF_PSEL(UART_TX, 1, 24)>,
41+
<NRF_PSEL(UART_RX, 1, 14)>;
42+
low-power-enable;
43+
};
44+
};
45+
};
46+
47+
dut_uart_a: &uart21 {
48+
status = "okay";
49+
current-speed = <115200>;
50+
pinctrl-0 = <&uart21_default>;
51+
pinctrl-1 = <&uart21_sleep>;
52+
pinctrl-names = "default", "sleep";
53+
};
54+
55+
dut_uart_b: &uart22 {
56+
status = "okay";
57+
current-speed = <115200>;
58+
pinctrl-0 = <&uart22_default>;
59+
pinctrl-1 = <&uart22_sleep>;
60+
pinctrl-names = "default", "sleep";
61+
};
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_USE_RUNTIME_CONFIGURE=y
3+
4+
CONFIG_ZTEST=y
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include "common.h"
8+
9+
const struct device *const uart_dev_async_mode = DEVICE_DT_GET(UART_NODE_MODE_A);
10+
const struct device *const uart_dev_int_mode = DEVICE_DT_GET(UART_NODE_MODE_B);
11+
12+
extern struct k_sem uart_async_mode_rx_ready_sem;
13+
extern struct k_sem uart_interrupt_mode_rx_done_sem;
14+
15+
extern uint8_t uart_a_tx_test_buffer[BUFFER_SIZE];
16+
extern uint8_t uart_a_rx_test_buffer[BUFFER_SIZE];
17+
extern uint8_t uart_b_tx_test_buffer[BUFFER_SIZE];
18+
extern uint8_t uart_b_rx_test_buffer[BUFFER_SIZE];
19+
20+
extern volatile uint32_t tx_byte_offset;
21+
extern volatile uint32_t rx_byte_offset;
22+
23+
ZTEST(uart_async_int, test_uart_async_int_transmission)
24+
{
25+
int err, rx_done_async_sem_take_result, rx_done_int_sem_take_result;
26+
uint32_t sleep_time_ms = 0;
27+
uart_test_data uart_async_test_data;
28+
uart_test_data uart_int_test_data;
29+
30+
tx_byte_offset = 0;
31+
rx_byte_offset = 0;
32+
33+
uart_async_test_data.tx_buffer = uart_a_tx_test_buffer;
34+
uart_async_test_data.rx_buffer = uart_a_rx_test_buffer;
35+
uart_async_test_data.buffer_size = BUFFER_SIZE;
36+
37+
uart_int_test_data.tx_buffer = uart_b_tx_test_buffer;
38+
uart_int_test_data.rx_buffer = uart_b_rx_test_buffer;
39+
uart_int_test_data.buffer_size = BUFFER_SIZE;
40+
41+
set_test_pattern(&uart_async_test_data);
42+
set_test_pattern(&uart_int_test_data);
43+
44+
TC_PRINT("UART full duplex transmission test: UART (ASYNC) <-> UART (INT)\n");
45+
46+
err = uart_callback_set(uart_dev_async_mode, async_uart_callback, NULL);
47+
zassert_equal(err, 0, "ASYNC UART callback setup failed");
48+
49+
err = uart_irq_callback_set(uart_dev_int_mode, uart_isr_handler);
50+
zassert_equal(err, 0, "Unexpected error when setting callback for INT UART: %d", err);
51+
err = uart_irq_callback_user_data_set(uart_dev_int_mode, uart_isr_handler,
52+
(void *)&uart_int_test_data);
53+
zassert_equal(err, 0,
54+
"Unexpected error when setting user data for callback for INT UART: %d", err);
55+
56+
TC_PRINT("Starting transmission\n");
57+
enable_uart_rx(uart_dev_async_mode, &uart_async_test_data);
58+
uart_irq_rx_enable(uart_dev_int_mode);
59+
60+
uart_irq_tx_enable(uart_dev_int_mode);
61+
err = uart_tx(uart_dev_async_mode, uart_async_test_data.tx_buffer, BUFFER_SIZE,
62+
UART_TIMEOUT_US);
63+
64+
TC_PRINT("Waiting for transmission to finish\n");
65+
while (1) {
66+
rx_done_async_sem_take_result =
67+
k_sem_take(&uart_async_mode_rx_ready_sem, K_NO_WAIT);
68+
rx_done_int_sem_take_result =
69+
k_sem_take(&uart_interrupt_mode_rx_done_sem, K_NO_WAIT);
70+
if ((rx_done_async_sem_take_result + rx_done_int_sem_take_result) == 0) {
71+
TC_PRINT("Full duplex transmission completed\n");
72+
break;
73+
}
74+
k_msleep(SEM_CHECK_DEAD_TIME_MS);
75+
sleep_time_ms += SEM_CHECK_DEAD_TIME_MS;
76+
zassert_true(sleep_time_ms < TRANSMISSION_TIMEOUT_MS, "Transmission timed out\n");
77+
}
78+
uart_rx_disable(uart_dev_async_mode);
79+
uart_irq_rx_disable(uart_dev_int_mode);
80+
uart_irq_tx_disable(uart_dev_int_mode);
81+
zassert_mem_equal(uart_async_test_data.rx_buffer, uart_int_test_data.rx_buffer, BUFFER_SIZE,
82+
"UART (ASYNC) RX buffer != UART (INT) RX buffer\n");
83+
}
84+
85+
void *test_setup(void)
86+
{
87+
zassert_true(device_is_ready(uart_dev_async_mode), "UART in ASYNC mode is not ready");
88+
zassert_true(device_is_ready(uart_dev_int_mode), "UART in INTERRUPT mode is not ready");
89+
90+
return NULL;
91+
}
92+
93+
ZTEST_SUITE(uart_async_int, NULL, test_setup, NULL, NULL, NULL);

0 commit comments

Comments
 (0)