1.在添加充电之前,看准原理图弄清楚,你的充电是通过还是走pmic的线性充电还是外置充电IC
我用我项目情况mt6370芯片(支持快充)举例子
$(LINUX_KERNEL_VERSION)/arch/arm/boot/dts/mt6370.dtsi
mt6370,intr_gpio_num = <11>; /* direct defined GPIO num */
mt6370,intr_gpio = <&pio 11 0x0>; /* GPIO */
最好还同步配置一下dws
<gpio11>
<eint_mode>true</eint_mode>
<def_mode>0</def_mode>
<inpull_en>true</inpull_en>
<inpull_selhigh>true</inpull_selhigh>
<def_dir>IN</def_dir>
<out_high>false</out_high>
<varName0>GPIO_SUBPMIC_IRQB_EINT_PIN</varName0>
<smt>false</smt>
<ies>true</ies>
</gpio11>
配置好对应的pmic中断,你就会发现有充电图标显示了,不过此时充电电流只有0.5A左右
2.配置充电电流为2A左右(测量的时候充电器和线不适配可能会电流计显示偏差)
device/mediateksample/$(yourprojectname)/ProjectConfig.mk
MTK_DUAL_CHARGER_SUPPORT = no //外部充电ic的时候启用比如sd7601,rt9465
$(LINUX_KERNEL_VERSION)/arch/arm/configs/$(yourprojectname)_debug_defconfig
$(LINUX_KERNEL_VERSION)/arch/arm/configs/$(yourprojectname)_defconfig
# CONFIG_CHARGER_RT9465 is not set
很多时候需要把不用的宏开关给关掉,要不在某些驱动里面会识别运行,可能会让器件运行不起来(我就遇到过一次调试的时候因为添加打印log,打印出来的信息编码对不上,是乱码,造成系统一直开机重启,把log信息去掉就好了)
$(LINUX_KERNEL_VERSION)/arch/arm/boot/dts/mt6370.dtsi
aicr = <2000000>; /* uA */ //设置输入电流的平均值2A
mivr = <4200000>; /* uV */ //输入电压最小限定,原来是4.6,看你具体情况看要不要改
不改的无视下面46改42的修改部分
相关参数定义
ICHG = “設定的充電電流”,
AICR = “AICR 保護下允許的最高抽電流”
MIVR = “設定的允許的充電器最低電壓”
IEOC = “設定的截止充電電流”
CV = “設定的Constant Voltage 值”
VSYS = “量測到的 VSYS 值”
VBAT = “测量到的电池电压”
IBAT = “测量到的充电电流”
IBUS = “测量到充电器的电流”
VBUS = “测量到充电器的电压”
soc = 底层电量百分比
uiso = 上层显示电量百分比
CT = 充电器类型
$(LINUX_KERNEL_VERSION)/arch/arm/boot/dts/$(MTK_PLATFORM).dtsi
(我把修改地方上下文也给出来,方便定位,红色值为修改部分)
/* charging current */
usb_charger_current = <500000>;
ac_charger_current = <2000000>;
ac_charger_input_current = <2000000>;
non_std_ac_charger_current = <2000000>;
charging_host_charger_current = <2000000>;
ta_ac_charger_current = <2000000>;
pd_charger_current = <500000>;
pe_ichg_level_threshold = <1000000>; /* uA */
ta_start_battery_soc = <0>;
ta_stop_battery_soc = <95>;
min_charger_voltage = <4200000>;
ta_start_battery_soc = <0>;
ta_stop_battery_soc = <85>;
min_charger_voltage = <4200000>;
/* dual charger in series */
dcs_input_current = <3200000>;
dcs_chg1_charger_current = <2000000>;
dcs_chg2_charger_current = <2000000>;
min_charger_voltage = <4200000>;
pd_vbus_low_bound = <5000000>;
pd_vbus_upper_bound = <5000000>;
vsys_watt = <5000000>;
/* dual charger in series */
dcs_input_current = <3200000>;
dcs_chg1_charger_current = <2000000>;
dcs_chg2_charger_current = <2000000>;
compatible = "mediatek,charger,pe4";
gauge = <&mtk_gauge>;
min_charger_voltage = <4200000>;
pe40_stop_battery_soc = <80>;
/* dual charger in series*/
dcs_input_current = <3200000>;
dcs_chg1_charger_current = <2000000>;
dcs_chg2_charger_current = <2000000>;
/* common */
battery_cv = <4350000>;
max_charger_voltage = <6500000>;
min_charger_voltage = <4200000>;
/* charging current */
usb_charger_current = <500000>;
ac_charger_current = <2000000>;
ac_charger_input_current = <2000000>;
charging_host_charger_current = <2000000>;
$(LINUX_KERNEL_VERSION)/drivers/power/supply/mtk_basic_charger.c
static bool select_charging_current_limit函数
if (support_fast_charging(info))
is_basic = false;
else {
is_basic = true;
/* AICL */
charger_dev_run_aicl(info->chg1_dev,
&pdata->input_current_limit_by_aicl);
if (info->enable_dynamic_mivr) {
if (pdata->input_current_limit_by_aicl >
info->data.max_dmivr_charger_current)
pdata->input_current_limit_by_aicl =
info->data.max_dmivr_charger_current;
}
if (is_typec_adapter(info)) {
if (adapter_dev_get_property(info->pd_adapter, TYPEC_RP_LEVEL)
== 3000) {
pdata->input_current_limit = 3000000;
pdata->charging_current_limit = 3000000;
} else if (adapter_dev_get_property(info->pd_adapter,
TYPEC_RP_LEVEL) == 1500) {
pdata->input_current_limit = 1500000;
pdata->charging_current_limit = 2000000;
} else {
chr_err("type-C: inquire rp error\n");
//lpf add start
pdata->input_current_limit = 2000000; //同步修改这里
pdata->charging_current_limit = 2000000; //这两个值
//lpf add end
}
chr_err("type-C:%d current:%d\n",
info->pd_type,
adapter_dev_get_property(info->pd_adapter,
TYPEC_RP_LEVEL));
}
}