一、linux充电驱动代码框架:
- APP 层
该部分属于电量上报的最后的环节。其主要工作是:监听系统广播并对 UI 作出相应更新,包括电池电量百分比,充电状态,低电提醒,led 指示灯,异常提醒等 - FrameWork 层
本层的 Battery 服务使用 Java 代码写成,运行在 FrameWork 中的SystemServer 进程。该系统服务的主要作用是:监听电池信息变化消息,并将该消息以系统广播的形式转发至 Android 系统中各处 - Native 层
Healthd 守护进程属于 Android Native 层的一个系统服务,负责接受 Kernel Driver 层上报的 uevent 事件,对电池信息和充电状态实时监控。 - Kernel 层
本层属于电池的驱动部分,由 Charger-manager 驱动、充电 IC 驱动、Fuel 驱动构成,负责与硬件交互,注册 Power supply 属性,并生成 uevent 上报 Native 层。包含充电状态管理、电量统计与更新 - 关机充电
关机充电单独启动的一个 linux 应用,通过系统调用直接读取 sysfs 来获取电池信息,init 进程会根据启动模式来启动 charge 服务,不会启动 android 相关进程
二、power supply:
psy是linux供电系统抽象出来的一个 子系统,它是一个中间层,在kernel中属于设备驱动的一部分,负责硬件信息检测更新和对用户空间汇报各类信息变化。对它汇报的信息,抽象出来一个枚举类型:power_supply_property;
驱动层有两大模块:
- 1、电池模块:
- 2、充放电模块:
这两部分都处理硬件相关的逻辑,在硬件发声变化时,触发对应的中断处理,然后会更新对应的psy属性的节点值,然后hal层会去读取这些节点,并在用户层做相应的更新。
三、power supply核心数据结构体:
1、struct power_supply
2、struct power_supply_desc:该描述符定义了psy的属性,包括它的type,psy包含的属性列表和属性个数,等
3、power_supply_batteryinfo:管理静态电池参数的结构
四、相关结构函数:
1、power_supply_core.c文件主要负责设备状态变化逻辑
power_supply_sysfs.c文件主要负责文件节点相关信息变化逻辑
2、power_supply_changed:驱动中检测到硬件变化时调用,通过此函数会去调度起psy中的changed work;该队列会去发送notify和uevent进行changed上报
3、power_supply_register:注册一个psy设备,在probe时调用注册
4、power_supply_get_by_name:通过名字去获取一个psy指针
5、power_supply_put:释放获取到的psy指针,和power_supply_get_by_name成对使用
五、充电驱动描述:
kernel驱动可以有三部分:charger manager、 fuel gauge、 charger ic ; 此三部分是作为独立的设备驱动,都注册都power_supply下,每一个设备都是单独的psy设备,psy设备之间通过属性相互访问,
fgu和IC其实是服务于CM的,CM不需要知道硬件的任何细节,会获取相应功能的psy设备实例,然后通过psy设备的属性获得想要信息
-
1、CM – charger manager : 充电控制策略层
修复并更新电量百分比
充电流程管理(charging notcharging full充电状态转换管理)
安全管理(OVP health charging-timeout)
温控管理(jeita功能 thermal限流)
电池电量显示策略(充放电曲线)
电池容量管理(容量自学习功能) -
2、FGU–Fuel Gauge:
pmic部分主要负责:
库仑计电量积分
充电器类型获取
电池在位检测
开机电压管理
内阻–温度 容量–温度 等补偿算法 -
3、charger IC:
打开关闭充电
设置充电电流
设置截止充电电流
打开关闭OTG
六、获取电量的方式:
1、内核通过power_supply_register函数注册battery电池psy设备
2、healthd通过power_supply_property接口获取电量:
psy->desc->name = “battery”
psp = POWER_SUPPLY_PROP_CAPACITY
电池在位检测:
psp = POWER_SUPPLY_PROP_PRESENT
七、一个IC的驱动流程: