Skip to content

Commit 26d7cad

Browse files
committed
drivers: step_dir: refactor stepper_handle_timing_signal
1. Reduce the spinlock scope in stepper_handle_timing_signal 2. perform a step each time the timing signal is called 3. Increment/Decrement actual_position and steps using atomics Signed-off-by: Jilay Pandya <[email protected]>
1 parent 6f816fd commit 26d7cad

File tree

2 files changed

+34
-48
lines changed

2 files changed

+34
-48
lines changed

drivers/stepper/step_dir/step_dir_stepper_common.c

Lines changed: 32 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ LOG_MODULE_REGISTER(step_dir_stepper, CONFIG_STEPPER_LOG_LEVEL);
1111
static inline int step_dir_stepper_perform_step(const struct device *dev)
1212
{
1313
const struct step_dir_stepper_common_config *config = dev->config;
14-
struct step_dir_stepper_common_data *data = dev->data;
1514
int ret;
1615

1716
ret = gpio_pin_toggle_dt(&config->step_pin);
@@ -28,12 +27,6 @@ static inline int step_dir_stepper_perform_step(const struct device *dev)
2827
}
2928
}
3029

31-
if (data->direction == STEPPER_DIRECTION_POSITIVE) {
32-
data->actual_position++;
33-
} else {
34-
data->actual_position--;
35-
}
36-
3730
return 0;
3831
}
3932

@@ -120,25 +113,20 @@ static void stepper_work_event_handler(struct k_work *work)
120113

121114
static void update_remaining_steps(struct step_dir_stepper_common_data *data)
122115
{
123-
const struct step_dir_stepper_common_config *config = data->dev->config;
124-
125-
if (data->step_count > 0) {
126-
data->step_count--;
127-
} else if (data->step_count < 0) {
128-
data->step_count++;
129-
} else {
130-
stepper_trigger_callback(data->dev, STEPPER_EVENT_STEPS_COMPLETED);
131-
config->timing_source->stop(data->dev);
116+
if (atomic_get(&data->step_count) > 0) {
117+
atomic_dec(&data->step_count);
118+
} else if (atomic_get(&data->step_count) < 0) {
119+
atomic_inc(&data->step_count);
132120
}
133121
}
134122

135123
static void update_direction_from_step_count(const struct device *dev)
136124
{
137125
struct step_dir_stepper_common_data *data = dev->data;
138126

139-
if (data->step_count > 0) {
127+
if (atomic_get(&data->step_count) > 0) {
140128
data->direction = STEPPER_DIRECTION_POSITIVE;
141-
} else if (data->step_count < 0) {
129+
} else if (atomic_get(&data->step_count) < 0) {
142130
data->direction = STEPPER_DIRECTION_NEGATIVE;
143131
} else {
144132
LOG_ERR("Step count is zero");
@@ -150,23 +138,20 @@ static void position_mode_task(const struct device *dev)
150138
struct step_dir_stepper_common_data *data = dev->data;
151139
const struct step_dir_stepper_common_config *config = dev->config;
152140

153-
if (data->step_count) {
154-
(void)step_dir_stepper_perform_step(dev);
155-
}
141+
update_remaining_steps(dev->data);
156142

157-
if (config->timing_source->needs_reschedule(dev) && data->step_count != 0) {
143+
if (config->timing_source->needs_reschedule(dev) && atomic_get(&data->step_count) != 0) {
158144
(void)config->timing_source->start(dev);
145+
} else if (atomic_get(&data->step_count) == 0) {
146+
stepper_trigger_callback(data->dev, STEPPER_EVENT_STEPS_COMPLETED);
147+
config->timing_source->stop(data->dev);
159148
}
160-
161-
update_remaining_steps(dev->data);
162149
}
163150

164151
static void velocity_mode_task(const struct device *dev)
165152
{
166153
const struct step_dir_stepper_common_config *config = dev->config;
167154

168-
(void)step_dir_stepper_perform_step(dev);
169-
170155
if (config->timing_source->needs_reschedule(dev)) {
171156
(void)config->timing_source->start(dev);
172157
}
@@ -176,18 +161,23 @@ void stepper_handle_timing_signal(const struct device *dev)
176161
{
177162
struct step_dir_stepper_common_data *data = dev->data;
178163

179-
K_SPINLOCK(&data->lock) {
180-
switch (data->run_mode) {
181-
case STEPPER_RUN_MODE_POSITION:
182-
position_mode_task(dev);
183-
break;
184-
case STEPPER_RUN_MODE_VELOCITY:
185-
velocity_mode_task(dev);
186-
break;
187-
default:
188-
LOG_WRN("Unsupported run mode: %d", data->run_mode);
189-
break;
190-
}
164+
(void)step_dir_stepper_perform_step(dev);
165+
if (data->direction == STEPPER_DIRECTION_POSITIVE) {
166+
atomic_inc(&data->actual_position);
167+
} else {
168+
atomic_dec(&data->actual_position);
169+
}
170+
171+
switch (data->run_mode) {
172+
case STEPPER_RUN_MODE_POSITION:
173+
position_mode_task(dev);
174+
break;
175+
case STEPPER_RUN_MODE_VELOCITY:
176+
velocity_mode_task(dev);
177+
break;
178+
default:
179+
LOG_WRN("Unsupported run mode: %d", data->run_mode);
180+
break;
191181
}
192182
}
193183

@@ -251,7 +241,7 @@ int step_dir_stepper_common_move_by(const struct device *dev, const int32_t micr
251241

252242
K_SPINLOCK(&data->lock) {
253243
data->run_mode = STEPPER_RUN_MODE_POSITION;
254-
data->step_count = micro_steps;
244+
atomic_set(&data->step_count, micro_steps);
255245
update_direction_from_step_count(dev);
256246
ret = update_dir_pin(dev);
257247
if (ret < 0) {
@@ -265,7 +255,7 @@ int step_dir_stepper_common_move_by(const struct device *dev, const int32_t micr
265255
}
266256

267257
int step_dir_stepper_common_set_microstep_interval(const struct device *dev,
268-
const uint64_t microstep_interval_ns)
258+
const uint64_t microstep_interval_ns)
269259
{
270260
struct step_dir_stepper_common_data *data = dev->data;
271261
const struct step_dir_stepper_common_config *config = dev->config;
@@ -298,9 +288,7 @@ int step_dir_stepper_common_get_actual_position(const struct device *dev, int32_
298288
{
299289
struct step_dir_stepper_common_data *data = dev->data;
300290

301-
K_SPINLOCK(&data->lock) {
302-
*value = data->actual_position;
303-
}
291+
*value = atomic_get(&data->actual_position);
304292

305293
return 0;
306294
}
@@ -311,9 +299,7 @@ int step_dir_stepper_common_move_to(const struct device *dev, const int32_t valu
311299
int32_t steps_to_move;
312300

313301
/* Calculate the relative movement required */
314-
K_SPINLOCK(&data->lock) {
315-
steps_to_move = value - data->actual_position;
316-
}
302+
steps_to_move = value - atomic_get(&data->actual_position);
317303

318304
return step_dir_stepper_common_move_by(dev, steps_to_move);
319305
}

drivers/stepper/step_dir/step_dir_stepper_common.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ struct step_dir_stepper_common_data {
7171
struct k_spinlock lock;
7272
enum stepper_direction direction;
7373
enum stepper_run_mode run_mode;
74-
int32_t actual_position;
7574
uint64_t microstep_interval_ns;
76-
int32_t step_count;
75+
atomic_t actual_position;
76+
atomic_t step_count;
7777
stepper_event_callback_t callback;
7878
void *event_cb_user_data;
7979

0 commit comments

Comments
 (0)