前不久在高通 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. java面试一日一题:说下mysql中的binlog

    问题:请讲下mysql中的binlog 分析:该问题主要考察对mysql中binlog的理解及使用场景? 回答要点: 主要从以下几点去考虑, 1.什么是binglog? 2.binlog的使用场景是什 ...

  2. 解决Sqoop导入导出MySQL数据错位问题

    添加--columns "columns,columns,columns" \可以在hive导入mysql时防止数据错位:

  3. NPIO在指定位置插入新列(附案例和代码)

    背景: I could be mistaken as I am not that familiar with NPOI, however, after a minor search, it appea ...

  4. Jmeter二次开发函数 - 文本替换

    此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...

  5. 【MySQL】拆分经纬度字段

    数据结构: 表中一字段存储经度和纬度: +---------------------------+ | INSTALL_LOLA_NUM | +---------------------------+ ...

  6. 【Java】Properties 配置信息类

    Properties 配置信息类 Properties 是HashTable的子类,该对象用于处理属性文件 由于属性文件的Key.Value都是字符串类型,所以Properties里的Key和Valu ...

  7. 【RabbitMQ】07 SpringBoot整合RabbitMQ

    生产者和消费者的依赖基本一致: 注意工程名称不是一样的 <?xml version="1.0" encoding="UTF-8"?> <pro ...

  8. 【Project】JS的Map对象前后交互问题

    这是我在项目中写的一个Map对象: let map = new Map(); for (let i = 0; i < type_checked_value.length; i++) { let ...

  9. 【转载】SLAM领域的优秀作者与实验室汇总

    原地址: https://blog.csdn.net/m0_37874102/article/details/114365837 总结一些之前看过的SLAM(VO,VIO,建图)文献所发表的实验室和作 ...

  10. 【转载】 Ubuntu 中开机自动执行脚本的两种方法

    原文地址: https://www.jianshu.com/p/6366d7070642 作者:貘鸣来源:简书 ============================================ ...