【MTK/Chargeing/Charger/驱动/JEITA】添加电池节点改变电池温度

Root Case

修改JEITA几个阶段的温度、对应的电池电压以及充电电流,为了测试修改的结果,需要添加一个电池节点,echo相应的温度进手机里,通过改变温度用来测试修改的电流有没有生效

Produce

试用期的一个练手项目

Modify Methods

修改JEITA每个阶段的温度、电池电压以及充电电流

注:这里对于本项目有一点需要注意的就是,一个是mt6765.dts以及项目名.dts,修改项目名.dts里面相应的配置才会生效,mt6765.dts中同名的配置会在项目名.dts同名配置中被覆盖

涉及到的文件:/kernel-4.9/arch/aem64/boot/dts/mediatek/项目名.dts

修改dts文件JEITA配置,找到sw jeita部分,修改jeita cold、cool、normal、warm、hot这五个阶段的cc、cv以及temp;其中温度配置中的 **_minus_x_gedree,这个配置的意思是在每个阶段温度的阈值电添加一个容错空间,比如说超过50°C停止充电,那么在这个阈值电设置一个容错值为47°C,当温度下降到47°C的时候才会重新开始充电。

添加电池温度模拟节点

通过adb命令输入电池温度,模拟充电保护行为是否符合预期

涉及到的文件有三个分别是:

  1. /kernel-4.9/drivers/power/supply/mediatek/battery/mtk_battery.c  /**/
  2. /kernel-4.9/drivers/power/supply/power_supply_sysfs.c  /**/
  3. /kernel-4.9/include/linux/power_sypply.h  /**/

mtk_battery.c

:仅代表我个人思路,我很菜的,代码逻辑不是很好,如果各位大佬有更好的方法,请在评论区补充(卑微卤蛋在线卑微)(> <)

两个全局变量:

  • batt_temp_value  /*用来保存echo进来的模拟温度*/
  • batt_temp_test_judge  /*一个标志,用来判断系统使用的是真实温度 还是 echo进来的模拟温度*/

修改的地方:

1、bettery_props[]数组

在 static enum power_supply_property battery_props[] = {……}数组中,添加电池温度模拟节点 POWER_SUPPLY_PROP_BATT_TEMP_TEST

2、battery_get_property函数

这个函数的作用:你在cat batt_temp_test节点的时候返回的数值

在static int battery_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propral *val){……}添加:

static int battery_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propral *val){

……

    case POWER_SUPPLY_PROP_BATT_TEMP_TEST:

        val -> intval = battery_temp_value;  /*关于这个值是从哪里得到的,下面会继续介绍*/

        break;

……

}

 3、battery_set_property函数

这个函数的作用:例如 echo 1 > batt_temp_test(节点),就会进入到这个函数中

在 static int battery_set_property(struct power_supply *psy, enum power_supply_property psp, const union power_sypply_propral *val){……}添加:

static int battery_set_property(struct power_supply *psy, enum power_supply_property psp, const union power_sypply_propral *val) {

switch (psp) {

    /*在原有的switch中添加*/

    case POWER_SUPPLY_PROP_BATT_TEMP_TEST:

        batt_temp_value = val -> intval;  /*看见了吗,batt_temp_value就是在这里被赋值了*/

        if (batt_temp_value == 0) {

            batt_temp_test_judge = 0;  /*这就是个标志位,在下面会介绍他的作用,你需要知道为0时将使用真实的电池温度,为1时将使用echo进来的模拟电池温度*/

        }else if (batt_temp_value == 1) {

            batt_temp_test_judge = 1;

        }

} ……

}

 4、battery_props_is_writable函数

这个函数的作用:我们需要echo 模拟温度到节点中,那么就需要这个节点拥有可写的权限,这个函数的作用就是让这个节点有写权限。

在static int battery_props_is_writable(struct power_supply *psy, enum power_supply_property psp) {……}添加:

static int battery_props_is_writable(struct power_supply *psy, enum power_supply_property psp) {

switch (psp) {

    /*在原有的switch中添加*/

    case POWER_SUPPLY_PROP_BATT_TEMP_TEST:

}

}

5、battery_main结构体

作用:注册battery_set_property、battery_props_is_writable函数

在struct battery_data battery_main = {……} 添加

struct battery_data battery_main = {

.psd = {

    ……

    .set_property = battery_set_property,

    .property_is_writeable = battery_props_is_writable,

    ……

}

}

6、force_get_tbat (bool update)函数

作用:让系统使用echo进来的模拟温度

在int force_get_tbat (bool update) {……} 添加

int force_get_tbat (bool update) {

/*在定义完变量后就添加下面的逻辑*/

if (batt_temp_test_judge == 1) {

    return batt_temp_value;  /*看见了吗,batt_temp_test_judge的作用就在这里体现了*/

}

……

}

添加节点部分完,接下来是处理JEITA处理cc以及cv部分的逻辑,未完待续,创作不易,全部是手敲的,觉得不错的请点赞收藏,能请我喝杯奶茶那是再感谢不过啦!

 

 

©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页