LCOV - code coverage report
Current view: top level - zephyr/drivers/adc - current_sense_amplifier.h Hit Total Coverage
Test: new.info Lines: 2 9 22.2 %
Date: 2025-01-02 12:14:04

          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 :         const struct adc_dt_spec port;
      15           0 :         uint32_t sense_milli_ohms;
      16           0 :         uint16_t sense_gain_mult;
      17           0 :         uint16_t sense_gain_div;
      18           0 :         struct gpio_dt_spec power_gpio;
      19             : };
      20             : 
      21             : /**
      22             :  * @brief Get current sensor information from devicetree.
      23             :  *
      24             :  * This returns a static initializer for a @p current_sense_amplifier_dt_spec structure
      25             :  * given a devicetree node.
      26             :  *
      27             :  * @param node_id Devicetree node identifier.
      28             :  *
      29             :  * @return Static initializer for an current_sense_amplifier_dt_spec structure.
      30             :  */
      31           1 : #define CURRENT_SENSE_AMPLIFIER_DT_SPEC_GET(node_id)                                               \
      32             :         {                                                                                          \
      33             :                 .port = ADC_DT_SPEC_GET(node_id),                                                  \
      34             :                 .sense_milli_ohms = DT_PROP(node_id, sense_resistor_milli_ohms),                   \
      35             :                 .sense_gain_mult = DT_PROP(node_id, sense_gain_mult),                              \
      36             :                 .sense_gain_div = DT_PROP(node_id, sense_gain_div),                                \
      37             :                 .power_gpio = GPIO_DT_SPEC_GET_OR(node_id, power_gpios, {0}),                      \
      38             :         }
      39             : 
      40             : /**
      41             :  * @brief Calculates the actual amperage from the measured voltage
      42             :  *
      43             :  * @param[in] spec current sensor specification from Devicetree.
      44             :  * @param[in,out] v_to_i Pointer to the measured voltage in millivolts on input, and the
      45             :  * corresponding scaled current value in milliamps on output.
      46             :  */
      47             : static inline void
      48           1 : current_sense_amplifier_scale_dt(const struct current_sense_amplifier_dt_spec *spec,
      49             :                                  int32_t *v_to_i)
      50             : {
      51             :         /* store in a temporary 64 bit variable to prevent overflow during calculation */
      52             :         int64_t tmp = *v_to_i;
      53             : 
      54             :         /* (INT32_MAX * 1000 * UINT16_MAX) < INT64_MAX
      55             :          * Therefore all multiplications can be done before divisions, preserving resolution.
      56             :          */
      57             :         tmp = tmp * 1000 * spec->sense_gain_div / spec->sense_milli_ohms / spec->sense_gain_mult;
      58             : 
      59             :         *v_to_i = (int32_t)tmp;
      60             : }
      61             : 
      62             : #endif /* ZEPHYR_INCLUDE_DRIVERS_ADC_CURRENT_SENSE_AMPLIFIER_H_ */

Generated by: LCOV version 1.14