-
Notifications
You must be signed in to change notification settings - Fork 7.5k
drivers: stepper: introduce step-dir functions in stepper 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.
drivers/stepper/adi_tmc/tmc22xx.c
Outdated
} | ||
|
||
static int tmc22xx_stepper_disable(const struct device *dev) | ||
{ | ||
const struct tmc22xx_config *config = dev->config; | ||
|
||
LOG_DBG("Disabling Stepper motor controller %s", dev->name); | ||
return gpio_pin_set_dt(&config->enable_pin, 0); | ||
return gpio_pin_set_dt(&config->enable_pin, 1); |
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.
Same here
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.
done
drivers/stepper/allegro/a4979.c
Outdated
@@ -121,7 +120,6 @@ static int a4979_stepper_set_micro_step_res(const struct device *dev, | |||
case STEPPER_MICRO_STEP_4: | |||
m0_value = 0; | |||
m1_value = 1; | |||
break; |
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.
I guess this was an accident
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.
yep :)
const struct gpio_stepper_config *config = dev->config; | ||
|
||
LOG_DBG("Initializing %s gpio_stepper with %d pin", dev->name, NUM_CONTROL_PINS); | ||
for (uint8_t n_pin = 0; n_pin < NUM_CONTROL_PINS; n_pin++) { |
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.
Checking readyness via gpio_ready_dt
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.
done
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
dts/bindings/stepper/stepper.yaml
Outdated
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.
since the step/dir interface is extracted as a reusable component by now, we could also extract the corresponding bindings for gpio phandles into zephyr,stepper-step-dir.yaml
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.
that would be en-pin, step-pin, dir-pin, m0/m1/m2-gpios and maybe fault pin as well. Hmm sounds fair. Is it okay if we do this in an upcoming patch, since I am going to separate the relevant functions in stepper-step-dir-api :)?
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.
we might need a patch in between for tmc22xx as well, since it handles the mix-gpios in a slight different pattern, but we can do it.
update_remaining_steps(dev); | ||
stepper_step(config->stepper); |
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.
call of stepper_step
should be executed as early as possible during the ISR callback to avoid jitter due to different calculation overhead of update_remaining_steps
.
update_remaining_steps(dev); | |
stepper_step(config->stepper); | |
stepper_step(config->stepper); | |
update_remaining_steps(dev); |
|
||
data->dev = dev; | ||
|
||
if (config->timing_source->init) { |
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.
we should return an error if config->timing_source->init
evaluates to false
because in this case the controller wont be usable (and we have the worker timing source as fallback for that reason).
@@ -85,7 +85,7 @@ properties: | |||
|
|||
child-binding: | |||
include: | |||
- name: stepper-controller.yaml | |||
- name: stepper.yaml |
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.
i think only en-gpios
and invert-direction
should be allowed for this driver. Looking into the specs i dont see other features available over gpio (microstep config, step/dir etc)
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.
you can use the tmc50xx with step-dir as well.
and micro step config doesn't necessarily have to be via gpios :). For instance, in h-bridge drivers we kinda control It using the half-step-lut.
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.
oh ok. probably the model i checked was an exception and did not have those pins exposed
include/zephyr/drivers/stepper.h
Outdated
* Counting the number of steps is the responsibility of the stepper motion controller, | ||
* which will call this function for each step. |
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.
* Counting the number of steps is the responsibility of the stepper motion controller, | |
* which will call this function for each step. | |
* This function will not increment/decrement any position related data. Doing so | |
* is responsibility of the caller (e.g. stepper motion controller). |
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.
your text sounds better :)
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.
done
* @retval -ENOSYS If not implemented by device driver | ||
* @retval 0 Success | ||
*/ | ||
__syscall int stepper_set_fault_callback(const struct device *dev, |
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.
how is this different from set_event_callback
? also i don't see this API being implemented or used anywhere.
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.
I have implemented in drv84xx, so quite a few step drivers have fault pin, this is to accommodate that particular use-case for now, we can maybe handle this more gracefully in the next patch :)
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.
would that really be a separate callback then or can we define just another stepper event for this? (similar to endstops, stallguard etc)
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.
This is what I am aiming for :) #89786 (comment)
@@ -14,4 +22,12 @@ | |||
<&gpiob 0 GPIO_ACTIVE_HIGH>, /* D10 */ | |||
<&gpioa 7 GPIO_ACTIVE_HIGH>; /* D11 */ | |||
}; | |||
|
|||
stepper_motion_control: 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.
stepper_motion_control: stepper_motion_control { | |
gpio_stepper_motion_control: 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.
because it toggles step pin?
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.
it's just because it is a motion controller for the gpio stepper. if you have multiple steppers in a project, you will have to distinguish them. so i proposed to name them after the stepper they 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.
I will be naming it as the driver itself zephyr_stepper_motion_control
.
@@ -1,11 +1,19 @@ | |||
/ { | |||
aliases { | |||
stepper = &gpio_stepper; | |||
stepper-motion-control = &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.
stepper-motion-control = &stepper_motion_control; | |
stepper-motion-control = &gpio_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.
I will be naming it as zephyr_stepper_motion_control to reflect the device driver.
060b707
to
e2dd143
Compare
24fc13e
to
ba6069e
Compare
With the introduction of these two functions, now motion controllers can be directly implemented on the device driver level. This allows different motion controllers to consume various stepper drivers allowing for further upstream as well as downstream stepper motion controllers to be implemented Signed-off-by: Jilay Pandya <[email protected]>
Add fault handling in drv84xx using a fault cb mechanism Signed-off-by: Jilay Pandya <[email protected]>
ba6069e
to
89f019b
Compare
Removing tests which are already covered in stepper api test suite or are outdated and have no relevance in accordance to the recent changes in the api Signed-off-by: Jilay Pandya <[email protected]>
|
This PR aims to facilitate implementation of stepper motion controllers as device drivers. Hence two new functions as added, namely step and dir.
Note:
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 us resolution, step/dir.
Drv84xx handles fault events as of now, which is good. However, handling of fault event has to be refactored 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.
This will have to be rebased on main, once this PR #91909 is merged.