前不久在高通 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. 智能家居如何把老款定频空调变成智能“变频”空调#米家#智能家居#HA

    背景 最近长沙的天气暴热,室内达到了34-35度,天气预报最高温度上了40度,这么酷热的天气,离开了空调,基本上就是一身汗,全身湿透,特别难受,然后不得不开启家里的一台将近10年的老式定频空调,输入功 ...

  2. RedisTemplate使用rightPushAll时的注意事项

    问题:第一次使用时rightPushAll,我以为这个方法就是直接把我们集合中的数据全部添加到redis的list里面,但是如果直接使用ArrayList类型添加,发现事情并不是我们想的这样,他并没有 ...

  3. .NET 窗口/屏幕截图

    图像采集源除了显示控件(上一篇<.NET 控件转图片>有介绍从界面控件转图片),更多的是窗口以及屏幕. 窗口截图最常用的方法是GDI,直接上Demo吧: 1 private void Gd ...

  4. 【Java】Excel 读写图片工具类

    一.需求背景: 做一个大屏管理系统,基础信息包括管理的应用名称,大屏的截图,通过一个excel批量导入 excel的单元格里要插入图片,对应一个大屏应用的信息 导入需要读取到大屏截图,至于存哪还没说. ...

  5. 【Scala】05 对象特性Part2

    特质重复继承关系 父类特质 A 子类特质B 继承 A 子类特质C 继承A 类D 继承了 B 又实现了 C class D extends B with C 继承顺序是 D 继承 C 继承 B 继承 A ...

  6. How to evaluate the Messi Hong Kong fraud incident?

    Who is Lionel Messi? URL: https://en.wikipedia.org/wiki/Lionel_Messi As a famous football player, Me ...

  7. 电视家APP会员退款了 —— 网络电视APP的合规性处理

    今天打开家里网络电视的时候突然发现"电视家APP"居然无法使用了,随后发现账户关联的银行卡收到退款了,于是好奇的研究了一下这个事情. 由于家里是在农村,闭路电视的图像效果很差,估计 ...

  8. 【转载】 银河麒麟V10系统安装U盘制作

    版权声明:本文为CSDN博主「CPUOS520」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/liuhao_0 ...

  9. fatal error: GL/osmesa.h: No such file or directory

    安装mujoco报错: fatal error: GL/osmesa.h: No such file or directory 解决方法: sudo apt install libosmesa6-de ...

  10. Java项目生产启动、关闭脚本

    1.直接启动 #!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=XXXX-api-1.0.jar #使用说明,用来提示输入参数 usage() { echo ...