Skip to content

Commit df92728

Browse files
committed
fuel_gauge: composite: query sources for capacity and soc
Query the configured data sources for capacity and soc information before falling back to the composite fuel gauge configuration. This means the battery properties are no longer required. Signed-off-by: Jordan Yates <jordan@embeint.com>
1 parent 8dccf4c commit df92728

File tree

2 files changed

+32
-22
lines changed

2 files changed

+32
-22
lines changed

drivers/fuel_gauge/composite/fuel_gauge_composite.c

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,25 @@ static int composite_get_prop(const struct device *dev, fuel_gauge_prop_t prop,
9292

9393
switch (prop) {
9494
case FUEL_GAUGE_FULL_CHARGE_CAPACITY:
95-
if (config->charge_capacity_microamp_hours == 0) {
96-
return -ENOTSUP;
95+
rc = composite_channel_get(dev, SENSOR_CHAN_GAUGE_FULL_AVAIL_CAPACITY, &sensor_val);
96+
if (rc == -ENOTSUP) {
97+
if (config->charge_capacity_microamp_hours == 0) {
98+
return -ENOTSUP;
99+
}
100+
val->full_charge_capacity = config->charge_capacity_microamp_hours;
101+
rc = 0;
97102
}
98-
val->full_charge_capacity = config->charge_capacity_microamp_hours;
99103
break;
100104
case FUEL_GAUGE_DESIGN_CAPACITY:
101-
if (config->charge_capacity_microamp_hours == 0) {
102-
return -ENOTSUP;
105+
rc = composite_channel_get(dev, SENSOR_CHAN_GAUGE_FULL_CHARGE_CAPACITY,
106+
&sensor_val);
107+
if (rc == -ENOTSUP) {
108+
if (config->charge_capacity_microamp_hours == 0) {
109+
return -ENOTSUP;
110+
}
111+
val->design_cap = config->charge_capacity_microamp_hours / 1000;
112+
rc = 0;
103113
}
104-
val->full_charge_capacity = config->charge_capacity_microamp_hours / 1000;
105114
break;
106115
case FUEL_GAUGE_VOLTAGE:
107116
sensor_chan = config->fg_channels ? SENSOR_CHAN_GAUGE_VOLTAGE : SENSOR_CHAN_VOLTAGE;
@@ -110,17 +119,24 @@ static int composite_get_prop(const struct device *dev, fuel_gauge_prop_t prop,
110119
break;
111120
case FUEL_GAUGE_ABSOLUTE_STATE_OF_CHARGE:
112121
case FUEL_GAUGE_RELATIVE_STATE_OF_CHARGE:
113-
if (config->ocv_lookup_table[0] == -1) {
114-
return -ENOTSUP;
115-
}
116-
/* Fetch the voltage from the sensor */
117-
sensor_chan = config->fg_channels ? SENSOR_CHAN_GAUGE_VOLTAGE : SENSOR_CHAN_VOLTAGE;
118-
rc = composite_channel_get(dev, sensor_chan, &sensor_val);
119-
voltage = sensor_value_to_micro(&sensor_val);
122+
rc = composite_channel_get(dev, SENSOR_CHAN_GAUGE_STATE_OF_CHARGE, &sensor_val);
120123
if (rc == 0) {
121-
/* Convert voltage to state of charge */
122-
val->relative_state_of_charge =
123-
battery_soc_lookup(config->ocv_lookup_table, voltage) / 1000;
124+
val->absolute_state_of_charge = sensor_val.val1;
125+
} else if (rc == -ENOTSUP) {
126+
if (config->ocv_lookup_table[0] == -1) {
127+
return -ENOTSUP;
128+
}
129+
/* Fetch the voltage from the sensor */
130+
sensor_chan = config->fg_channels ? SENSOR_CHAN_GAUGE_VOLTAGE
131+
: SENSOR_CHAN_VOLTAGE;
132+
rc = composite_channel_get(dev, sensor_chan, &sensor_val);
133+
voltage = sensor_value_to_micro(&sensor_val);
134+
if (rc == 0) {
135+
/* Convert voltage to state of charge */
136+
val->relative_state_of_charge =
137+
battery_soc_lookup(config->ocv_lookup_table, voltage) /
138+
1000;
139+
}
124140
}
125141
break;
126142
case FUEL_GAUGE_CURRENT:

dts/bindings/fuel-gauge/zephyr,fuel-gauge-composite.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,3 @@ properties:
3131
Sources should be queried by the sensor API fuel gauge
3232
channels (SENSOR_CHAN_GAUGE_*), instead of the generic
3333
channels (SENSOR_CHAN_VOLTAGE, etc).
34-
35-
device-chemistry:
36-
required: true
37-
38-
ocv-capacity-table-0:
39-
required: true

0 commit comments

Comments
 (0)