diff --git a/CODEOWNERS b/CODEOWNERS index 5db235f28057..42e7330b5c7d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -871,6 +871,7 @@ /tests/drivers/pwm/ @nrfconnect/ncs-low-level-test /tests/drivers/qdec/ @nrfconnect/ncs-low-level-test /tests/drivers/sensor/multicore_temp/ @nrfconnect/ncs-low-level-test +/tests/drivers/spi/ @nrfconnect/ncs-low-level-test /tests/drivers/timer/grtc_timer_lfrc/ @nrfconnect/ncs-low-level-test /tests/drivers/uart/ @nrfconnect/ncs-low-level-test /tests/drivers/watchdog/ @nrfconnect/ncs-low-level-test diff --git a/scripts/ci/tags.yaml b/scripts/ci/tags.yaml index 28b08851ac3d..ac9362664acc 100644 --- a/scripts/ci/tags.yaml +++ b/scripts/ci/tags.yaml @@ -1365,6 +1365,18 @@ ci_tests_drivers_sqspi: - nrf/tests/zephyr/drivers/flash/common/ - nrfxlib/softperipheral/sQSPI +ci_tests_drivers_spi: + files: + - nrf/tests/drivers/spi/ + - zephyr/drivers/spi/Kconfig.nrfx + - zephyr/drivers/spi/spi_nrfx_spim.c + - zephyr/drivers/spi/spi_nrfx_spis.c + - zephyr/drivers/spi/spi_nrfx_common.c + - zephyr/drivers/spi/spi_nrfx_common.h + - zephyr/modules/hal_nordic/nrfx/Kconfig + - zephyr/modules/hal_nordic/nrfx/nrfx_kconfig.h + - zephyr/soc/nordic/common/Kconfig.peripherals + ci_tests_drivers_gpio: files: - nrf/tests/drivers/gpio/ diff --git a/tests/drivers/spi/spim_instances/CMakeLists.txt b/tests/drivers/spi/spim_instances/CMakeLists.txt new file mode 100644 index 000000000000..1fb677d9f19f --- /dev/null +++ b/tests/drivers/spi/spim_instances/CMakeLists.txt @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(spim_instances) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/tests/drivers/spi/spim_instances/boards/nrf54h20dk_nrf54h20_cpuapp.overlay b/tests/drivers/spi/spim_instances/boards/nrf54h20dk_nrf54h20_cpuapp.overlay new file mode 100644 index 000000000000..dc5b4e780c4c --- /dev/null +++ b/tests/drivers/spi/spim_instances/boards/nrf54h20dk_nrf54h20_cpuapp.overlay @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2025 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +&pinctrl { + spi120_default_test: spi120_default_test { + group1 { + psels = ; + }; + + group2 { + psels = , + ; + nordic,drive-mode = ; + }; + }; + + spi120_sleep_test: spi120_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi121_default_test: spi121_default_test { + group1 { + psels = ; + }; + + group2 { + psels = , + ; + nordic,drive-mode = ; + }; + }; + + spi121_sleep_test: spi121_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi130_default_test: spi130_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi130_sleep_test: spi130_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi131_default_test: spi131_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi131_sleep_test: spi131_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi132_default_test: spi132_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi132_sleep_test: spi132_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi133_default_test: spi133_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi133_sleep_test: spi133_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi134_default_test: spi134_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi134_sleep_test: spi134_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi135_default_test: spi135_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi135_sleep_test: spi135_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi137_default_test: spi137_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi137_sleep_test: spi137_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + +&exmif { + status = "disabled"; +}; + +&dma_fast_region { + status = "okay"; +}; + +&nfct { + status = "disabled"; + nfct-pins-as-gpios; +}; + +&spi120 { + status = "okay"; + pinctrl-0 = <&spi120_default_test>; + pinctrl-1 = <&spi120_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&dma_fast_region>; +}; + +&spi121 { + status = "okay"; + pinctrl-0 = <&spi121_default_test>; + pinctrl-1 = <&spi121_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&dma_fast_region>; +}; + +&spi130 { + status = "okay"; + pinctrl-0 = <&spi130_default_test>; + pinctrl-1 = <&spi130_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&cpuapp_dma_region>; +}; + +&spi131 { + status = "okay"; + pinctrl-0 = <&spi131_default_test>; + pinctrl-1 = <&spi131_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&cpuapp_dma_region>; +}; + +&spi132 { + status = "okay"; + pinctrl-0 = <&spi132_default_test>; + pinctrl-1 = <&spi132_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&cpuapp_dma_region>; +}; + +&spi133 { + status = "okay"; + pinctrl-0 = <&spi133_default_test>; + pinctrl-1 = <&spi133_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&cpuapp_dma_region>; +}; + +&spi134 { + status = "okay"; + pinctrl-0 = <&spi134_default_test>; + pinctrl-1 = <&spi134_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&cpuapp_dma_region>; +}; + +&spi135 { + status = "okay"; + pinctrl-0 = <&spi135_default_test>; + pinctrl-1 = <&spi135_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&cpuapp_dma_region>; +}; + +/* spi136 inaccessible due to console on uart136 */ + +&spi137 { + status = "okay"; + pinctrl-0 = <&spi137_default_test>; + pinctrl-1 = <&spi137_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; + memory-regions = <&cpuapp_dma_region>; +}; diff --git a/tests/drivers/spi/spim_instances/boards/nrf54l15dk_nrf54l15_cpuapp.overlay b/tests/drivers/spi/spim_instances/boards/nrf54l15dk_nrf54l15_cpuapp.overlay new file mode 100644 index 000000000000..1787586e842d --- /dev/null +++ b/tests/drivers/spi/spim_instances/boards/nrf54l15dk_nrf54l15_cpuapp.overlay @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2025 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +&pinctrl { + spi00_default_test: spi00_default_test { + group1 { + psels = ; + }; + + group2 { + psels = , + ; + nordic,drive-mode = ; + }; + }; + + spi00_sleep_test: spi00_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi21_default_test: spi21_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi21_sleep_test: spi21_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi22_default_test: spi22_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi22_sleep_test: spi22_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi30_default_test: spi30_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi30_sleep_test: spi30_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + +/delete-node/ &mx25r64; + +&spi00 { + status = "okay"; + pinctrl-0 = <&spi00_default_test>; + pinctrl-1 = <&spi00_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +/* spi20 inaccessible due to console on uart20 */ + +&spi21 { + status = "okay"; + pinctrl-0 = <&spi21_default_test>; + pinctrl-1 = <&spi21_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi22 { + status = "okay"; + pinctrl-0 = <&spi22_default_test>; + pinctrl-1 = <&spi22_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi30 { + status = "okay"; + pinctrl-0 = <&spi30_default_test>; + pinctrl-1 = <&spi30_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; diff --git a/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp.overlay b/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp.overlay new file mode 100644 index 000000000000..62b7811ca6f0 --- /dev/null +++ b/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp.overlay @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2025 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +&pinctrl { + spi00_default_test: spi00_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi00_sleep_test: spi00_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi21_default_test: spi21_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi21_sleep_test: spi21_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi22_default_test: spi22_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi22_sleep_test: spi22_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi23_default_test: spi23_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi23_sleep_test: spi23_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi24_default_test: spi24_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi24_sleep_test: spi24_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi30_default_test: spi30_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi30_sleep_test: spi30_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + +/delete-node/ &mx25r64; + +&spi00 { + status = "okay"; + pinctrl-0 = <&spi00_default_test>; + pinctrl-1 = <&spi00_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +/* spi20 inaccessible due to console on uart20 */ + +&spi21 { + status = "okay"; + pinctrl-0 = <&spi21_default_test>; + pinctrl-1 = <&spi21_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi22 { + status = "okay"; + pinctrl-0 = <&spi22_default_test>; + pinctrl-1 = <&spi22_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi23 { + status = "okay"; + pinctrl-0 = <&spi23_default_test>; + pinctrl-1 = <&spi23_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi24 { + status = "okay"; + pinctrl-0 = <&spi24_default_test>; + pinctrl-1 = <&spi24_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi30 { + status = "okay"; + pinctrl-0 = <&spi30_default_test>; + pinctrl-1 = <&spi30_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; diff --git a/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp_0_0_0.overlay b/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp_0_0_0.overlay new file mode 100644 index 000000000000..ad3f5ed9bdb2 --- /dev/null +++ b/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp_0_0_0.overlay @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2025 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +&pinctrl { + spi00_default_test: spi00_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi00_sleep_test: spi00_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi21_default_test: spi21_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi21_sleep_test: spi21_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi22_default_test: spi22_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi22_sleep_test: spi22_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi23_default_test: spi23_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi23_sleep_test: spi23_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi24_default_test: spi24_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi24_sleep_test: spi24_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi30_default_test: spi30_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi30_sleep_test: spi30_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + +&spi00 { + status = "okay"; + pinctrl-0 = <&spi00_default_test>; + pinctrl-1 = <&spi00_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +/* spi20 inaccessible due to console on uart20 */ + +&spi21 { + status = "okay"; + pinctrl-0 = <&spi21_default_test>; + pinctrl-1 = <&spi21_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi22 { + status = "okay"; + pinctrl-0 = <&spi22_default_test>; + pinctrl-1 = <&spi22_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi23 { + status = "okay"; + pinctrl-0 = <&spi23_default_test>; + pinctrl-1 = <&spi23_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi24 { + status = "okay"; + pinctrl-0 = <&spi24_default_test>; + pinctrl-1 = <&spi24_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi30 { + status = "okay"; + pinctrl-0 = <&spi30_default_test>; + pinctrl-1 = <&spi30_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; diff --git a/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp_0_2_0_csp.overlay b/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp_0_2_0_csp.overlay new file mode 100644 index 000000000000..871e4bc6b7e0 --- /dev/null +++ b/tests/drivers/spi/spim_instances/boards/nrf54lm20pdk_nrf54lm20a_cpuapp_0_2_0_csp.overlay @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2025 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +&pinctrl { + spi00_default_test: spi00_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi00_sleep_test: spi00_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi21_default_test: spi21_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi21_sleep_test: spi21_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi22_default_test: spi22_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi22_sleep_test: spi22_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi23_default_test: spi23_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi23_sleep_test: spi23_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi24_default_test: spi24_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi24_sleep_test: spi24_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi30_default_test: spi30_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi30_sleep_test: spi30_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + +&uicr { + nfct-pins-as-gpios; +}; + +&spi00 { + status = "okay"; + pinctrl-0 = <&spi00_default_test>; + pinctrl-1 = <&spi00_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +/* spi20 inaccessible due to console on uart20 */ + +&spi21 { + status = "okay"; + pinctrl-0 = <&spi21_default_test>; + pinctrl-1 = <&spi21_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi22 { + status = "okay"; + pinctrl-0 = <&spi22_default_test>; + pinctrl-1 = <&spi22_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi23 { + status = "okay"; + pinctrl-0 = <&spi23_default_test>; + pinctrl-1 = <&spi23_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi24 { + status = "okay"; + pinctrl-0 = <&spi24_default_test>; + pinctrl-1 = <&spi24_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi30 { + status = "okay"; + pinctrl-0 = <&spi30_default_test>; + pinctrl-1 = <&spi30_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; diff --git a/tests/drivers/spi/spim_instances/boards/nrf54lv10dk_nrf54lv10a_cpuapp.overlay b/tests/drivers/spi/spim_instances/boards/nrf54lv10dk_nrf54lv10a_cpuapp.overlay new file mode 100644 index 000000000000..66ba1b64ac0c --- /dev/null +++ b/tests/drivers/spi/spim_instances/boards/nrf54lv10dk_nrf54lv10a_cpuapp.overlay @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2025 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +&pinctrl { + spi20_default_test: spi20_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi20_sleep_test: spi20_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi21_default_test: spi21_default_test { + group1 { + psels = , + , + ; + }; + }; + + spi21_sleep_test: spi21_sleep_test { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + +&spi20 { + status = "okay"; + pinctrl-0 = <&spi20_default_test>; + pinctrl-1 = <&spi20_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +&spi21 { + status = "okay"; + pinctrl-0 = <&spi21_default_test>; + pinctrl-1 = <&spi21_sleep_test>; + pinctrl-names = "default", "sleep"; + overrun-character = <0x00>; +}; + +/* spi30 inaccessible due to console on uart30 */ diff --git a/tests/drivers/spi/spim_instances/prj.conf b/tests/drivers/spi/spim_instances/prj.conf new file mode 100644 index 000000000000..796eb0ec361c --- /dev/null +++ b/tests/drivers/spi/spim_instances/prj.conf @@ -0,0 +1,4 @@ +CONFIG_ZTEST=y +CONFIG_TEST_USERSPACE=y +CONFIG_SPI=y +CONFIG_LOG=y diff --git a/tests/drivers/spi/spim_instances/src/spim_instances.c b/tests/drivers/spi/spim_instances/src/spim_instances.c new file mode 100644 index 000000000000..467b2c2d401e --- /dev/null +++ b/tests/drivers/spi/spim_instances/src/spim_instances.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2025, Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +#include +#include +#include + +#include +LOG_MODULE_REGISTER(test); + +#define DEVICE_DT_GET_AND_COMMA(node_id) DEVICE_DT_GET(node_id), +/* Generate a list of devices for all instances of the "compat" */ +#define DEVS_FOR_DT_COMPAT(compat) \ + DT_FOREACH_STATUS_OKAY(compat, DEVICE_DT_GET_AND_COMMA) + +static const struct device *const devices[] = { +#ifdef CONFIG_NRFX_SPIM + DEVS_FOR_DT_COMPAT(nordic_nrf_spim) +#endif +}; + +typedef void (*test_func_t)(const struct device *dev); +typedef bool (*capability_func_t)(const struct device *dev); + + +#define DATA_FIELD (16) + +#define MEMORY_SECTION(node) \ + COND_CODE_1(DT_NODE_HAS_PROP(node, memory_regions), \ + (__attribute__((__section__( \ + LINKER_DT_NODE_REGION_NAME(DT_PHANDLE(node, memory_regions)))))), \ + ()) + +static struct spi_config default_spi_cfg = { + .frequency = 4000000, + .operation = (SPI_OP_MODE_MASTER | SPI_MODE_CPOL | SPI_WORD_SET(8) | SPI_LINES_SINGLE), +}; + +static void setup_instance(const struct device *dev) +{ + /* Left for future test expansion. */ +} + +static void tear_down_instance(const struct device *dev) +{ + /* Left for future test expansion. */ +} + +static void test_all_instances(test_func_t func, capability_func_t capability_check) +{ + int devices_skipped = 0; + + zassert_true(ARRAY_SIZE(devices) > 0, "No device found"); + for (int i = 0; i < ARRAY_SIZE(devices); i++) { + setup_instance(devices[i]); + TC_PRINT("\nInstance %u: ", i + 1); + if ((capability_check == NULL) || + capability_check(devices[i])) { + TC_PRINT("Testing %s\n", devices[i]->name); + func(devices[i]); + } else { + TC_PRINT("Skipped for %s\n", devices[i]->name); + devices_skipped++; + } + tear_down_instance(devices[i]); + /* Allow logs to be printed. */ + k_sleep(K_MSEC(100)); + } + if (devices_skipped == ARRAY_SIZE(devices)) { + ztest_test_skip(); + } +} + + +/** + * Test validates if instance can transceive data. + */ +static void test_transceive_data_instance(const struct device *dev) +{ + uint8_t spim_buffer[2 * DATA_FIELD] MEMORY_SECTION(DT_BUS(dev)); + int ret = 0; + + /* SPI buffer sets */ + struct spi_buf tx_spi_buf = {.buf = &spim_buffer[0], .len = DATA_FIELD}; + struct spi_buf_set tx_spi_buf_set = {.buffers = &tx_spi_buf, .count = 1}; + + struct spi_buf rx_spi_buf = {.buf = &spim_buffer[DATA_FIELD], + .len = DATA_FIELD}; + struct spi_buf_set rx_spi_buf_set = {.buffers = &rx_spi_buf, .count = 1}; + + ret = spi_transceive(dev, &default_spi_cfg, &tx_spi_buf_set, &rx_spi_buf_set); + + zassert_equal(0, ret, "%s: Unexpected error", dev->name); +} + +static bool test_transceive_data_capable(const struct device *dev) +{ + return true; +} + +ZTEST(spim_instances, test_transceive_data) +{ + test_all_instances(test_transceive_data_instance, test_transceive_data_capable); +} + +static void *suite_setup(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(devices); i++) { + zassert_true(device_is_ready(devices[i]), + "Device %s is not ready", devices[i]->name); + k_object_access_grant(devices[i], k_current_get()); + } + + return NULL; +} + +ZTEST_SUITE(spim_instances, NULL, suite_setup, NULL, NULL, NULL); diff --git a/tests/drivers/spi/spim_instances/testcase.yaml b/tests/drivers/spi/spim_instances/testcase.yaml new file mode 100644 index 000000000000..d9a7a376e322 --- /dev/null +++ b/tests/drivers/spi/spim_instances/testcase.yaml @@ -0,0 +1,24 @@ +common: + tags: + - drivers + - ci_tests_drivers_spi + harness: ztest + timeout: 20 + +tests: + drivers.spi.spim_instances: + platform_allow: + - nrf54h20dk/nrf54h20/cpuapp + - nrf54l15dk/nrf54l15/cpuapp + - nrf54lm20pdk/nrf54lm20a/cpuapp + - nrf54lm20pdk@0.0.0/nrf54lm20a/cpuapp + - nrf54lm20pdk@0.2.0/nrf54lm20a/cpuapp + - nrf54lm20pdk@0.2.0.csp/nrf54lm20a/cpuapp + - nrf54lv10dk/nrf54lv10a/cpuapp + - nrf54lv10dk@0.0.0/nrf54lv10a/cpuapp + - nrf54lv10dk@0.2.0/nrf54lv10a/cpuapp + integration_platforms: + - nrf54h20dk/nrf54h20/cpuapp + - nrf54l15dk/nrf54l15/cpuapp + - nrf54lm20pdk/nrf54lm20a/cpuapp + - nrf54lv10dk/nrf54lv10a/cpuapp