blob: 02ed5d424b2f2c9af0d1f97a8a932227b29dee1b [file] [view]
# Zephyr EC Battery
[TOC]
## Overview
The battery is the rechargeable internal power source for the device.
## Kconfig Options
`CONFIG_PLATFORM_EC_BATTERY` enables battery support in the EC application.
Refer to [Kconfig.battery] for all sub-options controlling battery behavior.
## Devicetree Nodes
### How to enable batteries on a board
#### Enable battery feature configs
Add battery configs to either the [`program.conf`] or [`project.conf`] file for
your project.
Example:
```
# Battery
CONFIG_PLATFORM_EC_BATTERY=y
CONFIG_PLATFORM_EC_BATTERY_SMART=y
CONFIG_PLATFORM_EC_BATTERY_FUEL_GAUGE=y
CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y
CONFIG_PLATFORM_EC_BATTERY_HW_PRESENT_CUSTOM=y
CONFIG_PLATFORM_EC_BATTERY_REVIVE_DISCONNECT=y
```
#### Add devicetree nodes
##### Add batteries devicetree node to the board overlay's root node
Example:
```
batteries {
default_battery: vendor_part {
compatible = "vendor,part";
};
vendor2_part2 {
compatible = "vendor2,part2";
};
};
```
Here `vendor_part` will be the default battery type. If this [*node label*] is
present in the overlay, the [DEFAULT_BATTERY_TYPE] is set in the battery shim
code with the labeled battery type. The `vendor` and `part` references must
match an existing battery defined in [battery bindings directory].
##### Add the battery present GPIO node as a child of `named-gpios`
Example:
```
named-gpios {
compatible = "named-gpios";
...
...
ec_batt_pres_odl {
gpios = <{SOME GPIO} GPIO_INPUT>;
};
...
...
};
```
See the [Zephyr gpios] doc for more information on the `named-gpios` node.
##### Add a battery node as a child of `named-i2c-ports`
Example:
```
named-i2c-ports {
compatible = "named-i2c-ports";
...
...
battery {
i2c-port = <{i2c_phandle}>;
remote-port = <{I2C_PASSTHRU-PORT-NUMBER}>;
enum-names = "I2C_PORT_BATTERY";
};
...
...
}
```
Most battery fuel gauges support operation of only 100 KHz on the I2C bus, so
ensure the clock-frequency for the bus is set appropriately. See the
[Zephyr I2C] doc for more information on the `named-i2c-ports` node.
Refer to the [cros-ec-i2c-port-base.yaml] child-binding file for details about
each property.
[Example CL enabling batteries on a board]
### How to create a new battery
+ Add `vendor,part` to [battery-smart enum]
+ Add `vendor,part.yaml` to the [battery bindings directory] beginning with:
```
description: "VENDOR PART"
compatible: "vendor,part"
include: battery-smart.yaml
properties:
enum-name:
type: string
default: "vendor,part"
```
Refer to the vendor's datasheet to set all the fuel gauge and battery properties
required in the `vendor,part.yaml` file.
[Example CL adding a new battery]
## Board Specific Code
Enabling [CONFIG_PLATFORM_EC_BATTERY_PRESENT_CUSTOM] requires the board to provide a
custom `battery_is_present()` function.
## Threads
Battery support alone does not enable any threads. However, the charger [task]
requires the battery module for correct operation.
## Testing and Debugging
### EC Console Commands
#### battery
The `battery` [EC console command] may be invoked to check battery information
on a flashed board.
Example output of `uart:~$ battery`:
```
Status: 0x00e0 FULL DCHG INIT
Param flags:00000002
Temp: 0x0b69 = 292.1 K (19.0 C)
V: 0x2ffc = 12284 mV
V-desired: 0x0000 = 0 mV
I: 0x0000 = 0 mA
I-desired: 0x0000 = 0 mA
Charging: Not Allowed
Charge: 96 %
Display: 98.7 %
Manuf: LGC
Device: AC17A8M
Chem: LION
Serial: 0xd3b3
V-design: 0x2d1e = 11550 mV
Mode: 0x6001
Abs charge:73 %
Remaining: 3901 mAh
Cap-full: 4074 mAh
Design: 5360 mAh
Time-full: 0h:0
Empty: 0h:0
full_factor:0.97
shutdown_soc:4 %
```
#### pwr_avg
The `pwr_avg` [EC console command] logs the battery charging rate by querying
the battery fuel gauge driver.
Example output of `uart:~$ pwr_avg`:
Charging
```
mv = 13073
ma = 439
mw = 573
```
Discharging
```
mv = 12824
ma = -146
mw = -1872
```
Note: A fully charged board may report `ma = 0` and `mw = 0` average rates.
#### chgstate
The `chgstate` [EC console command] may be invoked to debug and manipulate machine
charging state.
Example output of `uart:~$ chgstate`:
```
state = charge
ac = 1
batt_is_charging = 1
chg.*:
voltage = 13200mV
current = 0mA
input_current = 3000mA
status = 0xc010
option = 0x2830004
flags = 0x0
batt.*:
temperature = 26C
state_of_charge = 100%
voltage = 13037mV
current = 0mA
desired_voltage = 0mV
desired_current = 0mA
flags = 0x2
remaining_capacity = 4436mAh
full_capacity = 4436mAh
is_present = YES
requested_voltage = 0mV
requested_current = 0mA
chg_ctl_mode = 0
manual_voltage = -1
manual_current = -1
user_current_limit = -1mA
battery_seems_to_be_dead = 0
battery_seems_to_be_disconnected = 0
battery_was_removed = 0
debug output = off
```
### AP Console Commands (ectool)
#### chargestate
The `chargestate` [ectool] command may be invoked to debug and manipulate
machine charging state.
Usage output of `uart: # ectool chargestate`:
```
Usage:
chargestate show - show current state
chargestate param NUM [VALUE] - get/set param NUM
chargestate param help - show known param NUMs
```
<!-- Reference Links -->
[CONFIG_PLATFORM_EC_BATTERY_PRESENT_CUSTOM]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/ec/zephyr/Kconfig.battery?q=%22PLATFORM_EC_BATTERY_PRESENT_CUSTOM%22&ss=chromiumos
[DEFAULT_BATTERY_TYPE]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/ec/zephyr/shim/src/battery.c?q=%22DEFAULT_BATTERY_TYPE%22&ss=chromiumos
[EC console command]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/README.md#useful-ec-console-commands
[Example CL adding a new battery]: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3312506/
[Example CL enabling batteries on a board]: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3200068/
[Kconfig.battery]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/ec/zephyr/Kconfig.battery
[Zephyr I2C]: zephyr_i2c.md#Mapping-legacy-I2C-port-numbers-to-Zephyr-devicetree-nodes
[Zephyr gpios]: zephyr_gpio.md#Devicetree-Nodes
[battery bindings directory]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/ec/zephyr/dts/bindings/battery/
[battery-smart enum]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/ec/zephyr/dts/bindings/battery/battery-smart.yaml?q=%22enum:%22&ss=chromiumos
[cros-ec-i2c-port-base.yaml]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/ec/zephyr/dts/bindings/i2c/cros-ec-i2c-port-base.yaml
[ectool]: ../ap-ec-comm.md
[task]: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/ec/zephyr/shim/include/shimmed_task_id.h
[*node label*]: https://docs.zephyrproject.org/latest/build/dts/intro.html#dt-node-labels
[`program.conf`]: ./project_config.md#program_conf
[`project.conf`]: ./project_config.md#project_conf