LCOV - code coverage report
Current view: top level - zephyr/drivers/adc - current_sense_amplifier.h Coverage Total Hit
Test: new.info Lines: 16.7 % 12 2
Test Date: 2025-09-05 20:47:19

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2023 The ChromiumOS Authors
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : #ifndef ZEPHYR_INCLUDE_DRIVERS_ADC_CURRENT_SENSE_AMPLIFIER_H_
       8              : #define ZEPHYR_INCLUDE_DRIVERS_ADC_CURRENT_SENSE_AMPLIFIER_H_
       9              : 
      10              : #include <zephyr/drivers/adc.h>
      11              : #include <zephyr/drivers/gpio.h>
      12              : 
      13            0 : struct current_sense_amplifier_dt_spec {
      14            0 :         struct adc_dt_spec port;
      15            0 :         struct gpio_dt_spec power_gpio;
      16            0 :         uint32_t sense_milli_ohms;
      17            0 :         uint16_t sense_gain_mult;
      18            0 :         uint16_t sense_gain_div;
      19            0 :         uint16_t noise_threshold;
      20            0 :         int16_t zero_current_voltage_mv;
      21            0 :         bool enable_calibration;
      22              : };
      23              : 
      24              : /**
      25              :  * @brief Get current sensor information from devicetree.
      26              :  *
      27              :  * This returns a static initializer for a @p current_sense_amplifier_dt_spec structure
      28              :  * given a devicetree node.
      29              :  *
      30              :  * @param node_id Devicetree node identifier.
      31              :  *
      32              :  * @return Static initializer for an current_sense_amplifier_dt_spec structure.
      33              :  */
      34            1 : #define CURRENT_SENSE_AMPLIFIER_DT_SPEC_GET(node_id)                                               \
      35              :         {                                                                                          \
      36              :                 .port = ADC_DT_SPEC_GET(node_id),                                                  \
      37              :                 .power_gpio = GPIO_DT_SPEC_GET_OR(node_id, power_gpios, {0}),                      \
      38              :                 .sense_milli_ohms = DT_PROP(node_id, sense_resistor_milli_ohms),                   \
      39              :                 .sense_gain_mult = DT_PROP(node_id, sense_gain_mult),                              \
      40              :                 .sense_gain_div = DT_PROP(node_id, sense_gain_div),                                \
      41              :                 .noise_threshold = DT_PROP(node_id, zephyr_noise_threshold),                       \
      42              :                 .zero_current_voltage_mv = DT_PROP(node_id, zero_current_voltage_mv),              \
      43              :                 .enable_calibration = DT_PROP_OR(node_id, enable_calibration, false),              \
      44              :         }
      45              : 
      46              : /**
      47              :  * @brief Calculates the actual amperage from the measured voltage
      48              :  *
      49              :  * @param[in] spec current sensor specification from Devicetree.
      50              :  * @param[in,out] v_to_i Pointer to the measured voltage in millivolts on input, and the
      51              :  * corresponding scaled current value in milliamps on output.
      52              :  */
      53              : static inline void
      54            1 : current_sense_amplifier_scale_dt(const struct current_sense_amplifier_dt_spec *spec,
      55              :                                  int32_t *v_to_i)
      56              : {
      57              :         /* store in a temporary 64 bit variable to prevent overflow during calculation */
      58              :         int64_t tmp = *v_to_i;
      59              : 
      60              :         /* (INT32_MAX * 1000 * UINT16_MAX) < INT64_MAX
      61              :          * Therefore all multiplications can be done before divisions, preserving resolution.
      62              :          */
      63              :         tmp = tmp - spec->zero_current_voltage_mv;
      64              :         tmp = tmp * 1000 * spec->sense_gain_div / spec->sense_milli_ohms / spec->sense_gain_mult;
      65              : 
      66              :         *v_to_i = (int32_t)tmp;
      67              : }
      68              : 
      69              : #endif /* ZEPHYR_INCLUDE_DRIVERS_ADC_CURRENT_SENSE_AMPLIFIER_H_ */
        

Generated by: LCOV version 2.0-1