【MTK/Chargeing/Charger/驅動/JEITA】新增電池節點改變電池溫度

李滷蛋發表於2020-10-31

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部分的邏輯,未完待續,創作不易,全部是手敲的,覺得不錯的請點贊收藏,能請我喝杯奶茶那是再感謝不過啦!

 

 

相關文章