Integrated Stepper Motion Control and Driver

Devices which comprise of both motion controller and a stepper driver in a single IC. These devices have to be modelled as multi-functional-device in device tree, implementing both Stepper and Stepper-Drv APIs. An example of such a device is adi,tmc50xx. Stepper API is implemented by adi,tmc50xx-stepper and Stepper-Drv API is implemented by adi,tmc50xx-stepper-drv.

/ {
    aliases {
        x_axis_stepper_motor = &tmc50xx_0_motion_controller;
        y_axis_stepper_motor =  &tmc50xx_1_motion_controller;
        x_axis_stepper_driver = &tmc50xx_0_stepper_driver;
        y_axis_stepper_driver = &tmc50xx_1_stepper_driver;
    };
};

&spi0 {
    /* SPI bus options here, not shown */

    /* Dual controller/driver for up to two 2-phase bipolar stepper motors */
    tmc50xx: tmc50xx@0 {
        compatible = "adi,tmc50xx";
        reg = <0>;
        spi-max-frequency = <DT_FREQ_M(8)>; /* Maximum SPI bus frequency */

        poscmp-enable; test-mode; lock-gconf; /* ADI TMC Global configuration flags */
        clock-frequency = <DT_FREQ_M(16)>; /* Internal/External Clock frequency */

        /* DEVICE_API: stepper_drv api */
        tmc50xx_0_stepper_driver: tmc50xx_0_stepper_driver {
            idx = <0>;
             compatible = "adi,tmc50xx-stepper-drv";
             micro-step-res = <256>;
             /* ADI TMC stallguard settings specific to TMC50XX */
             stallguard2-threshold=<30>;
         };

        /* DEVICE_API: stepper api */
        tmc50xx_0_motion_controller: tmc50xx_0_motion_controller {
            idx = <0>;
            compatible = "adi,tmc50xx-stepper";
            ...
            vmax = <900000>;
            amax = <50000>;
            ...
            activate-stallguard2;
            ...
         };

        /* DEVICE_API: stepper_drv api */
        tmc50xx_1_stepper_driver: tmc50xx_1_stepper_driver {
            idx = <1>;
             compatible = "adi,tmc50xx-stepper-drv";
             micro-step-res = <256>;
             /* ADI TMC stallguard settings specific to TMC50XX */
             stallguard2-threshold=<30>;
         };

        /* DEVICE_API: stepper api */
        tmc50xx_1_motion_controller: tmc50xx_1_motion_controller {
            idx = <1>;
            compatible = "adi,tmc50xx-stepper";
            ...
            vstart = <1000>;
            ...
            stallguard-threshold-velocity=<200000>;
         };
     };
};

Following the aforementioned configurations, the stepper driver subsystem can be used in the application code as follows:

static const struct device *x_stepper = DEVICE_DT_GET(DT_ALIAS(x_axis_stepper_motor));
static const struct device *x_stepper_drv = DEVICE_DT_GET(DT_ALIAS(x_axis_stepper_driver));
static const struct device *y_stepper = DEVICE_DT_GET(DT_ALIAS(y_axis_stepper_motor));
static const struct device *y_stepper_drv = DEVICE_DT_GET(DT_ALIAS(y_axis_stepper_driver));
...
stepper_move_to(x_stepper, 200);
stepper_stop(x_stepper);
stepper_drv_disable(x_stepper_drv);
stepper_drv_disable(y_stepper_drv);