@@ -78,12 +78,12 @@ static void decrement_coil_charge(const struct device *dev)
7878 }
7979}
8080
81- static int power_down_coils (const struct device * dev )
81+ static int energize_coils (const struct device * dev , const bool energized )
8282{
8383 const struct gpio_stepper_config * config = dev -> config ;
8484
8585 for (int i = 0 ; i < NUM_CONTROL_PINS ; i ++ ) {
86- const int err = gpio_pin_set_dt (& config -> control_pins [i ], 0u );
86+ const int err = gpio_pin_set_dt (& config -> control_pins [i ], energized );
8787
8888 if (err != 0 ) {
8989 LOG_ERR ("Failed to power down coil %d" , i );
@@ -327,23 +327,39 @@ static int gpio_stepper_set_event_callback(const struct device *dev,
327327static int gpio_stepper_enable (const struct device * dev , bool enable )
328328{
329329 struct gpio_stepper_data * data = dev -> data ;
330+ int err ;
330331
331- K_SPINLOCK (& data -> lock ) {
332+ if (data -> is_enabled == enable ) {
333+ return 0 ;
334+ }
332335
336+ K_SPINLOCK (& data -> lock ) {
333337 data -> is_enabled = enable ;
334338
335339 if (enable ) {
336- ( void ) k_work_reschedule ( & data -> stepper_dwork , K_NO_WAIT );
340+ err = energize_coils ( dev , true );
337341 } else {
338342 (void )k_work_cancel_delayable (& data -> stepper_dwork );
339- const int err = power_down_coils (dev );
343+ err = energize_coils (dev , false);
344+ }
345+ }
346+ return err ;
347+ }
340348
341- if (err != 0 ) {
342- return - EIO ;
343- }
349+ static int gpio_stepper_stop (const struct device * dev )
350+ {
351+ struct gpio_stepper_data * data = dev -> data ;
352+ int err ;
353+
354+ K_SPINLOCK (& data -> lock ) {
355+ (void )k_work_cancel_delayable (& data -> stepper_dwork );
356+ err = energize_coils (dev , true);
357+
358+ if (data -> callback && !err ) {
359+ data -> callback (data -> dev , STEPPER_EVENT_STOPPED , data -> event_cb_user_data );
344360 }
345361 }
346- return 0 ;
362+ return err ;
347363}
348364
349365static int gpio_stepper_init (const struct device * dev )
@@ -362,16 +378,17 @@ static int gpio_stepper_init(const struct device *dev)
362378
363379static DEVICE_API (stepper , gpio_stepper_api ) = {
364380 .enable = gpio_stepper_enable ,
365- .move_by = gpio_stepper_move_by ,
366- .is_moving = gpio_stepper_is_moving ,
381+ .set_micro_step_res = gpio_stepper_set_micro_step_res ,
382+ .get_micro_step_res = gpio_stepper_get_micro_step_res ,
367383 .set_reference_position = gpio_stepper_set_reference_position ,
368384 .get_actual_position = gpio_stepper_get_actual_position ,
369- .move_to = gpio_stepper_move_to ,
385+ .set_event_callback = gpio_stepper_set_event_callback ,
370386 .set_microstep_interval = gpio_stepper_set_microstep_interval ,
387+ .move_by = gpio_stepper_move_by ,
388+ .move_to = gpio_stepper_move_to ,
371389 .run = gpio_stepper_run ,
372- .set_micro_step_res = gpio_stepper_set_micro_step_res ,
373- .get_micro_step_res = gpio_stepper_get_micro_step_res ,
374- .set_event_callback = gpio_stepper_set_event_callback ,
390+ .stop = gpio_stepper_stop ,
391+ .is_moving = gpio_stepper_is_moving ,
375392};
376393
377394#define GPIO_STEPPER_DEFINE (inst ) \
0 commit comments