Browse Source

tests/samples: drivers: create test, sample for SENT driver

Create test, sample for SENT driver

Signed-off-by: Cong Nguyen Huu <cong.nguyenhuu@nxp.com>
pull/89637/merge
Cong Nguyen Huu 9 months ago committed by Dan Kalowsky
parent
commit
1a3f46ce6e
  1. 8
      samples/drivers/sent/CMakeLists.txt
  2. 31
      samples/drivers/sent/README.rst
  3. 38
      samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu0.overlay
  4. 7
      samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu1.overlay
  5. 3
      samples/drivers/sent/prj.conf
  6. 11
      samples/drivers/sent/sample.yaml
  7. 87
      samples/drivers/sent/src/main.c
  8. 9
      tests/drivers/sent/sent_api/CMakeLists.txt
  9. 38
      tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu0.overlay
  10. 7
      tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu1.overlay
  11. 2
      tests/drivers/sent/sent_api/prj.conf
  12. 123
      tests/drivers/sent/sent_api/src/main.c
  13. 7
      tests/drivers/sent/sent_api/testcase.yaml

8
samples/drivers/sent/CMakeLists.txt

@ -0,0 +1,8 @@ @@ -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)

31
samples/drivers/sent/README.rst

@ -0,0 +1,31 @@ @@ -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 <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

38
samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu0.overlay

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <dt-bindings/sent/sent.h>
/ {
aliases {
sent0 = &sent1;
};
};
&pinctrl {
sent1_default: sent1_default {
group1 {
pinmux = <PK2_SENT_1_CH1_I>;
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 = <FAST_CRC_RECOMMENDED_IMPLEMENTATION>;
short-serial-crc = <SHORT_CRC_RECOMMENDED_IMPLEMENTATION>;
status = "okay";
};

7
samples/drivers/sent/boards/s32z2xxdc2_s32z270_rtu1.overlay

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "s32z2xxdc2_s32z270_rtu0.overlay"

3
samples/drivers/sent/prj.conf

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
CONFIG_SENT=y
CONFIG_SENT_LOG_LEVEL_DBG=y
CONFIG_LOG=y

11
samples/drivers/sent/sample.yaml

@ -0,0 +1,11 @@ @@ -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

87
samples/drivers/sent/src/main.c

@ -0,0 +1,87 @@ @@ -0,0 +1,87 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(sent_sample, LOG_LEVEL_DBG);
#include <zephyr/kernel.h>
#include <zephyr/drivers/sent/sent.h>
#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;
}

9
tests/drivers/sent/sent_api/CMakeLists.txt

@ -0,0 +1,9 @@ @@ -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})

38
tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu0.overlay

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <dt-bindings/sent/sent.h>
/ {
aliases {
sent0 = &sent1;
};
};
&pinctrl {
sent1_default: sent1_default {
group1 {
pinmux = <PK2_SENT_1_CH1_I>;
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 = <FAST_CRC_RECOMMENDED_IMPLEMENTATION>;
short-serial-crc = <SHORT_CRC_RECOMMENDED_IMPLEMENTATION>;
status = "okay";
};

7
tests/drivers/sent/sent_api/boards/s32z2xxdc2_s32z270_rtu1.overlay

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "s32z2xxdc2_s32z270_rtu0.overlay"

2
tests/drivers/sent/sent_api/prj.conf

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
CONFIG_ZTEST=y
CONFIG_SENT=y

123
tests/drivers/sent/sent_api/src/main.c

@ -0,0 +1,123 @@ @@ -0,0 +1,123 @@
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/ztest.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sent/sent.h>
#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);

7
tests/drivers/sent/sent_api/testcase.yaml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
tests:
drivers.sent:
tags:
- drivers
- sent
depends_on: sent
filter: dt_alias_exists("sent0")
Loading…
Cancel
Save