mtk 充电线程的第五步调用相关充电函数分析
//如果定义了任一外部充电 IC,则选择 switch_charging.c 的函数,否则就是 linear_charging.c 的函数
void mt_battery_charging_algorithm()
{
switch(BMT_status.bat_charging_state)
{
case CHR_PRE ://pre模式
/*1。Init安全定时器。2 检查VBAT是否进入cc模式,检查USOC是否进入电池全态*/
BAT_PreChargeModeAction();
PMU_STATUS BAT_PreChargeModeAction(void)
{
battery_log(BAT_LOG_CRTI, "[BATTERY] Pre-CC mode charge, timer=%d on %d !!\n\r",
BMT_status.PRE_charging_time, BMT_status.total_charging_time);
/*1。Init安全定时器。2 检查VBAT是否进入cc模式,检查USOC是否进入电池全态*/
BMT_status.PRE_charging_time += BAT_TASK_PERIOD;
BMT_status.CC_charging_time = 0;
BMT_status.TOPOFF_charging_time = 0;
BMT_status.total_charging_time += BAT_TASK_PERIOD;
select_charging_curret();
ulc_cv_charging_current = g_temp_CC_value;
ulc_cv_charging_current_flag = KAL_FALSE;
if (BMT_status.UI_SOC == 100) {
BMT_status.bat_charging_state = CHR_BATFULL;
BMT_status.bat_full = KAL_TRUE;
g_charging_full_reset_bat_meter = KAL_TRUE;
} else if (BMT_status.bat_vol > batt_cust_data.v_pre2cc_thres) {
BMT_status.bat_charging_state = CHR_CC;
}
#if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) /* defined(MTK_LINEAR_CHARGER_NO_DISCHARGE) */
/* no disable charging 没有禁用充电*/
#else
{
kal_bool charging_enable = KAL_FALSE;
/*Charging 9s and discharging 1s : start 做充电算法。:充电9秒,停止充电1秒*///充电使能
//调用charging_hw_pmic.c文件中的CHARGING_CMD_ENABLE接口从而调用charging_enable使能函数
battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
/* 对应的充电芯片的硬件函数 */
signed int chr_control_interface(CHARGING_CTRL_CMD cmd, void *data)
{
signed int status;
static signed int init = -1;
if (init == -1) {
init = 0;
charging_func[CHARGING_CMD_INIT] = charging_hw_init;
charging_func[CHARGING_CMD_DUMP_REGISTER] = charging_dump_register;
charging_func[CHARGING_CMD_ENABLE] = charging_enable;
charging_func[CHARGING_CMD_SET_CV_VOLTAGE] = charging_set_cv_voltage;
charging_func[CHARGING_CMD_GET_CURRENT] = charging_get_current;
charging_func[CHARGING_CMD_SET_CURRENT] = charging_set_current;
charging_func[CHARGING_CMD_SET_INPUT_CURRENT] = charging_set_input_current;
charging_func[CHARGING_CMD_GET_CHARGING_STATUS] = charging_get_charging_status;
charging_func[CHARGING_CMD_RESET_WATCH_DOG_TIMER] = charging_reset_watch_dog_timer;
charging_func[CHARGING_CMD_SET_HV_THRESHOLD] = charging_set_hv_threshold;
charging_func[CHARGING_CMD_GET_HV_STATUS] = charging_get_hv_status;
charging_func[CHARGING_CMD_GET_BATTERY_STATUS] = charging_get_battery_status;
charging_func[CHARGING_CMD_GET_CHARGER_DET_STATUS] = charging_get_charger_det_status;
charging_func[CHARGING_CMD_GET_CHARGER_TYPE] = charging_get_charger_type;
charging_func[CHARGING_CMD_GET_IS_PCM_TIMER_TRIGGER] = charging_get_is_pcm_timer_trigger;
charging_func[CHARGING_CMD_SET_PLATFORM_RESET] = charging_set_platform_reset;
charging_func[CHARGING_CMD_GET_PLATFORM_BOOT_MODE] = charging_get_platform_boot_mode;
charging_func[CHARGING_CMD_SET_POWER_OFF] = charging_set_power_off;
charging_func[CHARGING_CMD_GET_POWER_SOURCE] = charging_get_power_source;
charging_func[CHARGING_CMD_GET_CSDAC_FALL_FLAG] = charging_get_csdac_full_flag;
charging_func[CHARGING_CMD_SET_TA_CURRENT_PATTERN] = charging_set_ta_current_pattern;
charging_func[CHARGING_CMD_SET_ERROR_STATE] = charging_set_error_state;
charging_func[CHARGING_CMD_DISO_INIT] = charging_diso_init;
charging_func[CHARGING_CMD_GET_DISO_STATE] = charging_get_diso_state;
}
if (cmd < CHARGING_CMD_NUMBER && charging_func[cmd])
status = charging_func[cmd](data);
else {
pr_err("Unsupported charging command:%d!\n", cmd);
return STATUS_UNSUPPORTED;
}
return status;
}
msleep(1000);
}
#endif
charging_current_calibration();
pchr_turn_on_charging();
return PMU_STATUS_OK;
}
static unsigned int charging_enable(void *data)
{
unsigned int status = STATUS_OK;
unsigned int enable = *(unsigned int *)(data);
if (enable == KAL_TRUE) {
upmu_set_rg_csdac_dly(0x4); /*CSDAC_DLY*/
upmu_set_rg_csdac_stp(0x1); /*CSDAC_STP*/
upmu_set_rg_csdac_stp_inc(0x1); /*CSDAC_STP_INC*/
upmu_set_rg_csdac_stp_dec(0x2); /*CSDAC_STP_DEC*/
upmu_set_rg_cs_en(1); /*CS_EN, check me*/
upmu_set_rg_hwcv_en(1);
upmu_set_rg_vbat_cv_en(1); /*CV_EN*/
upmu_set_rg_csdac_en(1); /*CSDAC_EN*/
upmu_set_rg_pchr_flag_en(1); /*enable debug flag output*/
upmu_set_rg_chr_en(1); /*CHR_EN*/
if (Enable_BATDRV_LOG == BAT_LOG_FULL)
charging_dump_register(NULL);
} else {
upmu_set_rg_chrwdt_int_en(0); /*CHRWDT_INT_EN*/
upmu_set_rg_chrwdt_en(0); /*CHRWDT_EN*/
upmu_set_rg_chrwdt_flag_wr(0); /*CHRWDT_FLAG*/
upmu_set_rg_csdac_en(0); /*CSDAC_EN*/
upmu_set_rg_chr_en(0); /*CHR_EN*/
upmu_set_rg_hwcv_en(0); /*RG_HWCV_EN*/
}
return status;
}
break;
case CHR_CC ://恒流cc模式作用
/*1。做充电器的保护2。(1)失败>如果充电器电压>6.5V 2>如果电池温度>50c停止充电。
如果(2)通过,做充电算法。:充电9秒,停止充电1秒。*/
BAT_ConstantCurrentModeAction();
PMU_STATUS BAT_ConstantCurrentModeAction(void)
{
//恒流cc模式作用
/*1。做充电器的保护2。(1)失败>如果充电器电压>6.5V 2>如果电池温度>50c停止充电。
如果(2)通过,做充电算法。:充电9秒,停止充电1秒。*/
battery_log(BAT_LOG_CRTI, "[BATTERY] CC mode charge, timer=%d on %d !!\n\r",
BMT_status.CC_charging_time, BMT_status.total_charging_time);
BMT_status.PRE_charging_time = 0;
BMT_status.CC_charging_time += BAT_TASK_PERIOD;
BMT_status.TOPOFF_charging_time = 0;
BMT_status.total_charging_time += BAT_TASK_PERIOD;
ulc_cv_charging_current_flag = KAL_FALSE;
ulc_cv_charging_current = g_temp_CC_value;
if (BMT_status.bat_vol > v_cc2topoff_threshold)
BMT_status.bat_charging_state = CHR_TOP_OFF;
#if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT) /* defined(MTK_LINEAR_CHARGER_NO_DISCHARGE) */
/* no disable charging#else */
#else
{
kal_bool charging_enable = KAL_FALSE;
/* Charging 9s and discharging 1s : start 做充电算法。:充电9秒,停止充电1秒*/
//调用charging_hw_pmic.c文件中的CHARGING_CMD_ENABLE接口从而调用charging_enable使能函数
battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
/* 对应的充电芯片的硬件函数 */
signed int chr_control_interface(CHARGING_CTRL_CMD cmd, void *data)
{
signed int status;
static signed int init = -1;
if (init == -1) {
init = 0;
charging_func[CHARGING_CMD_INIT] = charging_hw_init;
charging_func[CHARGING_CMD_DUMP_REGISTER] = charging_dump_register;
charging_func[CHARGING_CMD_ENABLE] = charging_enable;
charging_func[CHARGING_CMD_SET_CV_VOLTAGE] = charging_set_cv_voltage;
charging_func[CHARGING_CMD_GET_CURRENT] = charging_get_current;
charging_func[CHARGING_CMD_SET_CURRENT] = charging_set_current;
charging_func[CHARGING_CMD_SET_INPUT_CURRENT] = charging_set_input_current;
charging_func[CHARGING_CMD_GET_CHARGING_STATUS] = charging_get_charging_status;
charging_func[CHARGING_CMD_RESET_WATCH_DOG_TIMER] = charging_reset_watch_dog_timer;
charging_func[CHARGING_CMD_SET_HV_THRESHOLD] = charging_set_hv_threshold;
charging_func[CHARGING_CMD_GET_HV_STATUS] = charging_get_hv_status;
charging_func[CHARGING_CMD_GET_BATTERY_STATUS] = charging_get_battery_status;
charging_func[CHARGING_CMD_GET_CHARGER_DET_STATUS] = charging_get_charger_det_status;
charging_func[CHARGING_CMD_GET_CHARGER_TYPE] = charging_get_charger_type;
charging_func[CHARGING_CMD_GET_IS_PCM_TIMER_TRIGGER] = charging_get_is_pcm_timer_trigger;
charging_func[CHARGING_CMD_SET_PLATFORM_RESET] = charging_set_platform_reset;
charging_func[CHARGING_CMD_GET_PLATFORM_BOOT_MODE] = charging_get_platform_boot_mode;
charging_func[CHARGING_CMD_SET_POWER_OFF] = charging_set_power_off;
charging_func[CHARGING_CMD_GET_POWER_SOURCE] = charging_get_power_source;
charging_func[CHARGING_CMD_GET_CSDAC_FALL_FLAG] = charging_get_csdac_full_flag;
charging_func[CHARGING_CMD_SET_TA_CURRENT_PATTERN] = charging_set_ta_current_pattern;
charging_func[CHARGING_CMD_SET_ERROR_STATE] = charging_set_error_state;
charging_func[CHARGING_CMD_DISO_INIT] = charging_diso_init;
charging_func[CHARGING_CMD_GET_DISO_STATE] = charging_get_diso_state;
}
if (cmd < CHARGING_CMD_NUMBER && charging_func[cmd])
status = charging_func[cmd](data);
else {
pr_err("Unsupported charging command:%d!\n", cmd);
return STATUS_UNSUPPORTED;
}
return status;
}
msleep(1000);
}
#endif
charging_current_calibration();
pchr_turn_on_charging();
return PMU_STATUS_OK;
}
static unsigned int charging_enable(void *data)
{
unsigned int status = STATUS_OK;
unsigned int enable = *(unsigned int *)(data);
if (enable == KAL_TRUE) {
upmu_set_rg_csdac_dly(0x4); /*CSDAC_DLY*/
upmu_set_rg_csdac_stp(0x1); /*CSDAC_STP*/
upmu_set_rg_csdac_stp_inc(0x1); /*CSDAC_STP_INC*/
upmu_set_rg_csdac_stp_dec(0x2); /*CSDAC_STP_DEC*/
upmu_set_rg_cs_en(1); /*CS_EN, check me*/
upmu_set_rg_hwcv_en(1);
upmu_set_rg_vbat_cv_en(1); /*CV_EN*/
upmu_set_rg_csdac_en(1); /*CSDAC_EN*/
upmu_set_rg_pchr_flag_en(1); /*enable debug flag output*/
upmu_set_rg_chr_en(1); /*CHR_EN*/
if (Enable_BATDRV_LOG == BAT_LOG_FULL)
charging_dump_register(NULL);
} else {
upmu_set_rg_chrwdt_int_en(0); /*CHRWDT_INT_EN*/
upmu_set_rg_chrwdt_en(0); /*CHRWDT_EN*/
upmu_set_rg_chrwdt_flag_wr(0); /*CHRWDT_FLAG*/
upmu_set_rg_csdac_en(0); /*CSDAC_EN*/
upmu_set_rg_chr_en(0); /*CHR_EN*/
upmu_set_rg_hwcv_en(0); /*RG_HWCV_EN*/
}
return status;
}
}
break;
case CHR_TOP_OFF ://顶部模式(CV模式)。
//1。做充电器的保护2。如果(1)失败如果充电器电压>6.5V
//2>如果电池温度>50 停止充电3.
// 如果(2)通过,做充电算法。:充电10s
BAT_TopOffModeAction();
PMU_STATUS BAT_TopOffModeAction(void)
{
unsigned int charging_enable = KAL_FALSE;
unsigned int cv_voltage;
if (batt_cust_data.high_battery_voltage_support)
cv_voltage = 4350;
else
cv_voltage = 4200;
battery_log(BAT_LOG_CRTI, "[BATTERY] Top Off mode charge, timer=%d on %d !!\n\r",
BMT_status.TOPOFF_charging_time, BMT_status.total_charging_time);
BMT_status.PRE_charging_time = 0;
BMT_status.CC_charging_time = 0;
BMT_status.TOPOFF_charging_time += BAT_TASK_PERIOD;
BMT_status.total_charging_time += BAT_TASK_PERIOD;
if (BMT_status.bat_vol > (cv_voltage - CV_CHECK_DELAT_FOR_BANDGAP)) { /* CV - 0.08V */
pchr_sw_cv_charing_current_check();
}
pchr_turn_on_charging();
if ((BMT_status.TOPOFF_charging_time >= MAX_CV_CHARGING_TIME)
|| (charging_full_check() == KAL_TRUE)) {
BMT_status.bat_charging_state = CHR_BATFULL;
BMT_status.bat_full = KAL_TRUE;
g_charging_full_reset_bat_meter = KAL_TRUE;
/* Disable charging */
battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
}
break;
case CHR_BATFULL://满电模式
/*1。电池百分比总是显示100%注意:当充电,电池百分比仍然是100%。*/
BAT_BatteryFullAction();//原理同上
break;
case CHR_HOLD:
//保持模式
/*当充电器存在时,检查呼叫状态1。如果呼叫激活,Vbat>4.05V停止充电注意:避免热问题和燃料计量问题*/
BAT_BatteryHoldAction();//原理同上
break;
case CHR_ERROR://错误状态
//禁用充电器 禁用PE + / PE + 20
BAT_BatteryStatusFailAction();//原理同上
break;
}
}