最近遇到一个需求.就是修改不同的项目中在SBL下充电的电流.项目平台是高通msm8953+pmi8952.刚拿到需求就是看了下SBL的代码.SBL的代码还是比较容易梳理的.
首先是找下SBL充电相关pm_sbl_chg_init(),在这个函数中做了
err_flag |= pm_sbl_config_chg_parameters(device_index);
//Configure FG parameters to SRAM
err_flag |= pm_sbl_config_fg_sram(device_index); //Needs to be called before DBC check
err_flag |= pm_sbl_chg_check_weak_battery_status(device_index);
pm_sbl_config_chg_parameters这个是配置充电的参数,在本平台是有这么一个table来配置相关参数的
smbchg_specific_data[1] = {
{
//Configuration Value, Enable config
{PM_SMBCHG_BAT_IF_LOW_BATTERY_THRESH_3P25, PM_DISABLE_CONFIG }, //Vlowbatt Threshold
{PM_SMBCHG_USBCHGPTH_INPUT_PRIORITY_USBIN, PM_DISABLE_CONFIG }, //Charger Path Input Priority
{PM_SMBCHG_BAT_IF_BAT_MISS_DETECT_SRC_BMD_PIN, PM_DISABLE_CONFIG }, //Battery Missing Detection Source
{PM_SMBCHG_MISC_WD_TMOUT_18S, PM_DISABLE_CONFIG }, //WDOG Timeout
{FALSE, PM_DISABLE_CONFIG }, //Enable WDOG
{1000, PM_DISABLE_CONFIG }, //FAST Charging Current
{250, PM_DISABLE_CONFIG }, //PRE Charge Current
{3000, PM_DISABLE_CONFIG }, //PRE to Fast Charge Current
{4350, PM_ENABLE_CONFIG }, //Float Voltage
{2100, PM_DISABLE_CONFIG }, //USBIN Input Current Limit
// {1000, PM_DISABLE_CONFIG }, //DCIN Input Current Limit
{200, PM_ENABLE_CONFIG }, //apsd_reset_theshold_mv
BOOTUP_VOLTAGE, //bootup_battery_theshold_mv
3800, //wipowr bootup battery thesholdmv
FALSE, //Enable/Disable JEITA Hard Temp Limit Check in SBL
FALSE, // dbc_high_current_mode
}
};
pm_sbl_chg_check_weak_battery_status这个是主要的函数.首先充电时候pre-charge,fast-charge.平台定义的话在pre-charge将type手动设置了USB(限流)所以不论怎么样都最大使用500ma的电流.
boot_log_message("Manually set to USB500 mode");
CHG_VERIFY(pm_smbchg_usb_chgpth_set_cmd_il(device_index, PM_SMBCHG_USBCHGPTH_CMD_IL__USB51_MODE, TRUE));
CHG_VERIFY(pm_smbchg_usb_chgpth_set_cmd_il(device_index, PM_SMBCHG_USBCHGPTH_CMD_IL__USBIN_MODE_CHG, FALSE));
根据这些我们首先需要去掉这个限制,
err_flag |= pm_smbchg_usb_chgpth_en_hvdcp(device_index, FALSE); //Disable HVDCP
err_flag |= pm_smbchg_usb_chgpth_config_aicl(device_index, PM_SMBCHG_USB_CHGPTH_AICL_CFG__AICL_EN, FALSE); //Disable AICL
err_flag |= pm_smbchg_usb_chgpth_set_cmd_il(device_index, PM_SMBCHG_USBCHGPTH_CMD_IL__USBIN_MODE_CHG, TRUE); //set HC mode
err_flag |= pm_smbchg_usb_chgpth_set_cmd_il(device_index, PM_SMBCHG_USBCHGPTH_CMD_IL__ICL_OVERRIDE, TRUE); //Set ICL_OVERRIDE
然后在设置寄存器将pre-charge current设置到550ma.这样的话预充电阶段能做的只有这么多.然后在设置pre_to_fast的值.将pre_to_fastcharge的值降低.在提高fastcharge的电流.具体设置可以再上面的smbchg_specific_data[1]数组中 enable 配置然后设置大小.也可以在pm_sbl_config_chg_parameters()函数中去设置.
最后就是根据不同项目GPIO口的状态做匹配.首先我是想用tlmm模块中的接口来获取gpio的状态,但是发现tlmm初始化在我们充电的后面.所以直接来读取寄存器.
#define GPIO_CFG (*(uint32 *)0x1083000) //TLMM_GPIO_CFG1
#define GPIO_IN_OUT (*(uint32 *)0x1083004) //TLMM_GPIO_IN_OUT
指针大法好!!!