LCOV - code coverage report
Current view: top level - zephyr/drivers/stepper - stepper_trinamic.h Hit Total Coverage
Test: new.info Lines: 6 44 13.6 %
Date: 2024-10-22 00:13:38

          Line data    Source code
       1           1 : /**
       2             :  * @file drivers/stepper/stepper_trinamic.h
       3             :  *
       4             :  * @brief Public API for Trinamic Stepper Controller Specific Functions
       5             :  *
       6             :  */
       7             : 
       8             : /*
       9             :  * SPDX-FileCopyrightText: Copyright (c) 2024 Carl Zeiss Meditec AG
      10             :  *
      11             :  * SPDX-License-Identifier: Apache-2.0
      12             :  */
      13             : 
      14             : #ifndef ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_
      15             : #define ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_
      16             : 
      17             : /**
      18             :  * @brief Trinamic Stepper Controller Interface
      19             :  * @defgroup trinamic_stepper_interface Trinamic Stepper Controller Interface
      20             :  * @ingroup stepper_interface
      21             :  * @{
      22             :  */
      23             : 
      24             : #include <stdint.h>
      25             : #include <zephyr/drivers/stepper.h>
      26             : 
      27             : #ifdef __cplusplus
      28             : extern "C" {
      29             : #endif
      30             : 
      31             : /**
      32             :  * @brief Trinamic stepper controller ramp generator data limits
      33             :  */
      34           1 : #define TMC_RAMP_VSTART_MAX     GENMASK(17, 0)
      35           0 : #define TMC_RAMP_VSTART_MIN     0
      36           0 : #define TMC_RAMP_V1_MAX         GENMASK(19, 0)
      37           0 : #define TMC_RAMP_V1_MIN         0
      38           0 : #define TMC_RAMP_VMAX_MAX       (GENMASK(22, 0) - 512)
      39           0 : #define TMC_RAMP_VMAX_MIN       0
      40           0 : #define TMC_RAMP_A1_MAX         GENMASK(15, 0)
      41           0 : #define TMC_RAMP_A1_MIN         0
      42           0 : #define TMC_RAMP_AMAX_MAX       GENMASK(15, 0)
      43           0 : #define TMC_RAMP_AMAX_MIN       0
      44           0 : #define TMC_RAMP_D1_MAX         GENMASK(15, 0)
      45           0 : #define TMC_RAMP_D1_MIN         1
      46           0 : #define TMC_RAMP_DMAX_MAX       GENMASK(15, 0)
      47           0 : #define TMC_RAMP_DMAX_MIN       0
      48           0 : #define TMC_RAMP_VSTOP_MAX      GENMASK(17, 0)
      49           0 : #define TMC_RAMP_VSTOP_MIN      1
      50           0 : #define TMC_RAMP_TZEROWAIT_MAX  (GENMASK(15, 0) - 512)
      51           0 : #define TMC_RAMP_TZEROWAIT_MIN  0
      52           0 : #define TMC_RAMP_VCOOLTHRS_MAX  GENMASK(22, 0)
      53           0 : #define TMC_RAMP_VCOOLTHRS_MIN  0
      54           0 : #define TMC_RAMP_VHIGH_MAX      GENMASK(22, 0)
      55           0 : #define TMC_RAMP_VHIGH_MIN      0
      56           0 : #define TMC_RAMP_IHOLD_IRUN_MAX GENMASK(4, 0)
      57           0 : #define TMC_RAMP_IHOLD_IRUN_MIN 0
      58           0 : #define TMC_RAMP_IHOLDDELAY_MAX GENMASK(3, 0)
      59           0 : #define TMC_RAMP_IHOLDDELAY_MIN 0
      60           0 : #define TMC_RAMP_VACTUAL_SHIFT  22
      61             : /**
      62             :  * @brief Trinamic Stepper Ramp Generator data
      63             :  */
      64           1 : struct tmc_ramp_generator_data {
      65           0 :         uint32_t vstart;
      66           0 :         uint32_t v1;
      67           0 :         uint32_t vmax;
      68           0 :         uint16_t a1;
      69           0 :         uint16_t amax;
      70           0 :         uint16_t d1;
      71           0 :         uint16_t dmax;
      72           0 :         uint32_t vstop;
      73           0 :         uint16_t tzerowait;
      74           0 :         uint32_t vcoolthrs;
      75           0 :         uint32_t vhigh;
      76           0 :         uint32_t iholdrun;
      77             : };
      78             : 
      79             : /**
      80             :  * @brief Check if Ramp DT data is within limits
      81             :  */
      82           1 : #define CHECK_RAMP_DT_DATA(node)                                                        \
      83             :         COND_CODE_1(DT_PROP_EXISTS(node, vstart),                                       \
      84             :                 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstart), TMC_RAMP_VSTART_MIN,       \
      85             :                               TMC_RAMP_VSTART_MAX), "vstart out of range"), ());      \
      86             :         COND_CODE_1(DT_PROP_EXISTS(node, v1),                                           \
      87             :                 BUILD_ASSERT(IN_RANGE(DT_PROP(node, v1), TMC_RAMP_V1_MIN,               \
      88             :                               TMC_RAMP_V1_MAX), "v1 out of range"), ());              \
      89             :         COND_CODE_1(DT_PROP_EXISTS(node, vmax),                                         \
      90             :                 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vmax), TMC_RAMP_VMAX_MIN,           \
      91             :                               TMC_RAMP_VMAX_MAX), "vmax out of range"), ());          \
      92             :         COND_CODE_1(DT_PROP_EXISTS(node, a1),                                           \
      93             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, a1), TMC_RAMP_A1_MIN,                       \
      94             :                               TMC_RAMP_A1_MAX), "a1 out of range"), ());              \
      95             :         COND_CODE_1(DT_PROP_EXISTS(node, amax),                                         \
      96             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, amax), TMC_RAMP_AMAX_MIN,                   \
      97             :                               TMC_RAMP_AMAX_MAX), "amax out of range"), ());          \
      98             :         COND_CODE_1(DT_PROP_EXISTS(node, d1),                                           \
      99             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, d1), TMC_RAMP_D1_MIN,                       \
     100             :                               TMC_RAMP_D1_MAX), "d1 out of range"), ());              \
     101             :         COND_CODE_1(DT_PROP_EXISTS(node, dmax),                                         \
     102             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, dmax), TMC_RAMP_DMAX_MIN,                   \
     103             :                               TMC_RAMP_DMAX_MAX), "dmax out of range"), ());          \
     104             :         COND_CODE_1(DT_PROP_EXISTS(node, vstop),                                        \
     105             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstop), TMC_RAMP_VSTOP_MIN,                 \
     106             :                               TMC_RAMP_VSTOP_MAX), "vstop out of range"), ());                \
     107             :         COND_CODE_1(DT_PROP_EXISTS(node, tzerowait),                                    \
     108             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, tzerowait), TMC_RAMP_TZEROWAIT_MIN,         \
     109             :                               TMC_RAMP_TZEROWAIT_MAX), "tzerowait out of range"), ());        \
     110             :         COND_CODE_1(DT_PROP_EXISTS(node, vcoolthrs),                                    \
     111             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, vcoolthrs), TMC_RAMP_VCOOLTHRS_MIN,         \
     112             :                               TMC_RAMP_VCOOLTHRS_MAX), "vcoolthrs out of range"), ());        \
     113             :         COND_CODE_1(DT_PROP_EXISTS(node, vhigh),                                        \
     114             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, vhigh), TMC_RAMP_VHIGH_MIN,                 \
     115             :                               TMC_RAMP_VHIGH_MAX), "vhigh out of range"), ());                \
     116             :         COND_CODE_1(DT_PROP_EXISTS(node, ihold),                                        \
     117             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, ihold), TMC_RAMP_IHOLD_IRUN_MIN,            \
     118             :                               TMC_RAMP_IHOLD_IRUN_MAX), "ihold out of range"), ());   \
     119             :         COND_CODE_1(DT_PROP_EXISTS(node, irun),                                         \
     120             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, irun), TMC_RAMP_IHOLD_IRUN_MIN,             \
     121             :                               TMC_RAMP_IHOLD_IRUN_MAX), "irun out of range"), ());    \
     122             :         COND_CODE_1(DT_PROP_EXISTS(node, iholddelay),                                   \
     123             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, iholddelay), TMC_RAMP_IHOLDDELAY_MIN,       \
     124             :                               TMC_RAMP_IHOLDDELAY_MAX), "iholddelay out of range"), ());
     125             : 
     126             : /**
     127             :  * @brief Get Trinamic Stepper Ramp Generator data from DT
     128             :  *
     129             :  * @param node DT node identifier
     130             :  *
     131             :  * @return struct tmc_ramp_generator_data
     132             :  */
     133           1 : #define TMC_RAMP_DT_SPEC_GET(node)                                              \
     134             :         {                                                                       \
     135             :                 .vstart = DT_PROP(node, vstart),                                \
     136             :                 .v1 = DT_PROP(node, v1),                                        \
     137             :                 .vmax = DT_PROP(node, vmax),                                    \
     138             :                 .a1 = DT_PROP(node, a1),                                        \
     139             :                 .amax = DT_PROP(node, amax),                                    \
     140             :                 .d1 = DT_PROP(node, d1),                                        \
     141             :                 .dmax = DT_PROP(node, dmax),                                    \
     142             :                 .vstop = DT_PROP(node, vstop),                                  \
     143             :                 .tzerowait = DT_PROP(node, tzerowait),                          \
     144             :                 .vcoolthrs = DT_PROP(node, vcoolthrs),                          \
     145             :                 .vhigh = DT_PROP(node, vhigh),                                  \
     146             :                 .iholdrun = (TMC5041_IRUN(DT_PROP(node, irun)) |                \
     147             :                              TMC5041_IHOLD(DT_PROP(node, ihold)) |              \
     148             :                              TMC5041_IHOLDDELAY(DT_PROP(node, iholddelay))),    \
     149             :         }
     150             : 
     151             : /**
     152             :  * @brief Configure Trinamic Stepper Ramp Generator
     153             :  *
     154             :  * @param dev Pointer to the stepper motor controller instance
     155             :  * @param ramp_data Pointer to a struct containing the required ramp parameters
     156             :  *
     157             :  * @retval -EIO General input / output error
     158             :  * @retval -ENOSYS If not implemented by device driver
     159             :  * @retval 0 Success
     160             :  */
     161           1 : int tmc5041_stepper_set_ramp(const struct device *dev,
     162             :                              const struct tmc_ramp_generator_data *ramp_data);
     163             : 
     164             : /**
     165             :  * @}
     166             :  */
     167             : 
     168             : #ifdef __cplusplus
     169             : }
     170             : #endif
     171             : 
     172             : #endif /* ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_ */

Generated by: LCOV version 1.14