第一部分     qpnq-qg.c

static int qpnp_qg_probe(struct platform_device *pdev)

{

.......

INIT_WORK(&chip->udata_work, process_udata_work);--------------------------------- INIT_WORK会在你定义的udata_work工作队列里面增加一个工作任务,该任务就是process_udata_work

......

}

备注:调用工作队列,添加struct work_struct  udata_work;

static void process_udata_work(struct work_struct *work)

{

......

if (chip->udata.param[QG_SYS_SOC].valid) {

chip->sys_soc = chip->udata.param[QG_SYS_SOC].data;

chip->catch_up_so(chip);------------------------------------PMI会根据电量换算获取当前电池电量-->chip->catch_up_soc

} else {

chip->catch_up_soc = chip->udata.param[QG_SOC].data;

}

qg_scale_soc(chip, false);

......

}

static ssize_t qg_device_write(struct file *file, const char __user *buf,

size_t count, loff_t *ppos)

{

......

schedule_work(&chip->udata_work);---------------------------------------------------将工作结构体变量添加入系统的共享工作队列,添加入队列的工作完成后会自动从队列中删除                                      (schedule_delayed_work(&my_work,tick); //延时tick个滴答后再提交工作)

......

}

第二部分    qg-soc.c

int qg_scale_soc(struct qpnp_qg *chip, bool force_soc)

{

......

update_msoc(chip);----------------------------------------------------------------------更新soc值

if (is_scaling_required(chip)) {-----------------------------------------------------------is_scaling_required主要处理usb不存在但充电电量增长问题

get_next_update_time(chip);

alarm_start_relative(&chip->alarm_timer,

ms_to_ktime(chip->next_wakeup_ms));

} else {

scale_soc_stop(chip);

goto done_psy;

}

......

}

static bool is_scaling_required(struct qpnp_qg *chip)

{

......

if (chip->catch_up_soc > chip->msoc && !is_usb_present(chip) && gpio_get_value(gpio_back_charger_irq) == 1 && gpio_get_value(gpio_side_charger_irq) == 1)

/* USB is not present and SOC has increased */

return false;

......

}

static void update_msoc(struct qpnp_qg *chip)

{

......

if (chip->catch_up_soc > chip->msoc) {

/* SOC increased */

if (usb_present || gpio_get_value(gpio_back_charger_irq) == 0 || gpio_get_value(gpio_side_charger_irq) == 0) /* Increment if USB is present */

chip->msoc += chip->dt.delta_soc;----------------------------------------------电量增长,获取当前增长chip->msoc值

} else if (chip->catch_up_soc < chip->msoc) {

/* SOC dropped */

chip->msoc -= chip->dt.delta_soc;-------------------------------------------------电量减少,获取当前减少chip->msoc值

}

......

}

第三部分     qpnq-qg.c

static const struct power_supply_desc qg_psy_desc = {---------------------------------创建power_supply子系统下的bms节点

.name = "bms",

.type = POWER_SUPPLY_TYPE_BMS,

.properties = qg_psy_props,

.num_properties = ARRAY_SIZE(qg_psy_props),

.get_property = qg_psy_get_property,

.set_property = qg_psy_set_property,

.property_is_writeable = qg_property_is_writeable,

};

static int qg_psy_get_property(struct power_supply *psy,

enum power_supply_property psp,

union power_supply_propval *pval)

{

......

switch (psp) {

case POWER_SUPPLY_PROP_CAPACITY:

rc = qg_get_battery_capacity(chip, &pval->intval);

break;

case POWER_SUPPLY_PROP_REAL_CAPACITY:

rc = qg_get_battery_capacity_real(chip, &pval->intval);

break;

......

}

static int qg_get_battery_capacity(struct qpnp_qg *chip, int *soc)

{

......

if (chip->dt.linearize_soc && chip->maint_soc > 0)

*soc = chip->maint_soc;

else

*soc = chip->msoc;-----------------------------------------------------------------获取soc值,进而bms部分prop_capacity得到当前电量值

......

}

第四部分    qpnp-smb5.c

static const struct power_supply_desc batt_psy_desc = {-------------------创建power_supply子系统下的battery节点

.name = "battery",

.type = POWER_SUPPLY_TYPE_BATTERY,

.properties = smb5_batt_props,

.num_properties = ARRAY_SIZE(smb5_batt_props),

.get_property = smb5_batt_get_prop,

.set_property = smb5_batt_set_prop,

.property_is_writeable = smb5_batt_prop_is_writeable,

};

static int smb5_batt_get_prop(struct power_supply *psy,

enum power_supply_property psp,

union power_supply_propval *val)

{

......

case POWER_SUPPLY_PROP_STATUS:------------------------------------------------获取电池状态,充电指示灯根据此状态显示

rc = smblib_get_prop_batt_status(chg, val);

break;

......

case POWER_SUPPLY_PROP_CAPACITY:---------------------------------------------获取电池电量

rc = smblib_get_prop_batt_capacity(chg, val);

break;

......

}

static const struct power_supply_desc usb_psy_desc = {------------------------------创建power_supply子系统下的usb节点

.name = "usb",

.type = POWER_SUPPLY_TYPE_USB_PD,

.properties = smb5_usb_props,

.num_properties = ARRAY_SIZE(smb5_usb_props),

.get_property = smb5_usb_get_prop,

.set_property = smb5_usb_set_prop,

.property_is_writeable = smb5_usb_prop_is_writeable,

};

static int smb5_usb_get_prop(struct power_supply *psy,

enum power_supply_property psp,

union power_supply_propval *val)

{

......

case POWER_SUPPLY_PROP_ONLINE:--------------------------------------------------------此属性用来判断充电图标显示

rc = smblib_get_prop_usb_online(chg, val);

if (!val->intval)

break;

if (((chg->typec_mode == POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) ||

(chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB))

&& (chg->real_charger_type == POWER_SUPPLY_TYPE_USB))

val->intval = 0;

else

val->intval = 1;

if (chg->real_charger_type == POWER_SUPPLY_TYPE_UNKNOWN)

val->intval = 0;

break;

......

}

第五部分     smb5-lib.c

int smblib_get_prop_batt_capacity(struct smb_charger *chg,

union power_supply_propval *val)

{

......

rc = smblib_get_prop_from_bms(chg, POWER_SUPPLY_PROP_CAPACITY, val);----------------从bms节点下的POWER_SUPPLY_PROP_CAPACITY获取当前电量

......

}

int smblib_get_prop_batt_status(struct smb_charger *chg,

union power_supply_propval *val)

{

......

rc = smblib_get_prop_usb_online(chg, &pval);-------------------------------------------------判断usb是否在位

if (rc < 0) {

smblib_err(chg, "Couldn't get usb online property rc=%d\n",

rc);

return rc;

}

usb_online = (bool)pval.intval;

rc = smblib_get_prop_dc_online(chg, &pval);--------------------------------------------------判断DC是否在位

if (rc < 0) {

smblib_err(chg, "Couldn't get dc online property rc=%d\n",

rc);

return rc;

}

dc_online = (bool)pval.intval;

......

switch (stat) {

case TRICKLE_CHARGE:

case PRE_CHARGE:

case FULLON_CHARGE:

case TAPER_CHARGE:

val->intval = POWER_SUPPLY_STATUS_CHARGING;

break;

case TERMINATE_CHARGE:

case INHIBIT_CHARGE:

val->intval = POWER_SUPPLY_STATUS_FULL;

break;

case DISABLE_CHARGE:

case PAUSE_CHARGE:

val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;

break;

default:

val->intval = POWER_SUPPLY_STATUS_UNKNOWN;

break;

}

.....

}

个人总结:

当调用power_supply_changed函数,就会遍历power_supply子系统下所有节点(bms,battery,pc_port,usb等)下的所有属性(status,online,capacity等)是否有改变,改变时,就会通过设置共用结构体的val->intval更改当前属性下的数值。

usb->online(1 | 0):与充电图标显示有关

battery->status(POWER_SUPPLY_STATUS_CHARGING |  POWER_SUPPLY_STATUS_FULL  |  POWER_SUPPLY_STATUS_NOT_CHARGING):与充电指示灯有关

bms->capacity :  与电量显示有关

高通android充电常用问题,高通平台android9.0充电电量,充电指示灯以及充电图标读取分析...相关推荐

  1. 高通android开源代码下载,高通平台开源代码下载

    1.进入codeaurora主页,https://www.codeaurora.org/ 2.选择[Projects] -> [Active Projects(Gerrit Repo)] 3.进 ...

  2. android serialport new 软件退出_基于Android9.0,了解Android启动流程

    先记住四个进程和三种方式. **四个进程** 1.Launcher进程 2.system_server进程 3.App进程 4.Zygote进程 **三种方式** 1.Binder方式 2.Socke ...

  3. 高通android开源代码下载,高通平台Android源码bootloader分析之sbl1(三)

    前两篇博文分析了启动流程.代码流程.cdt,接下来就分析另外几个需要格外关注的部分. ##log系统 sbl1中的log系统也是sbl1部分调试会经常接触得部分高通平台在sbl中做的log系统并不是很 ...

  4. Android指纹识别ui显示,Android9.0指纹识别BiometricPrompt的简单使用

    谷歌在Android 9.0 API版本28,发布了生物信息综合验证的基础 API android.hardware.biometrics.BiometricPrompt.BiometricPromp ...

  5. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  6. 高通Android智能平台开发总结

    高通Android智能平台开发总结 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境. 7 1.2 搭建高通平台环境开发环境. 7 1.2.1 高通android智能平台概 ...

  7. 高通android开发摘要

    一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...

  8. android加载efi分区,高通Android UEFI XBL 代码流程分析

    高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...

  9. 高通Android手机软件开发培训

    为期两天的高通Android手机软件开发培训结束了.这次高通针对QSC7x27/7x25/QSD8x50的基带芯片进行了两天的Android手机软件开发培训.参加人员都是我这样的各个OEM厂商的软件开 ...

最新文章

  1. 软件BT是硬盘杀手?
  2. Linux查看进程和终止进程的技巧
  3. 如何在一小时内更新100篇文章?-Evernote Sync插件介绍
  4. 将JINQ与JPA和H2一起使用
  5. 设计模式解密(12)- 桥接模式
  6. web监听器监听mysql_JavaWEB开发15——ListenerListener
  7. Flask render_template
  8. VS2013解决error LNK2019: 无法解析的外部符号 mfcs120ud.lib
  9. flash 绘图API:绘制秀曲线图形
  10. 【 2015-2016 XVI Open Cup, Grand Prix of Bashkortostan, SKB Kontur Cup Stage 2】题目总结
  11. 人工智能python营_AI人工智能训练营
  12. Frsky X9D Plus遥控器和 Frisky R8 Pro接收机对频
  13. ThingJS结合图表实现数据展示
  14. 二级C语言office公共基础知识点
  15. H.264压缩算法详解
  16. 《程序员防近视指南》学习笔记全
  17. 业务和商业才是技术的驱动力
  18. 借鉴FCoin商业模式,写了一份白皮书去参赛
  19. 热电阻 热电偶 测量电路_热控宝典之热电偶、热电阻原理及常见故障处理
  20. workflow 添加html,为alfred编写workflow

热门文章

  1. 企业微信消息推送(一)接收消息服务器URL
  2. linux智能电压表设计与实现,智能电压表的设计
  3. OSI七层与TCP/IP五层网络架构详解
  4. SCRM:SpringBoot + RabbitMQ + 企微 实现发送消息到企业微信
  5. 饿了么组件el-image使用本地图片
  6. 非常感人的分手对白:伤感日志
  7. 邪恶的PLS-00103错误提示
  8. 180天如何突击高考2-从465到378...
  9. js 下拉层级多选_Jquery实现select二级联动多选下拉菜单
  10. 思科计算机网络(1)计算机网络概述