1 /*
2 * Copyright 2024 Navimatix GmbH
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/drivers/gpio.h>
8 #include <zephyr/kernel.h>
9 #include <zephyr/ztest_assert.h>
10 #include <stdbool.h>
11 #include <stdint.h>
12 #include <zephyr/ztest.h>
13 #include <zephyr/drivers/stepper.h>
14 #include <zephyr/drivers/gpio/gpio_emul.h>
15
16 struct stepper_drv_fixture {
17 const struct device *dev;
18 };
19
20 struct gpio_dt_spec en_pin = GPIO_DT_SPEC_GET_OR(DT_ALIAS(stepper_drv), en_gpios, {0});
21 struct gpio_dt_spec slp_pin = GPIO_DT_SPEC_GET_OR(DT_ALIAS(stepper_drv), sleep_gpios, {0});
22 struct gpio_dt_spec m0_pin = GPIO_DT_SPEC_GET_OR(DT_ALIAS(stepper_drv), m0_gpios, {0});
23 struct gpio_dt_spec m1_pin = GPIO_DT_SPEC_GET_OR(DT_ALIAS(stepper_drv), m1_gpios, {0});
24
stepper_drv_setup(void)25 static void *stepper_drv_setup(void)
26 {
27 static struct stepper_drv_fixture fixture = {
28 .dev = DEVICE_DT_GET(DT_ALIAS(stepper_drv)),
29 };
30
31 zassert_not_null(fixture.dev);
32 return &fixture;
33 }
34
ZTEST_F(stepper_drv,test_enable_gpio_pins)35 ZTEST_F(stepper_drv, test_enable_gpio_pins)
36 {
37 int value = 0;
38 int err;
39
40 err = stepper_drv_enable(fixture->dev);
41 if (err == -ENOTSUP) {
42 ztest_test_skip();
43 }
44 /* As sleep and enable pins are optional, check if they exist*/
45 if (en_pin.port != NULL) {
46 value = gpio_emul_output_get(en_pin.port, en_pin.pin);
47 zassert_equal(value, 1, "Enable pin should be set");
48 }
49 if (slp_pin.port != NULL) {
50 value = !gpio_emul_output_get(slp_pin.port, slp_pin.pin);
51 zassert_equal(value, 0, "Sleep pin should not be set");
52 }
53
54 /* As enable is supported, disable must also be supported */
55 zassert_ok(stepper_drv_disable(fixture->dev));
56
57 if (en_pin.port != NULL) {
58 value = gpio_emul_output_get(en_pin.port, en_pin.pin);
59 zassert_equal(value, 0, "Enable pin should not be set");
60 }
61 if (slp_pin.port != NULL) {
62 value = !gpio_emul_output_get(slp_pin.port, slp_pin.pin);
63 zassert_equal(value, 1, "Sleep pin should be set");
64 }
65 }
66
ZTEST_F(stepper_drv,test_micro_step_res_set)67 ZTEST_F(stepper_drv, test_micro_step_res_set)
68 {
69 enum stepper_drv_micro_step_resolution res;
70 int value = 0;
71
72 zassert_ok(stepper_drv_set_micro_step_res(fixture->dev, CONFIG_MICRO_STEP_RESOLUTION));
73
74 if (m0_pin.port == NULL || m1_pin.port == NULL) {
75 ztest_test_skip();
76 }
77
78 value = gpio_emul_output_get(m0_pin.port, m0_pin.pin);
79 zassert_equal(value, CONFIG_MICRO_STEP_RESOLUTION_M0, "M0 pin should be %d",
80 CONFIG_MICRO_STEP_RESOLUTION_M0);
81
82 value = gpio_emul_output_get(m1_pin.port, m1_pin.pin);
83 zassert_equal(value, CONFIG_MICRO_STEP_RESOLUTION_M1, "M1 pin should be 1",
84 CONFIG_MICRO_STEP_RESOLUTION_M1);
85
86 zassert_ok(stepper_drv_get_micro_step_res(fixture->dev, &res));
87 zassert_equal(res, CONFIG_MICRO_STEP_RESOLUTION,
88 "Micro step resolution not set correctly, should be %d but is %d",
89 CONFIG_MICRO_STEP_RESOLUTION, res);
90 }
91
ZTEST_F(stepper_drv,test_set_micro_step_res_invalid)92 ZTEST_F(stepper_drv, test_set_micro_step_res_invalid)
93 {
94 int ret = stepper_drv_set_micro_step_res(fixture->dev, 127);
95
96 zassert_equal(ret, -EINVAL, "Invalid micro step resolution should return -EINVAL");
97 }
98
99 ZTEST_SUITE(stepper_drv, NULL, stepper_drv_setup, NULL, NULL, NULL);
100