首页 > 其他分享 >高通pmic voter机制

高通pmic voter机制

时间:2024-08-21 11:16:11浏览次数:10  
标签:index voter chip 高通 fcc votable jeita pmic

前不久在高通 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;
		}
	}
	}

标签:index,voter,chip,高通,fcc,votable,jeita,pmic
From: https://www.cnblogs.com/linhaostudy/p/18371225

相关文章

  • 高通ADSP USB流程
    在高通平台上,ADSP(AudioDigitalSignalProcessor,音频数字信号处理器)可以通过USB接口与主机进行数据传输,以下是大致的ADSPUSB流程:主机发起USB设备请求:主机会通过USB总线发起设备请求,以与ADSP进行通信。ADSP会响应这些请求,并根据请求类型进行相应的操作。配置USB通......
  • 高通C6490 android13 GMS 认证之CtsCarrierApiTestCases
    我们机器是没有SIM卡的,只需要连接wifi。跑CTS测试,CtsCarrierApiTestCases的测试结果都是报没有SIM卡的错误。如下:android.carrierapi.cts.ApnDatabaseTest#testQueryConflictCase fail ThistestrequiresaSIMcardwithcarrierprivilegerulesonit. 解决方法:需要......
  • 高通c6490 为过GMS,修改fingerprint属性
    首先通过adb查看含有fingerprint的属性值lahaina:/$getprop|grepfinger[ro.bootimage.build.fingerprint]:[qti/lahaina/lahaina:11/RKQ1.230607.001/asw06281258:user/test-keys][ro.build.fingerprint]:[qti/lahaina/lahaina:13/PB-A6490ACT-Android13-EDP-/V1.3-202......
  • 智能座舱背后主流车机平台(SA8155/SA8295)的高通Hexagon DSP是什么?
    智能座舱背后主流车机平台(SA8155/SA8295)的高通HexagonDSP是什么?一、高通HexagonDSP的辉煌发展历程高通,作为全球领先的无线通信技术创新者,其处理器技术一直走在行业前列。随着智能手机和物联网设备的普及,对处理器性能的要求日益提升,尤其是在AI和机器学习领域。高通Hex......
  • 高通进dump和抓取解析dump log
    1.触发dump的办法:高通进dump的方式使用指令:echoc>/proc/sysrq-trigger长按power键     有些基线默认是重启,需要进行配置才能使用该方法 3.通过PS-HOLD硬件的方式进入dloader模式抓取dump硬件飞线PS-HOLD将PS-HOLD短接地,手机进入dloader模式,抓......
  • 高通进dump和抓取解析dump log
    1.触发dump的办法:高通进dump的方式使用指令:echoc>/proc/sysrq-trigger长按power键有些基线默认是重启,需要进行配置才能使用该方法通过PS-HOLD硬件的方式进入dloader模式抓取dump硬件飞线PS-HOLD将PS-HOLD短接地,手机进入dloader模式,抓取ramdump短接时......
  • 大话NXP的PMIC_FS26原理和参数一篇搞定
    总体描述FS26汽车安全系统基础芯片(SBC)家族的设备设计支持入门级和中端安全微控制器,例如S32K3系列。FS26设备具有多个电源供应,并具备与其他面向汽车电气化的微控制器灵活合作的能力。FS26的应用包括动力传动、底盘、安全和低端网关技术等多个领域。该家族的设备包括多个......
  • 高通Perflock
    高通的Perflock是Qualcomm公司开发的一项技术,用于优化设备性能和功耗管理。Perflock是一种锁定机制,允许操作系统或应用程序在需要时对处理器的性能状态进行控制,从而确保在关键任务或高性能需求的情况下,处理器能够维持在高性能状态。主要功能和特点性能锁定:Perflock允许应用程......
  • 高通dump ftrace & kernelshark使用
    简介高通ramdump可以解析出ftrace,方便用于追踪快省稳问题。kernelshark是一个可以查看traceevent的图形化工具,方便梳理和观察内核微观行为。trace-cmd是设置读取ftrace的命令行工具,kernelshark既可以记录数据,也可以图形化分析结果。在/sys/kernel/debug/tracing/......
  • 高通SNPE for Windows入门
    高通SNPE运行在Windows11forx64上的基础教程,相关软件自行下载,注意版本差异。1.平台Windows11onx64PowershellVisualStudio2022Python3.10QualcommNeuralProcessingSDK2.环境变量创建一个Python3环境:$py-3.10-mvenv"<PYTHON3.10_VENV_ROOT>"$&"<......