int mtk_bat_status_update(void) { int ret; struct mtk_battery *gm; struct power_supply *psy = NULL; struct power_supply *bbc_psy = NULL; struct battery_data *bat_data; union power_supply_propval status, online, type; psy = power_supply_get_by_name("battery"); if (psy == NULL || IS_ERR(psy)) bm_err("%s Couldn't get psy\n", func); gm = (struct mtk_battery *)power_supply_get_drvdata(psy); if (gm == NULL) bm_err("%s Couldn't get psy\n", func); bat_data = &gm->bs_data; bbc_psy = power_supply_get_by_name("bbc"); if (bbc_psy == NULL || IS_ERR(bbc_psy)) bm_err("%s Couldn't get bbc_psy\n", func); ret = power_supply_get_property(bbc_psy, POWER_SUPPLY_PROP_STATUS, &status); ret = power_supply_get_property(bbc_psy, POWER_SUPPLY_PROP_ONLINE, &online); ret = power_supply_get_property(bbc_psy, POWER_SUPPLY_PROP_TYPE, &type); if(ret < 0) bm_err("%s Couldn't get chg_psy fialed \n", func); fg_sw_bat_cycle_accu(gm); bat_data->bat_status = status.intval; bm_err(" My bat_data->bat_status = %d", bat_data->bat_status); return 0; }请帮忙详细分析一下这段函数
时间: 2024-04-27 22:23:10 浏览: 11
这段函数是用来更新电池状态的。主要步骤如下:
1. 定义了一些变量,包括 gm (指向 struct mtk_battery 结构体的指针), psy (指向电源供应结构体的指针), bat_data (指向 struct battery_data 结构体的指针), bbc_psy (指向电池充电器结构体的指针), 以及一些用于存储电池状态信息的变量 status, online, type。
2. 通过调用 power_supply_get_by_name 函数获取电源供应结构体 psy 和电池充电器结构体 bbc_psy。
3. 调用 power_supply_get_drvdata 函数获取 struct mtk_battery 结构体指针 gm。
4. 调用 power_supply_get_property 函数获取电池充电器结构体 bbc_psy 中的电池状态、在线状态和电池类型信息,分别存储到 status, online, type 变量中。
5. 调用 fg_sw_bat_cycle_accu 函数更新电池循环次数记录。
6. 将获取到的电池状态信息存储到 bat_data->bat_status 变量中。
7. 返回 0。
需要注意的是,该函数中的一些变量和函数并未在代码中给出,因此无法完全理解该函数的功能和作用。
相关问题
请用power_supply_get_by_name(ddata->dev)的方法对以下函数进行改写:static int set_charger_type(void) { int ret; static int old_type_en = 0; union power_supply_propval val; struct power_supply *psy = power_supply_get_by_name("bbc"); if (psy == NULL) { pr_info("power_supply_get_by_name error.\n"); return -1; } val.intval = chr_type_en; pr_info("set_charger_type: %d.\n", val.intval); if (val.intval) { if (!old_type_en) { ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_ONLINE, &val); old_type_en = 1; } power_supply_changed(psy); val.intval = POWER_SUPPLY_TYPE_WIRELESS; ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val); if (!ret) { return val.intval; } else { return 0; } } else { val.intval = POWER_SUPPLY_TYPE_USB; ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val); if (ret < 0) pr_info("set chg psy failed\n"); power_supply_changed(psy); old_type_en = 0; } return 0; }
static int set_charger_type(void) {
int ret;
static int old_type_en = 0;
union power_supply_propval val;
struct power_supply *psy = power_supply_get_by_name("bbc");
if (!psy) {
pr_info("power_supply_get_by_name error.\n");
return -1;
}
val.intval = chr_type_en;
pr_info("set_charger_type: %d.\n", val.intval);
if (val.intval) {
if (!old_type_en) {
ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_ONLINE, &val);
old_type_en = 1;
}
power_supply_changed(psy);
val.intval = POWER_SUPPLY_TYPE_WIRELESS;
ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val);
if (ret < 0) {
pr_info("set chg psy failed\n");
return 0;
}
return val.intval;
} else {
val.intval = POWER_SUPPLY_TYPE_USB;
ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val);
if (ret < 0) {
pr_info("set chg psy failed\n");
}
power_supply_changed(psy);
old_type_en = 0;
}
return 0;
}
static int set_charger_type(void) { int ret; static int old_type_en = 0; union power_supply_propval val; struct power_supply *psy = power_supply_get_by_name("bbc"); if (psy == NULL) { pr_info("power_supply_get_by_name error.\n"); return -1; } val.intval = chr_type_en; pr_info("set_charger_type: %d.\n", val.intval); if (val.intval) { if (!old_type_en) { ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_ONLINE, &val); old_type_en = 1; } power_supply_changed(psy); val.intval = POWER_SUPPLY_TYPE_WIRELESS; ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val); if (!ret) { return val.intval; } else { return 0; } } else { val.intval = POWER_SUPPLY_TYPE_USB; ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val); if (ret < 0) pr_info("set chg psy failed\n"); power_supply_changed(psy); old_type_en = 0; } return 0; }将这段函数进行改写,使用dev_name(ddata->dev)来动态获取设备名称
static int set_charger_type(struct device *dev) {
int ret;
static int old_type_en = 0;
union power_supply_propval val;
struct power_supply *psy = power_supply_get_by_name(dev_name(dev));
if (psy == NULL) {
pr_info("power_supply_get_by_name error.\n");
return -1;
}
val.intval = chr_type_en;
pr_info("set_charger_type: %d.\n", val.intval);
if (val.intval) {
if (!old_type_en) {
ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_ONLINE, &val);
old_type_en = 1;
}
power_supply_changed(psy);
val.intval = POWER_SUPPLY_TYPE_WIRELESS;
ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val);
if (!ret) {
return val.intval;
} else {
return 0;
}
} else {
val.intval = POWER_SUPPLY_TYPE_USB;
ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_TYPE, &val);
if (ret < 0)
pr_info("set chg psy failed\n");
power_supply_changed(psy);
old_type_en = 0;
}
return 0;
}