Skip to content

Commit 1a3f46c

Browse files
congnguyenhuudkalowsk
authored andcommitted
tests/samples: drivers: create test, sample for SENT driver
Create test, sample for SENT driver Signed-off-by: Cong Nguyen Huu <[email protected]>
1 parent c074d20 commit 1a3f46c

File tree

13 files changed

+371
-0
lines changed

13 files changed

+371
-0
lines changed

samples/drivers/sent/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
cmake_minimum_required(VERSION 3.20.0)
4+
5+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
6+
project(sent)
7+
8+
target_sources(app PRIVATE src/main.c)

samples/drivers/sent/README.rst

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
.. zephyr:code-sample:: sent
2+
:name: SENT interface
3+
:relevant-api: sent_interface
4+
5+
Use the SENT (Single Edge Nibble Transmission) driver.
6+
7+
Overview
8+
********
9+
10+
The sample application shows how to use the :ref:`SENT API <sent_api>`:
11+
12+
* Receive data
13+
14+
Requirements
15+
************
16+
17+
This sample requires a SENT sensor to be connected and exposed as ``sent0`` Devicetree alias.
18+
19+
Building, Flashing and Running
20+
******************************
21+
22+
.. zephyr-app-commands::
23+
:zephyr-app: samples/drivers/sent
24+
:board: s32z2xxdc2/s32z270/rtu0
25+
:goals: build flash
26+
27+
Sample Output:
28+
29+
.. code-block:: console
30+
31+
Received a frame on channel 1
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <dt-bindings/sent/sent.h>
8+
9+
/ {
10+
aliases {
11+
sent0 = &sent1;
12+
};
13+
};
14+
15+
&pinctrl {
16+
sent1_default: sent1_default {
17+
group1 {
18+
pinmux = <PK2_SENT_1_CH1_I>;
19+
input-enable;
20+
};
21+
};
22+
};
23+
24+
&sent1 {
25+
pinctrl-0 = <&sent1_default>;
26+
pinctrl-names = "default";
27+
status = "okay";
28+
};
29+
30+
&sent1_ch1 {
31+
num-data-nibbles = <6>;
32+
clock-tick-length-us = <3>;
33+
successive-calib-pulse-method = <2>;
34+
calib-pulse-tolerance-percent = <20>;
35+
fast-crc = <FAST_CRC_RECOMMENDED_IMPLEMENTATION>;
36+
short-serial-crc = <SHORT_CRC_RECOMMENDED_IMPLEMENTATION>;
37+
status = "okay";
38+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include "s32z2xxdc2_s32z270_rtu0.overlay"

samples/drivers/sent/prj.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
CONFIG_SENT=y
2+
CONFIG_SENT_LOG_LEVEL_DBG=y
3+
CONFIG_LOG=y

samples/drivers/sent/sample.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
sample:
2+
name: SENT driver sample
3+
4+
tests:
5+
sample.drivers.sent:
6+
tags:
7+
- drivers
8+
- sent
9+
depends_on: sent
10+
filter: dt_alias_exists("sent0")
11+
harness: sensor

samples/drivers/sent/src/main.c

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/logging/log.h>
8+
LOG_MODULE_REGISTER(sent_sample, LOG_LEVEL_DBG);
9+
10+
#include <zephyr/kernel.h>
11+
12+
#include <zephyr/drivers/sent/sent.h>
13+
14+
#define SENT_NODE DT_ALIAS(sent0)
15+
#define SENT_CHANNEL 1
16+
#define SENT_MAX_RX_BUFFER 1
17+
18+
struct sent_frame serial_frame[SENT_MAX_RX_BUFFER];
19+
struct sent_frame fast_frame[SENT_MAX_RX_BUFFER];
20+
21+
void rx_serial_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame,
22+
void *user_data)
23+
{
24+
if (num_frame == SENT_MAX_RX_BUFFER) {
25+
LOG_INF("Received a frame on channel %d, "
26+
"id: %d, data: 0x%X, timestamp: 0x%X",
27+
channel_id, serial_frame->serial.id, serial_frame->serial.data,
28+
serial_frame->timestamp);
29+
} else {
30+
LOG_INF("Error received on channel %d", channel_id);
31+
}
32+
}
33+
34+
void rx_fast_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame,
35+
void *user_data)
36+
{
37+
if (num_frame == SENT_MAX_RX_BUFFER) {
38+
LOG_INF("Received a frame on channel %d, "
39+
"data nibble 0: 0x%X, "
40+
"data nibble 1: 0x%X, "
41+
"data nibble 2: 0x%X, "
42+
"data nibble 3: 0x%X, "
43+
"data nibble 4: 0x%X, "
44+
"data nibble 5: 0x%X, "
45+
"timestamp: 0x%X",
46+
channel_id, fast_frame->fast.data_nibbles[0],
47+
fast_frame->fast.data_nibbles[1], fast_frame->fast.data_nibbles[2],
48+
fast_frame->fast.data_nibbles[3], fast_frame->fast.data_nibbles[4],
49+
fast_frame->fast.data_nibbles[5], fast_frame->timestamp);
50+
} else {
51+
LOG_INF("Error received on channel %d", channel_id);
52+
}
53+
}
54+
55+
struct sent_rx_callback_config serial_cb_cfg = {
56+
.callback = rx_serial_frame_cb,
57+
.frame = &serial_frame[0],
58+
.max_num_frame = SENT_MAX_RX_BUFFER,
59+
.user_data = NULL,
60+
};
61+
62+
struct sent_rx_callback_config fast_cb_cfg = {
63+
.callback = rx_fast_frame_cb,
64+
.frame = &fast_frame[0],
65+
.max_num_frame = SENT_MAX_RX_BUFFER,
66+
.user_data = NULL,
67+
};
68+
69+
struct sent_rx_callback_configs callback_configs = {
70+
.serial = &serial_cb_cfg,
71+
.fast = &fast_cb_cfg,
72+
};
73+
74+
int main(void)
75+
{
76+
const struct device *const dev = DEVICE_DT_GET(SENT_NODE);
77+
78+
sent_register_callback(dev, SENT_CHANNEL, callback_configs);
79+
80+
sent_start_listening(dev, SENT_CHANNEL);
81+
82+
while (true) {
83+
/* To receive data */
84+
}
85+
86+
return 0;
87+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
cmake_minimum_required(VERSION 3.20.0)
4+
5+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
6+
project(sent)
7+
8+
FILE(GLOB app_sources src/*.c)
9+
target_sources(app PRIVATE ${app_sources})
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <dt-bindings/sent/sent.h>
8+
9+
/ {
10+
aliases {
11+
sent0 = &sent1;
12+
};
13+
};
14+
15+
&pinctrl {
16+
sent1_default: sent1_default {
17+
group1 {
18+
pinmux = <PK2_SENT_1_CH1_I>;
19+
input-enable;
20+
};
21+
};
22+
};
23+
24+
&sent1 {
25+
pinctrl-0 = <&sent1_default>;
26+
pinctrl-names = "default";
27+
status = "okay";
28+
};
29+
30+
&sent1_ch1 {
31+
num-data-nibbles = <6>;
32+
clock-tick-length-us = <3>;
33+
successive-calib-pulse-method = <2>;
34+
calib-pulse-tolerance-percent = <20>;
35+
fast-crc = <FAST_CRC_RECOMMENDED_IMPLEMENTATION>;
36+
short-serial-crc = <SHORT_CRC_RECOMMENDED_IMPLEMENTATION>;
37+
status = "okay";
38+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include "s32z2xxdc2_s32z270_rtu0.overlay"

tests/drivers/sent/sent_api/prj.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
CONFIG_ZTEST=y
2+
CONFIG_SENT=y
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/ztest.h>
8+
#include <zephyr/device.h>
9+
#include <zephyr/drivers/sent/sent.h>
10+
11+
#define SENT_NODE DT_ALIAS(sent0)
12+
#define SENT_CHANNEL 1
13+
#define SENT_MAX_RX_BUFFER 1
14+
15+
const struct device *sent_dev = DEVICE_DT_GET(SENT_NODE);
16+
17+
struct sent_frame serial_frame[SENT_MAX_RX_BUFFER];
18+
19+
struct sent_frame fast_frame[SENT_MAX_RX_BUFFER];
20+
21+
static void *sent_setup(void)
22+
{
23+
int err;
24+
25+
zassert_true(device_is_ready(sent_dev), "SENT device is not ready");
26+
27+
err = sent_start_listening(sent_dev, SENT_CHANNEL);
28+
zassert_ok(err, "Failed to start rx (err %d)", err);
29+
30+
return NULL;
31+
}
32+
33+
void rx_serial_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame,
34+
void *user_data)
35+
{
36+
ARG_UNUSED(dev);
37+
ARG_UNUSED(channel_id);
38+
ARG_UNUSED(num_frame);
39+
ARG_UNUSED(user_data);
40+
}
41+
42+
void rx_fast_frame_cb(const struct device *dev, uint8_t channel_id, uint32_t num_frame,
43+
void *user_data)
44+
{
45+
ARG_UNUSED(dev);
46+
ARG_UNUSED(channel_id);
47+
ARG_UNUSED(num_frame);
48+
ARG_UNUSED(user_data);
49+
}
50+
51+
/**
52+
* @brief Test starting rx is not allowed while started.
53+
*/
54+
ZTEST_USER(sent_api, test_start_listening_while_started)
55+
{
56+
int err;
57+
58+
err = sent_start_listening(sent_dev, SENT_CHANNEL);
59+
zassert_not_ok(err, "Started rx while started");
60+
zassert_equal(err, -EALREADY, "Wrong error return code (err %d)", err);
61+
}
62+
63+
/**
64+
* @brief Test stopping rx is not allowed while stopped.
65+
*/
66+
ZTEST_USER(sent_api, test_stop_listening_while_stopped)
67+
{
68+
int err;
69+
70+
err = sent_stop_listening(sent_dev, SENT_CHANNEL);
71+
zassert_ok(err, "Failed to stop rx (err %d)", err);
72+
73+
err = sent_stop_listening(sent_dev, SENT_CHANNEL);
74+
zassert_not_ok(err, "Stopped rx while stopped");
75+
zassert_equal(err, -EALREADY, "Wrong error return code (err %d)", err);
76+
77+
err = sent_start_listening(sent_dev, SENT_CHANNEL);
78+
zassert_ok(err, "Failed to start rx (err %d)", err);
79+
}
80+
81+
struct sent_rx_callback_config serial_cb_cfg = {
82+
.callback = rx_serial_frame_cb,
83+
.frame = &serial_frame[0],
84+
.max_num_frame = SENT_MAX_RX_BUFFER,
85+
.user_data = NULL,
86+
};
87+
88+
struct sent_rx_callback_config fast_cb_cfg = {
89+
.callback = rx_fast_frame_cb,
90+
.frame = &fast_frame[0],
91+
.max_num_frame = SENT_MAX_RX_BUFFER,
92+
.user_data = NULL,
93+
};
94+
95+
struct sent_rx_callback_configs callback_configs = {
96+
.serial = &serial_cb_cfg,
97+
.fast = &fast_cb_cfg,
98+
};
99+
100+
/**
101+
* @brief Test setting the rx callback.
102+
*/
103+
ZTEST(sent_api, test_set_rx_callback)
104+
{
105+
int err;
106+
107+
err = sent_register_callback(sent_dev, SENT_CHANNEL, callback_configs);
108+
zassert_ok(err, "Failed to set rx callback (err %d)", err);
109+
110+
callback_configs.serial = NULL;
111+
callback_configs.fast = NULL;
112+
113+
err = sent_register_callback(sent_dev, SENT_CHANNEL, callback_configs);
114+
zassert_ok(err, "Failed to set rx callback (err %d)", err);
115+
116+
callback_configs.serial = &serial_cb_cfg;
117+
callback_configs.fast = &fast_cb_cfg;
118+
119+
err = sent_register_callback(sent_dev, SENT_CHANNEL, callback_configs);
120+
zassert_ok(err, "Failed to set rx callback (err %d)", err);
121+
}
122+
123+
ZTEST_SUITE(sent_api, NULL, sent_setup, NULL, NULL, NULL);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
tests:
2+
drivers.sent:
3+
tags:
4+
- drivers
5+
- sent
6+
depends_on: sent
7+
filter: dt_alias_exists("sent0")

0 commit comments

Comments
 (0)