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_VOLTAGE_DIVIDER_H_ 8 : #define ZEPHYR_INCLUDE_DRIVERS_ADC_VOLTAGE_DIVIDER_H_ 9 : 10 : #include <zephyr/drivers/adc.h> 11 : 12 0 : struct voltage_divider_dt_spec { 13 0 : const struct adc_dt_spec port; 14 0 : uint32_t full_ohms; 15 0 : uint32_t output_ohms; 16 : }; 17 : 18 : /** 19 : * @brief Get voltage divider information from devicetree. 20 : * 21 : * This returns a static initializer for a @p voltage_divider_dt_spec structure 22 : * given a devicetree node. 23 : * 24 : * @param node_id Devicetree node identifier. 25 : * 26 : * @return Static initializer for an voltage_divider_dt_spec structure. 27 : */ 28 1 : #define VOLTAGE_DIVIDER_DT_SPEC_GET(node_id) \ 29 : { \ 30 : .port = ADC_DT_SPEC_GET(node_id), \ 31 : .full_ohms = DT_PROP_OR(node_id, full_ohms, 0), \ 32 : .output_ohms = DT_PROP(node_id, output_ohms), \ 33 : } 34 : 35 : /** 36 : * @brief Calculates the actual voltage from the measured voltage 37 : * 38 : * @param[in] spec voltage divider specification from Devicetree. 39 : * @param[in,out] v_to_v Pointer to the measured voltage on input, and the 40 : * corresponding scaled voltage value on output. 41 : * 42 : * @retval 0 on success 43 : * @retval -ENOTSUP if "full_ohms" is not specified 44 : */ 45 1 : static inline int voltage_divider_scale_dt(const struct voltage_divider_dt_spec *spec, 46 : int32_t *v_to_v) 47 : { 48 : /* cannot be scaled if "full_ohms" is not specified */ 49 : if (spec->full_ohms == 0) { 50 : return -ENOTSUP; 51 : } 52 : 53 : /* voltage scaled by voltage divider values using DT binding */ 54 : *v_to_v = (int64_t)*v_to_v * spec->full_ohms / spec->output_ohms; 55 : 56 : return 0; 57 : } 58 : 59 : #endif /* ZEPHYR_INCLUDE_DRIVERS_ADC_VOLTAGE_DIVIDER_H_ */