mtk 充电线程的第五步调用相关充电函数分析

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;                
                                                                                }    
                                                                               
                                                                            }

猜你喜欢

转载自blog.csdn.net/MrDongShiYi/article/details/85113233
MTK