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-12-22 00:14:23

          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             : /**
      63             :  * @brief Trinamic Stepper Ramp Generator data
      64             :  */
      65           1 : struct tmc_ramp_generator_data {
      66           0 :         uint32_t vstart;
      67           0 :         uint32_t v1;
      68           0 :         uint32_t vmax;
      69           0 :         uint16_t a1;
      70           0 :         uint16_t amax;
      71           0 :         uint16_t d1;
      72           0 :         uint16_t dmax;
      73           0 :         uint32_t vstop;
      74           0 :         uint16_t tzerowait;
      75           0 :         uint32_t vcoolthrs;
      76           0 :         uint32_t vhigh;
      77           0 :         uint32_t iholdrun;
      78             : };
      79             : 
      80             : /**
      81             :  * @brief Check if Ramp DT data is within limits
      82             :  */
      83           1 : #define CHECK_RAMP_DT_DATA(node)                                                        \
      84             :         COND_CODE_1(DT_PROP_EXISTS(node, vstart),                                       \
      85             :                 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstart), TMC_RAMP_VSTART_MIN,       \
      86             :                               TMC_RAMP_VSTART_MAX), "vstart out of range"), ());      \
      87             :         COND_CODE_1(DT_PROP_EXISTS(node, v1),                                           \
      88             :                 BUILD_ASSERT(IN_RANGE(DT_PROP(node, v1), TMC_RAMP_V1_MIN,               \
      89             :                               TMC_RAMP_V1_MAX), "v1 out of range"), ());              \
      90             :         COND_CODE_1(DT_PROP_EXISTS(node, vmax),                                         \
      91             :                 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vmax), TMC_RAMP_VMAX_MIN,           \
      92             :                               TMC_RAMP_VMAX_MAX), "vmax out of range"), ());          \
      93             :         COND_CODE_1(DT_PROP_EXISTS(node, a1),                                           \
      94             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, a1), TMC_RAMP_A1_MIN,                       \
      95             :                               TMC_RAMP_A1_MAX), "a1 out of range"), ());              \
      96             :         COND_CODE_1(DT_PROP_EXISTS(node, amax),                                         \
      97             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, amax), TMC_RAMP_AMAX_MIN,                   \
      98             :                               TMC_RAMP_AMAX_MAX), "amax out of range"), ());          \
      99             :         COND_CODE_1(DT_PROP_EXISTS(node, d1),                                           \
     100             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, d1), TMC_RAMP_D1_MIN,                       \
     101             :                               TMC_RAMP_D1_MAX), "d1 out of range"), ());              \
     102             :         COND_CODE_1(DT_PROP_EXISTS(node, dmax),                                         \
     103             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, dmax), TMC_RAMP_DMAX_MIN,                   \
     104             :                               TMC_RAMP_DMAX_MAX), "dmax out of range"), ());          \
     105             :         COND_CODE_1(DT_PROP_EXISTS(node, vstop),                                        \
     106             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstop), TMC_RAMP_VSTOP_MIN,                 \
     107             :                               TMC_RAMP_VSTOP_MAX), "vstop out of range"), ());                \
     108             :         COND_CODE_1(DT_PROP_EXISTS(node, tzerowait),                                    \
     109             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, tzerowait), TMC_RAMP_TZEROWAIT_MIN,         \
     110             :                               TMC_RAMP_TZEROWAIT_MAX), "tzerowait out of range"), ());        \
     111             :         COND_CODE_1(DT_PROP_EXISTS(node, vcoolthrs),                                    \
     112             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, vcoolthrs), TMC_RAMP_VCOOLTHRS_MIN,         \
     113             :                               TMC_RAMP_VCOOLTHRS_MAX), "vcoolthrs out of range"), ());        \
     114             :         COND_CODE_1(DT_PROP_EXISTS(node, vhigh),                                        \
     115             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, vhigh), TMC_RAMP_VHIGH_MIN,                 \
     116             :                               TMC_RAMP_VHIGH_MAX), "vhigh out of range"), ());                \
     117             :         COND_CODE_1(DT_PROP_EXISTS(node, ihold),                                        \
     118             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, ihold), TMC_RAMP_IHOLD_IRUN_MIN,            \
     119             :                               TMC_RAMP_IHOLD_IRUN_MAX), "ihold out of range"), ());   \
     120             :         COND_CODE_1(DT_PROP_EXISTS(node, irun),                                         \
     121             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, irun), TMC_RAMP_IHOLD_IRUN_MIN,             \
     122             :                               TMC_RAMP_IHOLD_IRUN_MAX), "irun out of range"), ());    \
     123             :         COND_CODE_1(DT_PROP_EXISTS(node, iholddelay),                                   \
     124             :         BUILD_ASSERT(IN_RANGE(DT_PROP(node, iholddelay), TMC_RAMP_IHOLDDELAY_MIN,       \
     125             :                               TMC_RAMP_IHOLDDELAY_MAX), "iholddelay out of range"), ());
     126             : 
     127             : /**
     128             :  * @brief Get Trinamic Stepper Ramp Generator data from DT
     129             :  *
     130             :  * @param node DT node identifier
     131             :  *
     132             :  * @return struct tmc_ramp_generator_data
     133             :  */
     134           1 : #define TMC_RAMP_DT_SPEC_GET(node)                                              \
     135             :         {                                                                       \
     136             :                 .vstart = DT_PROP(node, vstart),                                \
     137             :                 .v1 = DT_PROP(node, v1),                                        \
     138             :                 .vmax = DT_PROP(node, vmax),                                    \
     139             :                 .a1 = DT_PROP(node, a1),                                        \
     140             :                 .amax = DT_PROP(node, amax),                                    \
     141             :                 .d1 = DT_PROP(node, d1),                                        \
     142             :                 .dmax = DT_PROP(node, dmax),                                    \
     143             :                 .vstop = DT_PROP(node, vstop),                                  \
     144             :                 .tzerowait = DT_PROP(node, tzerowait),                          \
     145             :                 .vcoolthrs = DT_PROP(node, vcoolthrs),                          \
     146             :                 .vhigh = DT_PROP(node, vhigh),                                  \
     147             :                 .iholdrun = (TMC5XXX_IRUN(DT_PROP(node, irun)) |                \
     148             :                              TMC5XXX_IHOLD(DT_PROP(node, ihold)) |              \
     149             :                              TMC5XXX_IHOLDDELAY(DT_PROP(node, iholddelay))),    \
     150             :         }
     151             : 
     152             : /**
     153             :  * @brief Configure Trinamic Stepper Ramp Generator
     154             :  *
     155             :  * @param dev Pointer to the stepper motor controller instance
     156             :  * @param ramp_data Pointer to a struct containing the required ramp parameters
     157             :  *
     158             :  * @retval -EIO General input / output error
     159             :  * @retval -ENOSYS If not implemented by device driver
     160             :  * @retval 0 Success
     161             :  */
     162           1 : int tmc5041_stepper_set_ramp(const struct device *dev,
     163             :                              const struct tmc_ramp_generator_data *ramp_data);
     164             : 
     165             : /**
     166             :  * @}
     167             :  */
     168             : 
     169             : #ifdef __cplusplus
     170             : }
     171             : #endif
     172             : 
     173             : #endif /* ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_ */

Generated by: LCOV version 1.14