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