From 1a3f46ce6e41c98f710eaad2fdbfaa68ed8f051c Mon Sep 17 00:00:00 2001 From: Cong Nguyen Huu Date: Tue, 15 Oct 2024 17:07:39 +0700 Subject: [PATCH] tests/samples: drivers: create test, sample for SENT driver Create test, sample for SENT driver Signed-off-by: Cong Nguyen Huu --- samples/drivers/sent/CMakeLists.txt | 8 ++ samples/drivers/sent/README.rst | 31 +++++ .../boards/s32z2xxdc2_s32z270_rtu0.overlay | 38 ++++++ .../boards/s32z2xxdc2_s32z270_rtu1.overlay | 7 + samples/drivers/sent/prj.conf | 3 + samples/drivers/sent/sample.yaml | 11 ++ samples/drivers/sent/src/main.c | 87 +++++++++++++ tests/drivers/sent/sent_api/CMakeLists.txt | 9 ++ .../boards/s32z2xxdc2_s32z270_rtu0.overlay | 38 ++++++ .../boards/s32z2xxdc2_s32z270_rtu1.overlay | 7 + tests/drivers/sent/sent_api/prj.conf | 2 + tests/drivers/sent/sent_api/src/main.c | 123 ++++++++++++++++++ tests/drivers/sent/sent_api/testcase.yaml | 7 + 13 files changed, 371 insertions(+) create mode 100644 samples/drivers/sent/CMakeLists.txt create mode 100644 samples/drivers/sent/README.rst create mode 100644 samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu0.overlay create mode 100644 samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu1.overlay create mode 100644 samples/drivers/sent/prj.conf create mode 100644 samples/drivers/sent/sample.yaml create mode 100644 samples/drivers/sent/src/main.c create mode 100644 tests/drivers/sent/sent_api/CMakeLists.txt create mode 100644 tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu0.overlay create mode 100644 tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu1.overlay create mode 100644 tests/drivers/sent/sent_api/prj.conf create mode 100644 tests/drivers/sent/sent_api/src/main.c create mode 100644 tests/drivers/sent/sent_api/testcase.yaml diff --git a/samples/drivers/sent/CMakeLists.txt b/samples/drivers/sent/CMakeLists.txt new file mode 100644 index 00000000000..42e80fb0aad --- /dev/null +++ b/samples/drivers/sent/CMakeLists.txt @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(sent) + +target_sources(app PRIVATE src/main.c) diff --git a/samples/drivers/sent/README.rst b/samples/drivers/sent/README.rst new file mode 100644 index 00000000000..d761b9b2b8b --- /dev/null +++ b/samples/drivers/sent/README.rst @@ -0,0 +1,31 @@ +.. zephyr:code-sample:: sent + :name: SENT interface + :relevant-api: sent_interface + + Use the SENT (Single Edge Nibble Transmission) driver. + +Overview +******** + +The sample application shows how to use the :ref:`SENT API `: + +* Receive data + +Requirements +************ + +This sample requires a SENT sensor to be connected and exposed as ``sent0`` Devicetree alias. + +Building, Flashing and Running +****************************** + +.. zephyr-app-commands:: + :zephyr-app: samples/drivers/sent + :board: s32z2xxdc2/s32z270/rtu0 + :goals: build flash + +Sample Output: + +.. code-block:: console + + Received a frame on channel 1 diff --git a/samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu0.overlay b/samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu0.overlay new file mode 100644 index 00000000000..2ee3906be48 --- /dev/null +++ b/samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu0.overlay @@ -0,0 +1,38 @@ +/* + * Copyright 2025 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +/ { + aliases { + sent0 = &sent1; + }; +}; + +&pinctrl { + sent1_default: sent1_default { + group1 { + pinmux = ; + input-enable; + }; + }; +}; + +&sent1 { + pinctrl-0 = <&sent1_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&sent1_ch1 { + num-data-nibbles = <6>; + clock-tick-length-us = <3>; + successive-calib-pulse-method = <2>; + calib-pulse-tolerance-percent = <20>; + fast-crc = ; + short-serial-crc = ; + status = "okay"; +}; diff --git a/samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu1.overlay b/samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu1.overlay new file mode 100644 index 00000000000..0a3db999430 --- /dev/null +++ b/samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu1.overlay @@ -0,0 +1,7 @@ +/* + * Copyright 2025 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "s32z2xxdc2_s32z270_rtu0.overlay" diff --git a/samples/drivers/sent/prj.conf b/samples/drivers/sent/prj.conf new file mode 100644 index 00000000000..781a30b8d65 --- /dev/null +++ b/samples/drivers/sent/prj.conf @@ -0,0 +1,3 @@ +CONFIG_SENT=y +CONFIG_SENT_LOG_LEVEL_DBG=y +CONFIG_LOG=y diff --git a/samples/drivers/sent/sample.yaml b/samples/drivers/sent/sample.yaml new file mode 100644 index 00000000000..f49aa3c9e93 --- /dev/null +++ b/samples/drivers/sent/sample.yaml @@ -0,0 +1,11 @@ +sample: + name: SENT driver sample + +tests: + sample.drivers.sent: + tags: + - drivers + - sent + depends_on: sent + filter: dt_alias_exists("sent0") + harness: sensor diff --git a/samples/drivers/sent/src/main.c b/samples/drivers/sent/src/main.c new file mode 100644 index 00000000000..8ca9a665dcf --- /dev/null +++ b/samples/drivers/sent/src/main.c @@ -0,0 +1,87 @@ +/* + * Copyright 2025 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +LOG_MODULE_REGISTER(sent_sample, LOG_LEVEL_DBG); + +#include + +#include + +#define SENT_NODE DT_ALIAS(sent0) +#define SENT_CHANNEL 1 +#define SENT_MAX_RX_BUFFER 1 + +struct sent_frame serial_frame[SENT_MAX_RX_BUFFER]; +struct sent_frame fast_frame[SENT_MAX_RX_BUFFER]; + +void rx_serial_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame, + void *user_data) +{ + if (num_frame == SENT_MAX_RX_BUFFER) { + LOG_INF("Received a frame on channel %d, " + "id: %d, data: 0x%X, timestamp: 0x%X", + channel_id, serial_frame->serial.id, serial_frame->serial.data, + serial_frame->timestamp); + } else { + LOG_INF("Error received on channel %d", channel_id); + } +} + +void rx_fast_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame, + void *user_data) +{ + if (num_frame == SENT_MAX_RX_BUFFER) { + LOG_INF("Received a frame on channel %d, " + "data nibble 0: 0x%X, " + "data nibble 1: 0x%X, " + "data nibble 2: 0x%X, " + "data nibble 3: 0x%X, " + "data nibble 4: 0x%X, " + "data nibble 5: 0x%X, " + "timestamp: 0x%X", + channel_id, fast_frame->fast.data_nibbles[0], + fast_frame->fast.data_nibbles[1], fast_frame->fast.data_nibbles[2], + fast_frame->fast.data_nibbles[3], fast_frame->fast.data_nibbles[4], + fast_frame->fast.data_nibbles[5], fast_frame->timestamp); + } else { + LOG_INF("Error received on channel %d", channel_id); + } +} + +struct sent_rx_callback_config serial_cb_cfg = { + .callback = rx_serial_frame_cb, + .frame = &serial_frame[0], + .max_num_frame = SENT_MAX_RX_BUFFER, + .user_data = NULL, +}; + +struct sent_rx_callback_config fast_cb_cfg = { + .callback = rx_fast_frame_cb, + .frame = &fast_frame[0], + .max_num_frame = SENT_MAX_RX_BUFFER, + .user_data = NULL, +}; + +struct sent_rx_callback_configs callback_configs = { + .serial = &serial_cb_cfg, + .fast = &fast_cb_cfg, +}; + +int main(void) +{ + const struct device *const dev = DEVICE_DT_GET(SENT_NODE); + + sent_register_callback(dev, SENT_CHANNEL, callback_configs); + + sent_start_listening(dev, SENT_CHANNEL); + + while (true) { + /* To receive data */ + } + + return 0; +} diff --git a/tests/drivers/sent/sent_api/CMakeLists.txt b/tests/drivers/sent/sent_api/CMakeLists.txt new file mode 100644 index 00000000000..9b3d7f8c433 --- /dev/null +++ b/tests/drivers/sent/sent_api/CMakeLists.txt @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(sent) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu0.overlay b/tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu0.overlay new file mode 100644 index 00000000000..2ee3906be48 --- /dev/null +++ b/tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu0.overlay @@ -0,0 +1,38 @@ +/* + * Copyright 2025 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +/ { + aliases { + sent0 = &sent1; + }; +}; + +&pinctrl { + sent1_default: sent1_default { + group1 { + pinmux = ; + input-enable; + }; + }; +}; + +&sent1 { + pinctrl-0 = <&sent1_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&sent1_ch1 { + num-data-nibbles = <6>; + clock-tick-length-us = <3>; + successive-calib-pulse-method = <2>; + calib-pulse-tolerance-percent = <20>; + fast-crc = ; + short-serial-crc = ; + status = "okay"; +}; diff --git a/tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu1.overlay b/tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu1.overlay new file mode 100644 index 00000000000..0a3db999430 --- /dev/null +++ b/tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu1.overlay @@ -0,0 +1,7 @@ +/* + * Copyright 2025 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "s32z2xxdc2_s32z270_rtu0.overlay" diff --git a/tests/drivers/sent/sent_api/prj.conf b/tests/drivers/sent/sent_api/prj.conf new file mode 100644 index 00000000000..68dae9dffc6 --- /dev/null +++ b/tests/drivers/sent/sent_api/prj.conf @@ -0,0 +1,2 @@ +CONFIG_ZTEST=y +CONFIG_SENT=y diff --git a/tests/drivers/sent/sent_api/src/main.c b/tests/drivers/sent/sent_api/src/main.c new file mode 100644 index 00000000000..bd665bc7c24 --- /dev/null +++ b/tests/drivers/sent/sent_api/src/main.c @@ -0,0 +1,123 @@ +/* + * Copyright 2025 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#define SENT_NODE DT_ALIAS(sent0) +#define SENT_CHANNEL 1 +#define SENT_MAX_RX_BUFFER 1 + +const struct device *sent_dev = DEVICE_DT_GET(SENT_NODE); + +struct sent_frame serial_frame[SENT_MAX_RX_BUFFER]; + +struct sent_frame fast_frame[SENT_MAX_RX_BUFFER]; + +static void *sent_setup(void) +{ + int err; + + zassert_true(device_is_ready(sent_dev), "SENT device is not ready"); + + err = sent_start_listening(sent_dev, SENT_CHANNEL); + zassert_ok(err, "Failed to start rx (err %d)", err); + + return NULL; +} + +void rx_serial_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame, + void *user_data) +{ + ARG_UNUSED(dev); + ARG_UNUSED(channel_id); + ARG_UNUSED(num_frame); + ARG_UNUSED(user_data); +} + +void rx_fast_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame, + void *user_data) +{ + ARG_UNUSED(dev); + ARG_UNUSED(channel_id); + ARG_UNUSED(num_frame); + ARG_UNUSED(user_data); +} + +/** + * @brief Test starting rx is not allowed while started. + */ +ZTEST_USER(sent_api, test_start_listening_while_started) +{ + int err; + + err = sent_start_listening(sent_dev, SENT_CHANNEL); + zassert_not_ok(err, "Started rx while started"); + zassert_equal(err, -EALREADY, "Wrong error return code (err %d)", err); +} + +/** + * @brief Test stopping rx is not allowed while stopped. + */ +ZTEST_USER(sent_api, test_stop_listening_while_stopped) +{ + int err; + + err = sent_stop_listening(sent_dev, SENT_CHANNEL); + zassert_ok(err, "Failed to stop rx (err %d)", err); + + err = sent_stop_listening(sent_dev, SENT_CHANNEL); + zassert_not_ok(err, "Stopped rx while stopped"); + zassert_equal(err, -EALREADY, "Wrong error return code (err %d)", err); + + err = sent_start_listening(sent_dev, SENT_CHANNEL); + zassert_ok(err, "Failed to start rx (err %d)", err); +} + +struct sent_rx_callback_config serial_cb_cfg = { + .callback = rx_serial_frame_cb, + .frame = &serial_frame[0], + .max_num_frame = SENT_MAX_RX_BUFFER, + .user_data = NULL, +}; + +struct sent_rx_callback_config fast_cb_cfg = { + .callback = rx_fast_frame_cb, + .frame = &fast_frame[0], + .max_num_frame = SENT_MAX_RX_BUFFER, + .user_data = NULL, +}; + +struct sent_rx_callback_configs callback_configs = { + .serial = &serial_cb_cfg, + .fast = &fast_cb_cfg, +}; + +/** + * @brief Test setting the rx callback. + */ +ZTEST(sent_api, test_set_rx_callback) +{ + int err; + + err = sent_register_callback(sent_dev, SENT_CHANNEL, callback_configs); + zassert_ok(err, "Failed to set rx callback (err %d)", err); + + callback_configs.serial = NULL; + callback_configs.fast = NULL; + + err = sent_register_callback(sent_dev, SENT_CHANNEL, callback_configs); + zassert_ok(err, "Failed to set rx callback (err %d)", err); + + callback_configs.serial = &serial_cb_cfg; + callback_configs.fast = &fast_cb_cfg; + + err = sent_register_callback(sent_dev, SENT_CHANNEL, callback_configs); + zassert_ok(err, "Failed to set rx callback (err %d)", err); +} + +ZTEST_SUITE(sent_api, NULL, sent_setup, NULL, NULL, NULL); diff --git a/tests/drivers/sent/sent_api/testcase.yaml b/tests/drivers/sent/sent_api/testcase.yaml new file mode 100644 index 00000000000..faaf0fb33e8 --- /dev/null +++ b/tests/drivers/sent/sent_api/testcase.yaml @@ -0,0 +1,7 @@ +tests: + drivers.sent: + tags: + - drivers + - sent + depends_on: sent + filter: dt_alias_exists("sent0")