Goldfish battery是android模拟器中虚拟的电池设备,在qemu中实现。android内核中加入的对应驱动程序。
涉及的相关代码文件为:
$QEMU/hw/android/goldfish/battery.c
$QEMU/hw/power_supply.h
$KERNEL/drivers/power/goldfish_battery.c
设备属性:
name: goldfish_battery
Id: -1
IrqCount: 1
I/O Registers:
0x00 INT_STATUS R: 读取battery和A/C状态。
0x04 INT_ENABLE W: 开启和关闭IRQ。
0x08 AC_ONLINE R: 读取电源连接状态。
0x0c STATUS R: 读取电池状态(充电、未充电)。
0x10 HEALTH R: 读取电池健康状态(良好、过热等)。
0x14 PRESENT R: 是否存在电池,1存在,0不存在。
0x18 CAPACITY R: 读取电池充电百分比。
qemu的simple device上报电池的状态,并上报电池是否处于充电状态。Goldfish battery使用单个IRQ通知内核电池状态或是否充电中,当电池状态变化或充电状态变化时,内核执行IO_READ(INT_STATUS)命令,该命令返回2-bit的值:
bit 0: 设置1,表示电池状态发生了变化。
bit 1: 设置1,表示充电状态发生了变化。
寄存器状态位:
IO_READ(AC_ONLINE),返回1表示正在充电,返回0表示未充电。
IO_READ(CAPACITY)获得电池充电的百分比,范围是0-100。
IO_READ(STATUS) 返回下面状态值:
0x00 UNKNOWN 电池状态未知。
0x01 CHARGING 正在充电。
0x02 DISCHARGING 正在断开充电。
0x03 NOT_CHARGING 未充电。
IO_READ(HEALTH) 返回下面状态值:
0x00 UNKNOWN 电池健康状态未知。
0x01 GOOD 电池健康状态良好;
0x02 OVERHEATING 电池过热。
0x03 DEAD 电池死了。
0x04 OVERVOLTAGE 电压过高。
0x05 UNSPEC_FAILURE 电池出现未指明的故障。
内核可以使用IO_WRITE(INT_ENABLE, <flags>)选择在哪种状态下激发IRQ,<flags>是一个2-bit的INT_STATUS。