-
Notifications
You must be signed in to change notification settings - Fork 7.7k
drivers: stepper: introduce stepper_drv api to facilitate implementing motion controllers as device drivers #91979
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
0429ffb
to
5c9c369
Compare
676d5fd
to
1d51595
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Small little pass, will do some in depth review later on :^)
drivers/stepper/adi_tmc/tmc22xx.c
Outdated
|
||
static int tmc22xx_stepper_enable(const struct device *dev) | ||
{ | ||
const struct tmc22xx_config *config = dev->config; | ||
|
||
LOG_DBG("Enabling Stepper motor controller %s", dev->name); | ||
return gpio_pin_set_dt(&config->enable_pin, 1); | ||
return gpio_pin_set_dt(&config->enable_pin, 0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Generally you would set this to 1 and change the actual output to be active low via devicetree
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah that makes sense :) Thanks :^)
Ping @andre-stefanov
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes this is exactly what i came up with in my implementation in the end. It is a bit inconvenient because the user of e.g. tmc2209 has to know this inverted EN logic during DTS definition instead of just saying "i define the pins, the driver knows which level has to be used for enable/disable". But unfortunately i could not provide gpio port/pin references without output level flag in DTS so i left it as faxe is proposing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if you do #define STEPPER_GPIO_ENABLE_LEVEL DT_PROP(instance_nr, enable_level)
Then enable_level
may be defined in .yaml as an integer or boolean as a required entry.
Then one can do: return gpio_pin_set_dt(&config->enable_pin, STEPPER_GPIO_ENABLE_LEVEL);
.
I may be wrong - just my 2 cents here.
9ebf11f
to
d3c27b5
Compare
3b94e61
to
703d030
Compare
#include <zephyr/sys/__assert.h> | ||
|
||
#include <zephyr/logging/log.h> | ||
LOG_MODULE_REGISTER(gpio_stepper_motor_controller, CONFIG_STEPPER_LOG_LEVEL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: gpio_stepper_motor_controller
, just a bit too long :)
4a60ace
to
e4b6c2d
Compare
84392f5
to
060b707
Compare
drivers/stepper/stepper_motion_controllers/zephyr_stepper_motion_controller.c
Outdated
Show resolved
Hide resolved
drivers/stepper/stepper_motion_controllers/zephyr_stepper_motion_controller.c
Outdated
Show resolved
Hide resolved
060b707
to
e2dd143
Compare
True, have not thought about that. Fine with |
Thx :). |
2983743
to
09ef29a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fine for me
Hey Everyone, i have added a table Stepper Implementation Comparison alongwith some Code Snippets to show how this PR will affect the devicetree and the API usage :) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missed a wrong assert message in the drv84xx/api tests in my last reviews.
09ef29a
to
15c4138
Compare
introducing stepper_drv api which is to be implemented by the stepper drivers Add fault handling in drv84xx using a fault cb mechanism With the introduction of the stepper_drv api, the goal is to achieve better separation of concerns where motion controllers are responsible for generating step pulses whereaas stepper drivers do are responsible for stepping, enabling, setting microstep resolution Signed-off-by: Jilay Pandya <[email protected]>
@@ -3,22 +3,26 @@ | |||
Steppers | |||
######## | |||
|
|||
The stepper driver API provides a set of functions for controlling and configuring stepper drivers. | |||
The stepper driver subsystem consists of two device driver APIs: | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe an explanation which driver is responsible for the step
function?
And an explanation that the stepper driver API makes use of the steper_drv API internally? Some sort of diagram maybe with a driver which implements both vs one where you have to use zephyr,stepper-motion-control
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 for some diagrams
30464db
to
b1e061c
Compare
Hi Everyone, I have introduced one more commit. I think we should bring it in this PR, so that we don't have to introduce breaking changes on the API level in the stepper driver subsystem in the very vicinity of this PR being merged. Sorry for extending the scope of the PR again, but I think it's better that we bring this change in this PR. The most affected drivers are the trinamic ones for now :)
|
- introduce stepper_index - Drop stepper_drv functions from stepper_api - Refactor Stepper Motion Controller - Refactor Shell Signed-off-by: Jilay Pandya <[email protected]>
Add stepper index selection functionality in stepper shell to select different steppers for the same stepper motion controller Signed-off-by: Jilay Pandya <[email protected]>
b1e061c
to
eefa614
Compare
adae983
to
d96828c
Compare
add information about stepper_drv api and relevant functions in stepper documentation. rename zephyr,gpio-stepper to zephyr,h-bridge-stepper Signed-off-by: Jilay Pandya <[email protected]>
d96828c
to
aa79d02
Compare
stall detection is a stepper_drv functionality and hence stepper_drv api needs an event callback mechanism to notify about the stepper driver related events such as fault, stall and so on. Signed-off-by: Jilay Pandya <[email protected]>
aa79d02
to
75bd6f3
Compare
|
Update 06.07.25
Commit 1: Introduces stepper_drv api for stepper driver drivers
Commit 2: Split stepper_drv related functions from stepper_api and introduces stepper_idx in all motion_control functions
commit 3: Add stepper index selection functionality in shell
commit 4: add documentation about stepper_drv api
This PR aims to facilitate implementation of stepper motion controllers as device drivers. Hence the low-level step-dir drivers now shall implement a stepper_drv api, effectively also signifying what the IC actually supports i.e enable, step/dir and in some cases fault detection
Stepper Driver Subsystem shall now have two APIs
Code Snippet:
Before
After
Stepper Implementation Comparison
-
x_axis_stepper
-
y_axis_stepper
- Motion controller:
x_y_stepper_motion_controller
- Driver references:
x_axis_stepper_driver
,y_axis_stepper_driver
tmc50xx_stepper_x_axis@0 {/* device_api: stepper api */}
tmc50xx_stepper_y_axis@1 {/* device_api: stepper api */}
- Motion controller with stepper API:
tmc50xx_motion_controller {/* device_api: stepper api */}
- Driver components with stepper_drv API:
tmc50xx_stepper_driver_x_axis@0 {/* device_api: stepper_drv api */}
stepper_move_to(x_axis_stepper, 200);
stepper_stop(y_axis_stepper);
stepper_disable(x_axis_stepper);
stepper_disable(y_axis_stepper);
- Motion control through controller with axis param:
stepper_move_to(x_y_stepper_motion_controller, CONFIG_X_AXIS, 200);
stepper_stop(x_y_stepper_motion_controller, CONFIG_Y_AXIS);
- Direct driver control remains:
stepper_drv_disable(x_axis_stepper_driver);
stepper_drv_disable(y_axis_stepper_driver);
CONFIG_X_AXIS 0
CONFIG_Y_AXIS 1
Side effects:
A lot of common code is refactored out and the stepper step-dir or h-bridge based drivers only do what the ic supports. i.e. enable/disable, set/get ustep resolution, step/dir.
Drv84xx handles fault events as of now, which is good. However, handling of fault event has to be refactored out of stepper_api, as mentioned in the RFC Split Stepper Motion Controller <-> Stepper Driver #89786 .
Introduce set_fault_event_callback, remove fault_event from the current stepper_event enum and rename stepper_event_callback to stepper_motion_control_event_callback.