|
6 | 6 |
|
7 | 7 | #include <zephyr/drivers/adc.h>
|
8 | 8 |
|
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) |
11 | 54 | {
|
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 |
| - }; |
39 | 55 | int rv = -EINVAL;
|
40 | 56 |
|
41 | 57 | if ((uint8_t)gain < ARRAY_SIZE(gains)) {
|
|
0 commit comments