前不久在高通 SDM450 平台接触了 voter 机制(投票机制)。最近终于得空,结合一个问题简单研究了一下。现将研究流程简单记录一下,由于时间有限,所以是实用为目的,没有做详细的分析,不过结合着这篇分析和源码一起参考,应该能快速地应用 voter 做一些事情。voter=====

第一步是找到 voter 的实现代码,然后分析 voter 的机制。voter 的实现代码主要是为各种 voter 提供接口,我提炼了两个最关键的接口,如下:

# kernel/msm-4.9/drivers/power/supply/qcom/pmic-voter.c
/*
** vote 函数主要用来给 votable 添加投票选项
** votable: 投票的对象
** client_str: 投票者
** enabled: 投票者的内容(val)是否参与投票
** val: 投票内容
**/
int vote(struct votable *votable, const char *client_str, bool enabled, int val)
{
...
switch (votable->type) { // type 的值来自于 create_votable()
case VOTE_MIN: // 取投票对象所有内容的最小值
vote_min(votable, client_id, &effective_result, &effective_id);
break;
case VOTE_MAX:
vote_max(votable, client_id, &effective_result, &effective_id);
break;
case VOTE_SET_ANY:
vote_set_any(votable, client_id,
&effective_result, &effective_id);
break;
...
} /* 投票相关参数,可以在此文件中搜索此结构体的成员找到其值从哪儿来*/
struct votable {
int type;
...
int (*callback)(struct votable *votable,
}
---> struct votable *create_votable(const char *name,
int votable_type,
int (*callback)(struct votable *votable,..)
{
// 创建 votable, 引入 votable type 和 callback 函数
...
/* 创建 debugfs*/
debug_root = debugfs_create_dir("pmic-votable", NULL);
...
}
eg: 创建流入电池电流的投票对象
chip->fcc_votable = create_votable("FCC", VOTE_MIN,
pl_fcc_vote_callback,
chip);

pmic voter debugfs

通过 voter 的文件节点能够比较清晰的看出 voter 结构。如下:

# /sys/kernel/debug/pmic-votable/
cat status
FCC: HW_LIMIT_VOTER: en=0 v=-22
FCC: BATT_PROFILE_VOTER: en=1 v=1500000
FCC: SW_ICL_MAX_VOTER: en=1 v=1500000
FCC: THERMAL_DAEMON_VOTER: en=0 v=0
FCC: FCC_SOC_VOTER: en=1 v=1000000
FCC: JEITA_VOTER: en=1 v=1500000
FCC: STEP_CHG_VOTER: en=0 v=0
FCC: TAPER_STEPPER_VOTER: en=0 v=0
FCC: effective=FCC_SOC_VOTER type=Min v=1000000

一个问题案例

[Description]

设备在不同温度条件下有不同的电流限制,但是在测试设备时发现一个问题:电池温度升温过程中,设备并没有在 cool 零界限改变温度,而是再超过临界线 2~3 ℃ 的时候才做相应动作。

[Root cause]

默认的 jeita 标准相关代码有一个温度临界值保护并延迟改变电流值的设定,当达到临界值时并不马上改变电流限制,继续投票上一阶段的电流值,当温度达到定义的延迟温度时,再投票当前阶段的电流值。

[Solution]如需要修改此问题的话,取消温度临界值保护(即将温度滞后值改为 0)即可。

详细情况如下:

每个阶段温度和电流值的定义

# kernel/msm-4.9/arch/arm64/boot/dts/qcom/vendor/qg-batterydata-xxx.dtsi

qcom,jeita-fcc-ranges = <50   150  800000  //阶段一  COOL
151 450 1500000 // 阶段二 GOOD
451 500 1400000>; // 阶段三 Warm

关键源码

# kernel/msm-4.9/drivers/power/supply/qcom/step-chg-jeita.c
/* 定义 jeita 标准延迟设定相关参数 */
chip->jeita_fcc_config->psy_prop = POWER_SUPPLY_PROP_TEMP;
chip->jeita_fcc_config->prop_name = "BATT_TEMP";
chip->jeita_fcc_config->hysteresis = 10; /* jeita 生效函数 */
static int handle_jeita(struct step_chg_info *chip)
{
rc = power_supply_get_property(chip->batt_psy,
chip->jeita_fcc_config->psy_prop, &pval);
rc = get_val(chip->jeita_fcc_config->fcc_cfg,
chip->jeita_fcc_config->,
chip->jeita_fcc_index,
pval.intval,
&chip->jeita_fcc_index,
&fcc_ua); /* 投票获取到的电流值 */
vote(chip->fcc_votable, JEITA_VOTER, fcc_ua ? true : false, fcc_ua);
} /* 获取当前应投票的电流值 */
get_val(...)
{
/*
* Check for hysteresis if it in the neighbourhood
* of our current index.
*/
if (*new_index == current_index + 1) {
/* 当温度小于临界值 + 延迟时,继续使用上一阶段的电流值
if (threshold < range[*new_index].low_threshold + hysteresis) {
/*
* Stay in the current index, threshold is not higher
* by hysteresis amount
*/
*new_index = current_index;
*val = range[current_index].value;
}
} else if (*new_index == current_index - 1) {
if (threshold > range[*new_index].high_threshold - hysteresis) {
/*
* stay in the current index, threshold is not lower
* by hysteresis amount
*/
*new_index = current_index;
*val = range[current_index].value;
}
}
}

高通pmic voter机制的更多相关文章

  1. android 6.0 高通平台sensor 工作机制及流程(原创)

    最近工作上有碰到sensor的相关问题,正好分析下其流程作个笔记. 这个笔记分三个部分: sensor硬件和驱动的工作机制 sensor 上层app如何使用 从驱动到上层app这中间的流程是如何 Se ...

  2. 针对高通BMS的研究 高通电量计

    点击打开链接 高通8064 8974 8926等pm芯片都集成了电量计,估计后续芯片都会一直存在,现在许多项目UI状态栏电池都有百分比显示,所以需要深入分析BMS有助于解决电量方面的BUG. 一: S ...

  3. 【转】高通平台android 环境配置编译及开发经验总结

    原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...

  4. 高通msm8909耳机调试

    http://blog.csdn.net/mike8825/article/details/69489865?locationnum=3&fps=1 1.DTS相应修改: DTS相关代码:ke ...

  5. 高通开发笔记---Yangtze worknote

    点击打开链接 1. repo init -u git://review.sonyericsson.net/platform/manifest -b volatile-jb-mr1-yangtze 2. ...

  6. 高通8X16电池BMS算法(一)【转】

    本文转载自:http://www.voidcn.com/blog/yanleizhouqing/article/p-6037399.html 最近一直在搞电源管理相关内容,之前是8610的bms,现在 ...

  7. 高通电源管理qpnp-vm-bms驱动

    1. compatible节点: qpnp-vm-bms.c使用来控制电池曲线的和BMS功能的,其compatible节点是"qcom,qpnp-vm-bms" 2. probe函 ...

  8. 高通平台 lcd driver 调试小结

    一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2  开发环境 And ...

  9. 高通APQ8074 spi 接口配置

    高通APQ8074 spi 接口配置 8074 平台含有两个BLSP(BAM Low-Speed Peripheral) , 每一个BLSP含有两个QUP, 每一个QUP可以被配置为I2C, SPI, ...

  10. 高通安卓调试LCD几方面总结

    来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...

随机推荐

  1. 【Hibernate】Re01.5 API

    1.Session单表的CRUD操作 1.增加或者修改,使用同一个方法,或者下面的两个也行: 感觉多此一举... 2.删除方法,硬删除: 3.获取方法提供了两种,Get & Load get方 ...

  2. 路径规划综述博客:A* Optimizations and Improvements

    地址: https://lucho1.github.io/JumpPointSearch/ 原作者还开发了A* 算法的Windows系统上的小程序:(重点:小程序意义不大,这个综述还是不赖的) 项目地 ...

  3. 树莓派3b+使用官方屏幕后倒置问题——屏幕倒置

    树莓派3b+的屏幕本身就是倒置的,因此为了使树莓派在官方屏幕下能显示正常的屏幕画面因此需要通过设置把树莓派的官方屏幕的输出倒置一下,这样树莓派的官方屏幕的输出就是正常的了. 解决方法:(源自:http ...

  4. 【转载】 nohup和&区别

    原文地址: https://www.cnblogs.com/xinzaiyuan/p/12097919.html =========================================== ...

  5. mpi4py 官方使用手册

    一直好奇mpi4py的使用手册在哪,找了好久最后在anaconda上发现了线索: https://anaconda.org/conda-forge/mpi4py Home: https://mpi4p ...

  6. ubuntu系统grub修复(win+ubuntu双系统环境),修复无法启动问题 boot-repair

    相关: https://help.ubuntu.com/community/Boot-Repair ================================================== ...

  7. 【转载】 AI助力神经科学:DeepMind 复现大脑空间导航方式

    原文地址: https://baijiahao.baidu.com/s?id=1600279012514462353&wfr=spider&for=pc =============== ...

  8. python调用第三方java包实例

    先看结果: 对于python与java的互调,我一开始是用的py4j,但是后来发现在使用方法的时候,不知道如何在python中导入jar包,然后网上的资料也比较少.后来想不出来办法,又看到有Jpype ...

  9. 一个好用的消息推送服务【Server 酱】

    今天给大家介绍一个好用的消息推送服务Server 酱 Server 酱简介 Server 酱是什么 「Server 酱」,英文名「ServerChan」,是一款「手机」和「服务器」.「智能设备」之间的 ...

  10. SMU Spring 2023 Trial Contest Round 1

    A. Prepend and Append 用ans记录n的值,然后双指针从前后判断是否一个为0一个为1,是的话则ans-2,否则退出循环即可. #include<bits/stdc++.h&g ...