高通SDM450 ADC读取电池驱动调试

由于项目需要,使用的sdm450模块不带PMIC电源管理的,而项目又需要接电池使用,所以硬件把电池端接到一个ADC口,做了个简单的电池电路,通过ADC读取数值来确定电池电压,然后换算电池电量。
在这里插入图片描述

  1. 电池驱动流程
    Android内核中的电池驱动采取的是linux 内核驱动中的 power_supply子系统框架进行上报电池状态,源码位置如下。
    在这里插入图片描述
    power_supply通过sys虚拟文件系统向用户层提供读取电池状态的接口,路径为 /sys/class/power_supply/ , 该目录下通常会有 ac , battery, usb 三个目录,代表给Android系统供电的三种能源类型,其中电池的状态就在battery的目录下,当电池状态变化的时候会通过uevent机制通知上层,然后上层通过读取该目录下相应的值来动态的显示电池状态,上层读取的源码在:system/core/healthd/BatteryMonitor.cpp。
  2. 驱动代码
    驱动代码参考kernel/msm-4.9/drivers/power/supply/下的test_power.c,把电池电量上报到应用层。
    a) 通过power_supply_register注册sys节点在这里插入图片描述
    在这里插入图片描述
    向上层上报电池信息的接口都在.properties回调里实现,ac只需要设置一个online通知应用层是否插入电源在这里插入图片描述
    我们电路上使用一个gpio口的高低电平来判断是否插入
    在这里插入图片描述
    而battery则需要创建status、health、present、capacity等和电池相关的诸多属性,上层通过这些电池属性uevent便可监控电池的当前工作状态在这里插入图片描述
    b) 上报状态
    上报时使用power_supply_changed()接口来通知应用层更新。
    battery电池的状态我这里的设计是通过延时工作队列进行定时上报,每隔10S通知应用层更新一次电池状态
    在这里插入图片描述
    ac由于需要实时的更新,所以采用中断来进行处理,将DC_DET引脚注册成irq,一旦上升沿或者下降沿触发则通知应用层更新状态。在这里插入图片描述
    c) ADC电压获取
    adc引脚PMU_MPP2原来已经配置好了,源码在kernel/msm-4.9/drivers/hwmon/qpnp-adc-voltage.c。
    调试时可通过节点获取到电压值:/sys/class/hwmon/hwmon0/device # cat mpp2_adc
    代码上可设计一个对外获取的接口,供我们的电池驱动使用。
    在这里插入图片描述3.注意点
    a)驱动probe初始化时就需要赋值好capacity等属性,不然OTA升级时进入recover模式时,读到的电压值过低会不允许升级
    [ 1.232049] charge_status 1, charged 1, status SUCCESS, capacity 0
    [ 1.236889] battery capacity is not enough for installing package, needed is 20%
    在这里插入图片描述

b) sdm450的PMU_MPP2的adc检测范围是0-1.7V,电池设计时如果电池大于1.7V需要分压处理
c)sdm450进行分压时,需要注意分压电阻,实测时发现如果分压电阻是k级的,adc值读取还是较为准确的,如果分压电阻是M级的,adc值读取实际有20%左右的误差,该问题询问原厂无果,猜测芯片PMU_MPP2引脚内部有M级的等效电阻导致。
d)由于使用到qpnp-adc-voltage.c驱动的读adc接口,所以电池驱动的加载顺序应该在qpnp-adc-voltage.c的后面,qpnp-adc-voltage.c是module_init加载,那我们的电池驱动可以是late_initcall来加载。
e)带PMIC的充电源码在kernel/msm-4.9/drivers/power/supply/qcom/qpnp-vm-bms.c

4.电池驱动流程的设计还是比较简单的,需要长时间调试的还是电池曲线的问题,流程较为繁琐后面再分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值