From b82946fba7ae854afc9b8842253d3cea86a7aa61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20G=C5=82=C4=85b?= Date: Tue, 21 May 2024 08:07:22 +0200 Subject: [PATCH] tests: drivers: spi: spi_slave: Extend test scope MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add possibility to test all four SPI modes (CPOL, CPHA). Add possibility to test different bitrates. Add tests that checks handling of zero length buffers on master. Signed-off-by: Sebastian Głąb --- tests/drivers/spi/spi_slave/Kconfig | 14 +++++ tests/drivers/spi/spi_slave/README.txt | 9 +++ .../drivers/spi/spi_slave/boards/1mhz.overlay | 9 +++ .../spi/spi_slave/boards/250khz.overlay | 9 +++ .../drivers/spi/spi_slave/boards/2mhz.overlay | 9 +++ .../drivers/spi/spi_slave/boards/4mhz.overlay | 9 +++ .../spi/spi_slave/boards/500khz.overlay | 9 +++ .../drivers/spi/spi_slave/boards/8mhz.overlay | 9 +++ .../boards/nrf52840dk_nrf52840.overlay | 1 - .../boards/nrf54h20dk_nrf54h20_common.dtsi | 1 - .../nrf54l15pdk_nrf54l15_cpuapp.overlay | 1 - tests/drivers/spi/spi_slave/src/main.c | 63 ++++++++++++++++++- tests/drivers/spi/spi_slave/testcase.yaml | 52 +++++++++++---- 13 files changed, 180 insertions(+), 15 deletions(-) create mode 100644 tests/drivers/spi/spi_slave/Kconfig create mode 100644 tests/drivers/spi/spi_slave/README.txt create mode 100644 tests/drivers/spi/spi_slave/boards/1mhz.overlay create mode 100644 tests/drivers/spi/spi_slave/boards/250khz.overlay create mode 100644 tests/drivers/spi/spi_slave/boards/2mhz.overlay create mode 100644 tests/drivers/spi/spi_slave/boards/4mhz.overlay create mode 100644 tests/drivers/spi/spi_slave/boards/500khz.overlay create mode 100644 tests/drivers/spi/spi_slave/boards/8mhz.overlay diff --git a/tests/drivers/spi/spi_slave/Kconfig b/tests/drivers/spi/spi_slave/Kconfig new file mode 100644 index 00000000000..f6472dae4ab --- /dev/null +++ b/tests/drivers/spi/spi_slave/Kconfig @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +config TESTED_SPI_MODE + int "SPI mode" + default 0 + help + SPI mode value (clock polarity and phase) used in the test. + 0: CPOL 0 (Active high), CPHA 0 (leading) + 1: CPOL 0 (Active high), CPHA 1 (trailing) + 2: CPOL 1 (Active low), CPHA 0 (leading) + 3: CPOL 1 (Active low), CPHA 1 (trailing) + +source "Kconfig.zephyr" diff --git a/tests/drivers/spi/spi_slave/README.txt b/tests/drivers/spi/spi_slave/README.txt new file mode 100644 index 00000000000..9e3ad6af857 --- /dev/null +++ b/tests/drivers/spi/spi_slave/README.txt @@ -0,0 +1,9 @@ +In this test suite two instances of the SPI peripheral are connected together. +One SPI instance works as a master, second one is configured as a slave. +In each test, both instances get identical configuration (CPOL, CPHA, bitrate, etc.). + +Four GPIO loopbacks are required (see overlay for nrf54l15pdk for reference): +1. spi22-SPIM_SCK connected with spi21-SPIS_SCK, +2. spi22-SPIM_MISO connected with spi21-SPIS_MISO, +3. spi22-SPIM_MOSI connected with spi21-SPIS_MOSI, +4. spi22-cs-gpios connected with spi21-SPIS_CSN. diff --git a/tests/drivers/spi/spi_slave/boards/1mhz.overlay b/tests/drivers/spi/spi_slave/boards/1mhz.overlay new file mode 100644 index 00000000000..122560db919 --- /dev/null +++ b/tests/drivers/spi/spi_slave/boards/1mhz.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&dut_spi_dt { + spi-max-frequency = <1000000>; +}; diff --git a/tests/drivers/spi/spi_slave/boards/250khz.overlay b/tests/drivers/spi/spi_slave/boards/250khz.overlay new file mode 100644 index 00000000000..6f7af9550cd --- /dev/null +++ b/tests/drivers/spi/spi_slave/boards/250khz.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&dut_spi_dt { + spi-max-frequency = <250000>; +}; diff --git a/tests/drivers/spi/spi_slave/boards/2mhz.overlay b/tests/drivers/spi/spi_slave/boards/2mhz.overlay new file mode 100644 index 00000000000..beb35595a40 --- /dev/null +++ b/tests/drivers/spi/spi_slave/boards/2mhz.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&dut_spi_dt { + spi-max-frequency = <2000000>; +}; diff --git a/tests/drivers/spi/spi_slave/boards/4mhz.overlay b/tests/drivers/spi/spi_slave/boards/4mhz.overlay new file mode 100644 index 00000000000..4dc3aebb684 --- /dev/null +++ b/tests/drivers/spi/spi_slave/boards/4mhz.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&dut_spi_dt { + spi-max-frequency = <4000000>; +}; diff --git a/tests/drivers/spi/spi_slave/boards/500khz.overlay b/tests/drivers/spi/spi_slave/boards/500khz.overlay new file mode 100644 index 00000000000..91b430f726a --- /dev/null +++ b/tests/drivers/spi/spi_slave/boards/500khz.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&dut_spi_dt { + spi-max-frequency = <500000>; +}; diff --git a/tests/drivers/spi/spi_slave/boards/8mhz.overlay b/tests/drivers/spi/spi_slave/boards/8mhz.overlay new file mode 100644 index 00000000000..79d1815459d --- /dev/null +++ b/tests/drivers/spi/spi_slave/boards/8mhz.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&dut_spi_dt { + spi-max-frequency = <8000000>; +}; diff --git a/tests/drivers/spi/spi_slave/boards/nrf52840dk_nrf52840.overlay b/tests/drivers/spi/spi_slave/boards/nrf52840dk_nrf52840.overlay index 477917e0ca7..97802a7a637 100644 --- a/tests/drivers/spi/spi_slave/boards/nrf52840dk_nrf52840.overlay +++ b/tests/drivers/spi/spi_slave/boards/nrf52840dk_nrf52840.overlay @@ -53,7 +53,6 @@ dut_spi_dt: test-spi-dev@0 { compatible = "vnd,spi-device"; reg = <0>; - spi-max-frequency = <4000000>; }; }; diff --git a/tests/drivers/spi/spi_slave/boards/nrf54h20dk_nrf54h20_common.dtsi b/tests/drivers/spi/spi_slave/boards/nrf54h20dk_nrf54h20_common.dtsi index 0a9425cc2f9..359a5ef600d 100644 --- a/tests/drivers/spi/spi_slave/boards/nrf54h20dk_nrf54h20_common.dtsi +++ b/tests/drivers/spi/spi_slave/boards/nrf54h20dk_nrf54h20_common.dtsi @@ -63,7 +63,6 @@ dut_spi: &spi130 { dut_spi_dt: test-spi-dev@0 { compatible = "vnd,spi-device"; reg = <0>; - spi-max-frequency = <500000>; }; }; diff --git a/tests/drivers/spi/spi_slave/boards/nrf54l15pdk_nrf54l15_cpuapp.overlay b/tests/drivers/spi/spi_slave/boards/nrf54l15pdk_nrf54l15_cpuapp.overlay index d431f278337..73a50a7c6fc 100644 --- a/tests/drivers/spi/spi_slave/boards/nrf54l15pdk_nrf54l15_cpuapp.overlay +++ b/tests/drivers/spi/spi_slave/boards/nrf54l15pdk_nrf54l15_cpuapp.overlay @@ -57,7 +57,6 @@ dut_spi_dt: test-spi-dev@0 { compatible = "vnd,spi-device"; reg = <0>; - spi-max-frequency = <4000000>; }; }; diff --git a/tests/drivers/spi/spi_slave/src/main.c b/tests/drivers/spi/spi_slave/src/main.c index 5f441480c12..2ad7d509c72 100644 --- a/tests/drivers/spi/spi_slave/src/main.c +++ b/tests/drivers/spi/spi_slave/src/main.c @@ -11,7 +11,17 @@ #include #include -#define SPI_MODE (SPI_MODE_CPOL | SPI_MODE_CPHA | SPI_WORD_SET(8) | SPI_LINES_SINGLE) +#if CONFIG_TESTED_SPI_MODE == 0 +#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_LSB) +#elif CONFIG_TESTED_SPI_MODE == 1 +#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_MSB | SPI_MODE_CPHA) +#elif CONFIG_TESTED_SPI_MODE == 2 +#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_LSB | SPI_MODE_CPOL) +#elif CONFIG_TESTED_SPI_MODE == 3 +#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_MSB | SPI_MODE_CPHA \ + | SPI_MODE_CPOL) +#endif + #define SPIM_OP (SPI_OP_MODE_MASTER | SPI_MODE) #define SPIS_OP (SPI_OP_MODE_SLAVE | SPI_MODE) @@ -247,6 +257,57 @@ ZTEST(spi_slave, test_basic_async) test_basic(true); } +/** Basic test with zero length buffers. + */ +void test_basic_zero_len(bool async) +{ + size_t len = 8; + + /* SPIM */ + tdata.bufs[0].buf = buf_alloc(len, true); + tdata.bufs[0].len = len; + tdata.bufs[1].buf = buf_alloc(len, true); + /* Intentionally len was set to 0 - second buffer "is empty". */ + tdata.bufs[1].len = 0; + tdata.sets[0].buffers = &tdata.bufs[0]; + tdata.sets[0].count = 2; + tdata.mtx_set = &tdata.sets[0]; + + tdata.bufs[2].buf = buf_alloc(len, true); + tdata.bufs[2].len = len; + tdata.bufs[3].buf = buf_alloc(len, true); + /* Intentionally len was set to 0 - second buffer "is empty". */ + tdata.bufs[3].len = 0; + tdata.sets[1].buffers = &tdata.bufs[2]; + tdata.sets[1].count = 2; + tdata.mrx_set = &tdata.sets[1]; + + /* SPIS */ + tdata.bufs[4].buf = buf_alloc(len, false); + tdata.bufs[4].len = len; + tdata.sets[2].buffers = &tdata.bufs[4]; + tdata.sets[2].count = 1; + tdata.stx_set = &tdata.sets[2]; + + tdata.bufs[6].buf = buf_alloc(len, false); + tdata.bufs[6].len = len; + tdata.sets[3].buffers = &tdata.bufs[6]; + tdata.sets[3].count = 1; + tdata.srx_set = &tdata.sets[3]; + + run_test(true, true, async); +} + +ZTEST(spi_slave, test_basic_zero_len) +{ + test_basic_zero_len(false); +} + +ZTEST(spi_slave, test_basic_zero_len_async) +{ + test_basic_zero_len(true); +} + /** Setup a transfer where RX buffer on master and slave are shorter than * TX buffers. RX buffers shall contain beginning of TX data and last TX * bytes that did not fit in the RX buffers shall be lost. diff --git a/tests/drivers/spi/spi_slave/testcase.yaml b/tests/drivers/spi/spi_slave/testcase.yaml index c38b3e72952..2c6f8974fcc 100644 --- a/tests/drivers/spi/spi_slave/testcase.yaml +++ b/tests/drivers/spi/spi_slave/testcase.yaml @@ -1,12 +1,42 @@ +common: + depends_on: spi + tags: drivers spi + harness: ztest + harness_config: + fixture: gpio_spi_loopback + platform_allow: | + nrf52840dk/nrf52840 nrf54l15pdk/nrf54l15/cpuapp nrf54h20dk/nrf54h20/cpuapp + nrf54h20dk/nrf54h20/cpurad + integration_platforms: + - nrf52840dk/nrf52840 + tests: - drivers.spi_slave.api: - depends_on: spi - tags: drivers spi - harness: ztest - harness_config: - fixture: gpio_spi_loopback - platform_allow: | - nrf52840dk/nrf52840 nrf54l15pdk/nrf54l15/cpuapp nrf54h20dk/nrf54h20/cpuapp - nrf54h20dk/nrf54h20/cpurad - integration_platforms: - - nrf52840dk/nrf52840 + drivers.spi.spi_mode0: + extra_configs: + - CONFIG_TESTED_SPI_MODE=0 + extra_args: EXTRA_DTC_OVERLAY_FILE="boards/250khz.overlay" + + drivers.spi.spi_mode1: + extra_configs: + - CONFIG_TESTED_SPI_MODE=1 + extra_args: EXTRA_DTC_OVERLAY_FILE="boards/500khz.overlay" + + drivers.spi.spi_mode2: + extra_configs: + - CONFIG_TESTED_SPI_MODE=2 + extra_args: EXTRA_DTC_OVERLAY_FILE="boards/1mhz.overlay" + + drivers.spi.spi_mode3: + extra_configs: + - CONFIG_TESTED_SPI_MODE=3 + extra_args: EXTRA_DTC_OVERLAY_FILE="boards/2mhz.overlay" + + drivers.spi.spi_4MHz: + extra_configs: + - CONFIG_TESTED_SPI_MODE=2 + extra_args: EXTRA_DTC_OVERLAY_FILE="boards/4mhz.overlay" + + drivers.spi.spi_8MHz: + extra_configs: + - CONFIG_TESTED_SPI_MODE=1 + extra_args: EXTRA_DTC_OVERLAY_FILE="boards/8mhz.overlay"