xref: /aosp_15_r20/external/perfetto/docs/data-sources/battery-counters.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Power data sources
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerOn Android Perfetto bundles data sources to retrieve power
4*6dbdd20aSAndroid Build Coastguard Workercounters from the device power management units (where supported).
5*6dbdd20aSAndroid Build Coastguard Worker
6*6dbdd20aSAndroid Build Coastguard Worker## Battery counters
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard Worker_This data source has been introduced in Android 10 (Q) and requires the
9*6dbdd20aSAndroid Build Coastguard Workerpresence of power-management hardware on the device. This is available on
10*6dbdd20aSAndroid Build Coastguard Workermost Google Pixel smartphones._
11*6dbdd20aSAndroid Build Coastguard Worker
12*6dbdd20aSAndroid Build Coastguard WorkerModern smartphones are equipped with a power monitoring IC which is able to
13*6dbdd20aSAndroid Build Coastguard Workermeasure the charge flowing in and out of the battery. This allows Perfetto to
14*6dbdd20aSAndroid Build Coastguard Workerobserve the total and instantaneous charge drained from the battery by the
15*6dbdd20aSAndroid Build Coastguard Workeroverall device (the union of SoC, display, radios and all other hardware
16*6dbdd20aSAndroid Build Coastguard Workerunits).
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard WorkerA simplified block diagram:
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/battery-counters.png "Schematic diagram of battery counters")
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard WorkerThese counters report:
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard Worker* The remaining battery capacity in %.
25*6dbdd20aSAndroid Build Coastguard Worker* The remaining battery charge in microampere-hours (µAh).
26*6dbdd20aSAndroid Build Coastguard Worker* The instantaneous (typically the average over a small window of time) current
27*6dbdd20aSAndroid Build Coastguard Worker  in microampere (µA)
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard WorkerThe presence and the resolution of these counters depends on the device
30*6dbdd20aSAndroid Build Coastguard Workermanufacturer. At the platform level this data is obtained polling the
31*6dbdd20aSAndroid Build Coastguard WorkerAndroid [IHealth HAL][health-hal].
32*6dbdd20aSAndroid Build Coastguard WorkerFor more details on HW specs and resolution see
33*6dbdd20aSAndroid Build Coastguard Worker[Measuring Device Power](https://source.android.com/devices/tech/power/device).
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker[health-hal]: https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/health/2.0/IHealth.hal?q=IHealth
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Worker#### Measuring charge while plugged on USB
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard WorkerBattery counters measure the charge flowing *in* and *out* of
40*6dbdd20aSAndroid Build Coastguard Workerthe battery. If the device is plugged to a USB cable, you will likely observe
41*6dbdd20aSAndroid Build Coastguard Workera positive instantaneous current and an increase of the total charge, denoting
42*6dbdd20aSAndroid Build Coastguard Workerthe fact that charge is flowing in the battery (i.e. charging it) rather
43*6dbdd20aSAndroid Build Coastguard Workerthan out.
44*6dbdd20aSAndroid Build Coastguard Worker
45*6dbdd20aSAndroid Build Coastguard WorkerThis can make measurements in lab settings problematic. The known workarounds
46*6dbdd20aSAndroid Build Coastguard Workerfor this are:
47*6dbdd20aSAndroid Build Coastguard Worker
48*6dbdd20aSAndroid Build Coastguard Worker* Using specialized USB hubs that allow to electrically disconnect the USB ports
49*6dbdd20aSAndroid Build Coastguard Worker  from the host side. This allows to effectively disconnect the phone while the
50*6dbdd20aSAndroid Build Coastguard Worker  tests are running.
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Worker* On rooted phones the power management IC driver allows to disconnect the USB
53*6dbdd20aSAndroid Build Coastguard Worker  charging while keeping the USB data link active. This feature is
54*6dbdd20aSAndroid Build Coastguard Worker  SoC-specific, is undocumented and not exposed through any HAL.
55*6dbdd20aSAndroid Build Coastguard Worker  For instance on a Pixel 2 this can be achieved running, as root:
56*6dbdd20aSAndroid Build Coastguard Worker  `echo 1 > /sys/devices/soc/800f000.qcom,spmi/spmi-0/spmi0-02/800f000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/battery/input_suspend`.
57*6dbdd20aSAndroid Build Coastguard Worker  Note that in most devices the kernel USB driver holds a wakelock to keep the
58*6dbdd20aSAndroid Build Coastguard Worker  USB data link active, so the device will never fully suspend even when turning
59*6dbdd20aSAndroid Build Coastguard Worker  the screen off.
60*6dbdd20aSAndroid Build Coastguard Worker
61*6dbdd20aSAndroid Build Coastguard Worker### UI
62*6dbdd20aSAndroid Build Coastguard Worker
63*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/battery-counters-ui.png)
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker### SQL
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard Worker```sql
68*6dbdd20aSAndroid Build Coastguard Workerselect ts, t.name, value from counter as c left join counter_track t on c.track_id = t.id
69*6dbdd20aSAndroid Build Coastguard Worker```
70*6dbdd20aSAndroid Build Coastguard Worker
71*6dbdd20aSAndroid Build Coastguard Workerts | name | value
72*6dbdd20aSAndroid Build Coastguard Worker---|------|------
73*6dbdd20aSAndroid Build Coastguard Worker338297039804951 | batt.charge_uah | 2085000
74*6dbdd20aSAndroid Build Coastguard Worker338297039804951 | batt.capacity_pct | 75
75*6dbdd20aSAndroid Build Coastguard Worker338297039804951 | batt.current_ua | -1469687
76*6dbdd20aSAndroid Build Coastguard Worker338297145212097 | batt.charge_uah | 2085000
77*6dbdd20aSAndroid Build Coastguard Worker338297145212097 | batt.capacity_pct | 75
78*6dbdd20aSAndroid Build Coastguard Worker338297145212097 | batt.current_ua | -1434062
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig
81*6dbdd20aSAndroid Build Coastguard Worker
82*6dbdd20aSAndroid Build Coastguard WorkerTrace proto:
83*6dbdd20aSAndroid Build Coastguard Worker[BatteryCounters](/docs/reference/trace-packet-proto.autogen#BatteryCounters)
84*6dbdd20aSAndroid Build Coastguard Worker
85*6dbdd20aSAndroid Build Coastguard WorkerConfig proto:
86*6dbdd20aSAndroid Build Coastguard Worker[AndroidPowerConfig](/docs/reference/trace-config-proto.autogen#AndroidPowerConfig)
87*6dbdd20aSAndroid Build Coastguard Worker
88*6dbdd20aSAndroid Build Coastguard WorkerSample config (Android):
89*6dbdd20aSAndroid Build Coastguard Worker
90*6dbdd20aSAndroid Build Coastguard Worker```protobuf
91*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
92*6dbdd20aSAndroid Build Coastguard Worker    config {
93*6dbdd20aSAndroid Build Coastguard Worker        name: "android.power"
94*6dbdd20aSAndroid Build Coastguard Worker        android_power_config {
95*6dbdd20aSAndroid Build Coastguard Worker            battery_poll_ms: 250
96*6dbdd20aSAndroid Build Coastguard Worker            battery_counters: BATTERY_COUNTER_CAPACITY_PERCENT
97*6dbdd20aSAndroid Build Coastguard Worker            battery_counters: BATTERY_COUNTER_CHARGE
98*6dbdd20aSAndroid Build Coastguard Worker            battery_counters: BATTERY_COUNTER_CURRENT
99*6dbdd20aSAndroid Build Coastguard Worker            battery_counters: BATTERY_COUNTER_VOLTAGE
100*6dbdd20aSAndroid Build Coastguard Worker        }
101*6dbdd20aSAndroid Build Coastguard Worker    }
102*6dbdd20aSAndroid Build Coastguard Worker}
103*6dbdd20aSAndroid Build Coastguard Worker```
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard WorkerSample Config (Chrome OS or Linux):
106*6dbdd20aSAndroid Build Coastguard Worker
107*6dbdd20aSAndroid Build Coastguard Worker```protobuf
108*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
109*6dbdd20aSAndroid Build Coastguard Worker    config {
110*6dbdd20aSAndroid Build Coastguard Worker        name: "linux.sysfs_power"
111*6dbdd20aSAndroid Build Coastguard Worker    }
112*6dbdd20aSAndroid Build Coastguard Worker}
113*6dbdd20aSAndroid Build Coastguard Worker```
114*6dbdd20aSAndroid Build Coastguard Worker
115*6dbdd20aSAndroid Build Coastguard Worker## {#odpm} On-Device Power Rails Monitor (ODPM)
116*6dbdd20aSAndroid Build Coastguard Worker
117*6dbdd20aSAndroid Build Coastguard Worker_This data source has been introduced in Android 10 (Q) and requires the
118*6dbdd20aSAndroid Build Coastguard Workerdedicated hardware on the device. This hardware is not yet available on
119*6dbdd20aSAndroid Build Coastguard Workermost production phones._
120*6dbdd20aSAndroid Build Coastguard Worker
121*6dbdd20aSAndroid Build Coastguard WorkerRecent version of Android introduced the support for more advanced power
122*6dbdd20aSAndroid Build Coastguard Workermonitoring at the hardware subsystem level, known as
123*6dbdd20aSAndroid Build Coastguard Worker"On-Device Power Rail Monitors" (ODPMs).
124*6dbdd20aSAndroid Build Coastguard WorkerThese counters measure the energy drained by (groups of) hardware units.
125*6dbdd20aSAndroid Build Coastguard Worker
126*6dbdd20aSAndroid Build Coastguard WorkerUnlike the battery counters, they are not affected by the charging/discharging
127*6dbdd20aSAndroid Build Coastguard Workerstate of the battery, because they measure power downstream of the battery.
128*6dbdd20aSAndroid Build Coastguard Worker
129*6dbdd20aSAndroid Build Coastguard WorkerThe presence and the resolution of power rail counters depends on the device
130*6dbdd20aSAndroid Build Coastguard Workermanufacturer. At the platform level this data is obtained polling the
131*6dbdd20aSAndroid Build Coastguard WorkerAndroid [IPowerStats HAL][power-hal].
132*6dbdd20aSAndroid Build Coastguard Worker
133*6dbdd20aSAndroid Build Coastguard WorkerGooglers: See [go/power-rails-internal-doc](http://go/power-rails-internal-doc)
134*6dbdd20aSAndroid Build Coastguard Workerfor instructions on how to change the default rail selection on Pixel devices.
135*6dbdd20aSAndroid Build Coastguard Worker
136*6dbdd20aSAndroid Build Coastguard Worker[power-hal]: https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/power/stats/1.0/IPowerStats.hal
137*6dbdd20aSAndroid Build Coastguard Worker
138*6dbdd20aSAndroid Build Coastguard WorkerSimplified block diagram:
139*6dbdd20aSAndroid Build Coastguard Worker
140*6dbdd20aSAndroid Build Coastguard Worker![](/docs/images/power-rails.png "Block diagram of ODPMs")
141*6dbdd20aSAndroid Build Coastguard Worker
142*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig
143*6dbdd20aSAndroid Build Coastguard Worker
144*6dbdd20aSAndroid Build Coastguard WorkerTrace proto:
145*6dbdd20aSAndroid Build Coastguard Worker[PowerRails](/docs/reference/trace-packet-proto.autogen#PowerRails)
146*6dbdd20aSAndroid Build Coastguard Worker
147*6dbdd20aSAndroid Build Coastguard WorkerConfig proto:
148*6dbdd20aSAndroid Build Coastguard Worker[AndroidPowerConfig](/docs/reference/trace-config-proto.autogen#AndroidPowerConfig)
149*6dbdd20aSAndroid Build Coastguard Worker
150*6dbdd20aSAndroid Build Coastguard WorkerSample config:
151*6dbdd20aSAndroid Build Coastguard Worker
152*6dbdd20aSAndroid Build Coastguard Worker```protobuf
153*6dbdd20aSAndroid Build Coastguard Workerdata_sources: {
154*6dbdd20aSAndroid Build Coastguard Worker    config {
155*6dbdd20aSAndroid Build Coastguard Worker        name: "android.power"
156*6dbdd20aSAndroid Build Coastguard Worker        android_power_config {
157*6dbdd20aSAndroid Build Coastguard Worker            battery_poll_ms: 250
158*6dbdd20aSAndroid Build Coastguard Worker            collect_power_rails: true
159*6dbdd20aSAndroid Build Coastguard Worker            # Note: it is possible to specify both rails and battery counters
160*6dbdd20aSAndroid Build Coastguard Worker            # in this section.
161*6dbdd20aSAndroid Build Coastguard Worker        }
162*6dbdd20aSAndroid Build Coastguard Worker    }
163*6dbdd20aSAndroid Build Coastguard Worker}
164*6dbdd20aSAndroid Build Coastguard Worker```
165*6dbdd20aSAndroid Build Coastguard Worker
166*6dbdd20aSAndroid Build Coastguard Worker## Related data sources
167*6dbdd20aSAndroid Build Coastguard Worker
168*6dbdd20aSAndroid Build Coastguard WorkerSee also the [CPU -> Frequency scaling](cpu-freq.md) data source.
169