Skip to content

Commit 8ab300d

Browse files
JordanYatesfabiobaltieri
authored andcommitted
adc: 64bit gain inversion function
Add a variant of `adc_gain_invert` that operates on an `int64_t` instead of `int32_t`. Signed-off-by: Jordan Yates <[email protected]>
1 parent 4b52921 commit 8ab300d

File tree

2 files changed

+64
-31
lines changed

2 files changed

+64
-31
lines changed

drivers/adc/adc_common.c

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,52 @@
66

77
#include <zephyr/drivers/adc.h>
88

9-
int adc_gain_invert(enum adc_gain gain,
10-
int32_t *value)
9+
struct gain_desc {
10+
uint8_t mul;
11+
uint8_t div;
12+
};
13+
static const struct gain_desc gains[] = {
14+
[ADC_GAIN_1_6] = {.mul = 6, .div = 1},
15+
[ADC_GAIN_1_5] = {.mul = 5, .div = 1},
16+
[ADC_GAIN_1_4] = {.mul = 4, .div = 1},
17+
[ADC_GAIN_2_7] = {.mul = 7, .div = 2},
18+
[ADC_GAIN_1_3] = {.mul = 3, .div = 1},
19+
[ADC_GAIN_2_5] = {.mul = 5, .div = 2},
20+
[ADC_GAIN_1_2] = {.mul = 2, .div = 1},
21+
[ADC_GAIN_2_3] = {.mul = 3, .div = 2},
22+
[ADC_GAIN_4_5] = {.mul = 5, .div = 4},
23+
[ADC_GAIN_1] = {.mul = 1, .div = 1},
24+
[ADC_GAIN_2] = {.mul = 1, .div = 2},
25+
[ADC_GAIN_3] = {.mul = 1, .div = 3},
26+
[ADC_GAIN_4] = {.mul = 1, .div = 4},
27+
[ADC_GAIN_6] = {.mul = 1, .div = 6},
28+
[ADC_GAIN_8] = {.mul = 1, .div = 8},
29+
[ADC_GAIN_12] = {.mul = 1, .div = 12},
30+
[ADC_GAIN_16] = {.mul = 1, .div = 16},
31+
[ADC_GAIN_24] = {.mul = 1, .div = 24},
32+
[ADC_GAIN_32] = {.mul = 1, .div = 32},
33+
[ADC_GAIN_64] = {.mul = 1, .div = 64},
34+
[ADC_GAIN_128] = {.mul = 1, .div = 128},
35+
};
36+
37+
int adc_gain_invert(enum adc_gain gain, int32_t *value)
38+
{
39+
int rv = -EINVAL;
40+
41+
if ((uint8_t)gain < ARRAY_SIZE(gains)) {
42+
const struct gain_desc *gdp = &gains[gain];
43+
44+
if ((gdp->mul != 0) && (gdp->div != 0)) {
45+
*value = (gdp->mul * *value) / gdp->div;
46+
rv = 0;
47+
}
48+
}
49+
50+
return rv;
51+
}
52+
53+
int adc_gain_invert_64(enum adc_gain gain, int64_t *value)
1154
{
12-
struct gain_desc {
13-
uint8_t mul;
14-
uint8_t div;
15-
};
16-
static const struct gain_desc gains[] = {
17-
[ADC_GAIN_1_6] = {.mul = 6, .div = 1},
18-
[ADC_GAIN_1_5] = {.mul = 5, .div = 1},
19-
[ADC_GAIN_1_4] = {.mul = 4, .div = 1},
20-
[ADC_GAIN_2_7] = {.mul = 7, .div = 2},
21-
[ADC_GAIN_1_3] = {.mul = 3, .div = 1},
22-
[ADC_GAIN_2_5] = {.mul = 5, .div = 2},
23-
[ADC_GAIN_1_2] = {.mul = 2, .div = 1},
24-
[ADC_GAIN_2_3] = {.mul = 3, .div = 2},
25-
[ADC_GAIN_4_5] = {.mul = 5, .div = 4},
26-
[ADC_GAIN_1] = {.mul = 1, .div = 1},
27-
[ADC_GAIN_2] = {.mul = 1, .div = 2},
28-
[ADC_GAIN_3] = {.mul = 1, .div = 3},
29-
[ADC_GAIN_4] = {.mul = 1, .div = 4},
30-
[ADC_GAIN_6] = {.mul = 1, .div = 6},
31-
[ADC_GAIN_8] = {.mul = 1, .div = 8},
32-
[ADC_GAIN_12] = {.mul = 1, .div = 12},
33-
[ADC_GAIN_16] = {.mul = 1, .div = 16},
34-
[ADC_GAIN_24] = {.mul = 1, .div = 24},
35-
[ADC_GAIN_32] = {.mul = 1, .div = 32},
36-
[ADC_GAIN_64] = {.mul = 1, .div = 64},
37-
[ADC_GAIN_128] = {.mul = 1, .div = 128},
38-
};
3955
int rv = -EINVAL;
4056

4157
if ((uint8_t)gain < ARRAY_SIZE(gains)) {

include/zephyr/drivers/adc.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,25 @@ enum adc_gain {
7171
* @retval 0 if the gain was successfully reversed
7272
* @retval -EINVAL if the gain could not be interpreted
7373
*/
74-
int adc_gain_invert(enum adc_gain gain,
75-
int32_t *value);
74+
int adc_gain_invert(enum adc_gain gain, int32_t *value);
75+
76+
/**
77+
* @brief Invert the application of gain to a measurement value.
78+
*
79+
* For example, if the gain passed in is ADC_GAIN_1_6 and the
80+
* referenced value is 10, the value after the function returns is 60.
81+
*
82+
* @param gain the gain used to amplify the input signal.
83+
*
84+
* @param value a pointer to a value that initially has the effect of
85+
* the applied gain but has that effect removed when this function
86+
* successfully returns. If the gain cannot be reversed the value
87+
* remains unchanged.
88+
*
89+
* @retval 0 if the gain was successfully reversed
90+
* @retval -EINVAL if the gain could not be interpreted
91+
*/
92+
int adc_gain_invert_64(enum adc_gain gain, int64_t *value);
7693

7794
/** @brief ADC references. */
7895
enum adc_reference {

0 commit comments

Comments
 (0)