mt6375是如何初始化并注册到power-supply系统中的
时间: 2024-03-29 17:40:38 浏览: 18
mt6375是一个电源管理芯片,它可以连接到电池和其他电源设备,为系统提供电源管理功能。在Linux内核中,mt6375可以通过MT6375驱动程序进行初始化和注册。
驱动程序通常是在设备树中描述的,这是一种用于描述硬件和设备之间关系的数据结构。设备树描述了每个设备的属性,包括设备名称、设备类型、地址、中断等。
在初始化mt6375之前,需要在设备树中定义mt6375节点。然后,驱动程序将读取设备树中的节点信息,并根据该信息初始化mt6375。
初始化mt6375的过程通常包括以下步骤:
1.打开mt6375的硬件资源,例如I2C总线。
2.设置mt6375的寄存器,包括电源管理参数、电池充电参数等。
3.将mt6375注册到power-supply系统中,以便可以监控电池状态并控制电源管理。
完成这些步骤后,mt6375就可以被Linux内核识别并使用了。
相关问题
static int mt6375_chg_init_psy(struct mt6375_chg_data *ddata) { struct power_supply_config cfg = { .drv_data = ddata, .of_node = ddata->dev->of_node, .supplied_to = mt6375_psy_supplied_to, .num_supplicants = ARRAY_SIZE(mt6375_psy_supplied_to), }; mt_dbg(ddata->dev, "%s\n", func); memcpy(&ddata->psy_desc, &mt6375_psy_desc, sizeof(ddata->psy_desc)); ddata->psy_desc.name = dev_name(ddata->dev); ddata->psy = devm_power_supply_register(ddata->dev, &ddata->psy_desc, &cfg); return IS_ERR(ddata->psy) ? PTR_ERR(ddata->psy) : 0; }请详细分析说明一下这段代码的流程,以及这段函数中struct power_supply_config cfg = { .drv_data = ddata, .of_node = ddata->dev->of_node, .supplied_to = mt6375_psy_supplied_to, .num_supplicants = ARRAY_SIZE(mt6375_psy_supplied_to), };的作用
这段代码是在mt6375充电芯片的驱动中用来初始化电源供应器的函数。下面是这段代码的流程:
1. 定义了一个power_supply_config结构体类型的变量cfg,并使用花括号初始化了该结构体的成员变量。
2. 初始化成员变量drv_data为ddata,表示驱动数据为ddata。
3. 初始化成员变量of_node为ddata->dev->of_node,表示设备树节点指针。
4. 初始化成员变量supplied_to为mt6375_psy_supplied_to,表示供电对象。
5. 初始化成员变量num_supplicants为ARRAY_SIZE(mt6375_psy_supplied_to),表示供电对象的数量。
6. 使用mt_dbg函数输出调试信息。
7. 使用memcpy函数复制mt6375_psy_desc结构体的内容到ddata->psy_desc结构体中。
8. 使用dev_name函数设置电源供应器的名称。
9. 使用devm_power_supply_register函数注册电源供应器,并传递配置参数cfg。
10. 返回值为0表示电源注册成功,否则返回PTR_ERR(ddata->psy)。
其中,power_supply_config结构体中的成员变量分别表示驱动数据、设备树节点、供电对象、供电对象数量等信息,这些信息可以在电源注册过程中使用。在这段代码中,该结构体的作用是为电源供应器的注册提供配置参数。
static int set_charger_type(void) { int ret; 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); ret = power_supply_set_property(psy, POWER_SUPPLY_PROP_ONLINE, &val); if(val.intval) { val.intval = POWER_SUPPLY_TYPE_WIRELESS; ret = power_supply_set_property(psy,POWER_SUPPLY_PROP_TYPE, &val); if (!ret) { pr_info("POWER_SUPPLY_TYPE: %d.\n", val.intval); return val.intval; } else { return 0; } } return 0; } static int mt6375_chg_init_psy(struct mt6375_chg_data *ddata) { struct power_supply_config cfg = { .drv_data = ddata, .of_node = ddata->dev->of_node, .supplied_to = mt6375_psy_supplied_to, .num_supplicants = ARRAY_SIZE(mt6375_psy_supplied_to), }; mt_dbg(ddata->dev, "%s\n", __func__); memcpy(&ddata->psy_desc, &mt6375_psy_desc, sizeof(ddata->psy_desc)); ddata->psy_desc.name = "bbc"; ddata->psy = devm_power_supply_register(ddata->dev, &ddata->psy_desc, &cfg); return IS_ERR(ddata->psy) ? PTR_ERR(ddata->psy) : 0; } 请详细分析这两段函数之间的关系
这两段函数之间没有直接的调用关系。第一个函数`set_charger_type`用于设置充电器的类型,它使用了一个名为"bbc"的电源供应(power supply)设备,通过调用`power_supply_get_by_name`函数获取该设备的指针。然后,它将充电器类型的值写入该设备的属性`POWER_SUPPLY_PROP_ONLINE`中,即调用`power_supply_set_property`函数。如果充电器类型不为0(即充电器已连接),则还会将充电器类型写入该设备的属性`POWER_SUPPLY_PROP_TYPE`中,同样是通过调用`power_supply_set_property`函数。
第二个函数`mt6375_chg_init_psy`用于初始化电源供应设备,它首先将一个名为"bbc"的电源供应设备的描述信息复制到`ddata->psy_desc`中,然后将该设备的名称设置为"bbc"。接下来,它调用`devm_power_supply_register`函数来注册该设备,并将该设备的配置信息传递给该函数。这个配置信息包括设备的驱动程序数据、设备节点(of_node)、该设备供应的设备列表(supplied_to)和该设备供应的设备数量(num_supplicants)。
因此,这两个函数之间的关系是,第二个函数`mt6375_chg_init_psy`用于初始化一个名为"bbc"的电源供应设备,并将该设备注册到系统中,而第一个函数`set_charger_type`则使用该设备来设置充电器的类型。