/* * FUNCTION * bmt_charge_start * * DESCRIPTION * This function is to start charging algorithm. * * CALLS * * PARAMETERS * None * * RETURNS * None * * GLOBALS AFFECTED * None */ void bmt_charge_start(void) { kal_uint8 index; BMT_Charge(KAL_FALSE); BMT.pmictrl_state = PMIC_CHARGEOFF; BMT.bat_state = CHR_PRE; BMT.VBAT_UEM= VBAT_UEM_CHR_IN_FISRT; bmt_charge_time_value = 10; low_charger_count = 0; low_current_count = 0; low_temper_count = 0; over_temper_count = 0; #ifdef MTK_SLEEP_ENABLE L1SM_SleepDisable(bmt_sm_handle); #endif for(index=0;index<BMT_MAX_CHANNEL;index++) { adc_sche_modify_parameters(bmt_bmtid_adcscheid[index],1,1); adc_sche_add_item(bmt_bmtid_adcscheid[index],bmt_measure_complete1[index], bmt_adc_sche_measure); } adc_sche_set_timer_page_align(KAL_FALSE); stack_start_timer(&ChargeTimeout_timer, 0, KAL_TICKS_1_MIN*60*6); #ifdef BMT_KAL_DEBUG kal_trace(TRACE_FUNC, BMT_SAFETY_TIMER_START_TRC); #endif SaftyTimer_Flag = BMT_SaftyTimer_On; #if defined(MT6318) #if !defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__) if(pmic_is_chr_det(AC_CHR)) pmic_charging_currnet_ctrl(pmic_return_current(AC_CHR)); #ifdef __USB_MULTI_CHARGE_CURRENT__ else if (bmt_support_usb_charge()) /* If not support, charging current is not set here. */ pmic_charging_currnet_ctrl(pmic_return_current(USB_CHR)); #else /* __USB_MULTI_CHARGE_CURRENT__ */ else pmic_charging_currnet_ctrl(pmic_return_current(USB_CHR)); #endif /* __USB_MULTI_CHARGE_CURRENT__ */ #else/*defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)*/ if(chr_usb_detect.chr_usb_present == CHARGER_PRESENT) pmic_charging_currnet_ctrl(pmic_return_current(AC_CHR)); else if(chr_usb_detect.chr_usb_present == USB_PRESENT) { #ifdef __USB_MULTI_CHARGE_CURRENT__ if (bmt_support_usb_charge()) /* If not support, charging current is not set here. */ pmic_charging_currnet_ctrl(pmic_return_current(USB_CHR)); #else /* __USB_MULTI_CHARGE_CURRENT__ */ pmic_charging_currnet_ctrl(pmic_return_current(USB_CHR)); #endif /* __USB_MULTI_CHARGE_CURRENT__ */ } #endif #endif /* defined(MT6318) */ }
/* * FUNCTION * bmt_charge_end * * DESCRIPTION * This function is to stop charging when charger is plugged out * or serious error in charging stage. * * CALLS * * PARAMETERS * None * * RETURNS * None * * GLOBALS AFFECTED * None */ void bmt_charge_end(void) { #if defined(__EVB__) && defined(__MTK_INTERNAL__) /* under construction !*/ #elif defined(__DRV_BMT_NO_CHARGING__) return; #else//#if defined(__EVB__) DCL_STATUS adc_status; //#ifdef __DRV_BMT_SW_POLLING_CHARGER_OV__ // kal_cancel_timer(bmt_sw_polling_timerId); //#endif //#ifdef __DRV_BMT_SW_POLLING_CHARGER_OV__ #if defined(__DRV_BMT_ULTRA_LOW_COST_CHARGER__) bmt_chr_force_enable(KAL_FALSE); #endif BMT.pmictrl_state = PMIC_CHARGEOFF; BMT.VBAT_UEM= VBAT_UEM_CHR_OUT_FIRST; BMT_Charge(KAL_FALSE); adc_status = DclSADC_Control(bmt_adc_handle, ADC_CMD_STOP_MEASURE, NULL); if(adc_status != STATUS_OK) { ASSERT(0); } bmt_stop_stoptimer(); stack_stop_timer(&ChargeTimeout_timer); #ifdef __BMT_CHARGE_GUARD_TIME__ bmt_stop_guardtimer(); #endif #if defined(__DRV_BMT_ESTIMATIVE_TIMER_ON_TOPOFF__) bmt_stop_estimativetimer(); #endif //#if defined(__DRV_BMT_ESTIMATIVE_TIMER_ON_TOPOFF__) drv_trace1(TRACE_GROUP_10, BMT_SAFETY_TIMER_STOP_TRC, BMT_TOTAL_CHARGE_TIME); SaftyTimer_Flag = BMT_SAFETY_TIMER_OFF; // #ifdef MTK_SLEEP_ENABLE // L1SM_SleepEnable(bmt_sm_handle); // #endif bmt_enable_sleepmode(KAL_TRUE); #if defined(PMIC_CHARGE_WDT) // Defined in pmic_features.h bmt_charge_enable_wdt(KAL_FALSE); #endif // #if defined(PMIC_CHARGE_WDT) drv_trace0(TRACE_GROUP_10, BMT_CHARGING_END_TRC); // DclSADC_Close(adc_handle); #endif//#if defined(__EVB__) }
void bmt_sw_polling_ov(void *timer_param) { PMU_CTRL_CHR_GET_VCDT_HV_DET chr_hv_det; DclPMU_Control(bmt_PmuHandler, CHR_GET_VCDT_HV_DET, (DCL_CTRL_DATA_T *)&chr_hv_det); if (chr_hv_det.HV_deteted) { drv_trace0(TRACE_GROUP_10, BMT_SW_POLLING_CHARGER_OV_TRC); BMT_Charge(KAL_FALSE); } else { DclPMU_Control(bmt_PmuHandler, CHR_SET_WDT_CLEAR, NULL); } kal_set_timer(bmt_sw_polling_timerId, (kal_timer_func_ptr)bmt_sw_polling_ov, NULL,43 , 0); //200ms }
/* * FUNCTION * bmt_charge_end * * DESCRIPTION * This function is to stop charging when charger is plugged out * or serious error in charging stage. * * CALLS * * PARAMETERS * None * * RETURNS * None * * GLOBALS AFFECTED * None */ void bmt_charge_end(void) { kal_uint8 index; BMT.pmictrl_state = PMIC_CHARGEOFF; BMT.VBAT_UEM= VBAT_UEM_CHR_OUT_FIRST; BMT_Charge(KAL_FALSE); for(index=0;index<BMT_MAX_CHANNEL;index++) adc_sche_remove_item(bmt_bmtid_adcscheid[index]); adc_sche_set_timer_page_align(KAL_TRUE); bmt_stop_stoptimer(); stack_stop_timer(&ChargeTimeout_timer); #ifdef BMT_KAL_DEBUG kal_trace(TRACE_FUNC, BMT_SAFETY_TIMER_STOP_TRC); #endif SaftyTimer_Flag = BMT_SaftyTimer_Off; #ifdef MTK_SLEEP_ENABLE L1SM_SleepEnable(bmt_sm_handle); #endif }
/************************************************************************* * FUNCTION * DclBMT_Control * * DESCRIPTION * This function is to send command to control the BMT module. * * PARAMETERS * handle: The handle value returned from DclBMT_Open * cmd: A control command for BMT module * 1. BMT_CMD_CALLSTATE: to nodify talk/idle state to BMT task * 2. BMT_CMD_SET_EXT_CHARGER: to control the external charger * 3. BMT_CMD_IS_BAT_ON: to check is battery exist or not * 4. BMT_CMD_SENDMES2UEM: to send message from BMT to UEM * 5. BMT_CMD_SET_CHR_STATUS: to set charger status * 6. BMT_CMD_VBATINHISR: to save the Battery voltage in HISR * * data: The data of the control command * 1. BMT_CMD_CALLSTATE: pointer to a BMT_CTRL_CALLSTATE_T structure * 2. BMT_CMD_SET_EXT_CHARGER: pointer to a BMT_CTRL_SET_EXT_CHARGER_T structure * 3. BMT_CMD_IS_BAT_ON: pointer to a BMT_CTRL_IS_BAT_ON_T structure * 4. BMT_CMD_SENDMES2UEM: pointer to a BMT_CTRL_SENDMES2UEM_T structure * 5. BMT_CMD_SET_CHR_STATUS: pointer to a BMT_CTRL_SET_CHR_STATUS_T structure * 6. BMT_CMD_VBATINHISR: A null pointer * * RETURNS * STATUS_OK: command is executed successfully. * STATUS_FAIL: command is failed. * STATUS_INVALID_CMD: It's a invalid command. * *************************************************************************/ DCL_STATUS DclBMT_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data) { DCL_STATUS return_status = STATUS_INVALID_CMD; // Check magic number if ((handle & DCL_BMT_DEV_MAGIC_NUM) != DCL_BMT_DEV_MAGIC_NUM){ ASSERT(0); return STATUS_INVALID_DCL_HANDLE; } // Error check if (dcl_bmt_handle_count == 0){ ASSERT(0); return STATUS_NOT_OPENED; } switch (cmd) { #ifdef __BACKUP_DOWNLOAD_RESTORE_WITHOUT_BATTERY__ case BMT_CMD_WDT_INIT: { if (bmt_without_battery_handle == 0x7F) { bmt_without_battery_handle=DclSGPT_Open(DCL_GPT_CB,0); } { SGPT_CTRL_START_T start; start.u2Tick=1000; // 10 secs start.pfCallback=bmt_without_battery_callback; start.vPara=NULL; DclSGPT_Control(bmt_without_battery_handle,SGPT_CMD_START,(DCL_CTRL_DATA_T*)&start); } } break; #endif //#ifdef __BACKUP_DOWNLOAD_RESTORE_WITHOUT_BATTERY__ case BMT_CMD_CALLSTATE: { BMT_CTRL_CALLSTATE_T *prCallState; prCallState = &(data->rCallState); BMT_CallState(prCallState->call_state); return_status = STATUS_OK; } break; case BMT_CMD_CHARGE: { BMT_CTRL_CHARGE_T *prChargeControl; prChargeControl = &(data->rChargeControl); if(INT_GetSysStaByCmd(CHK_USB_META_WO_BAT, NULL)==KAL_TRUE && prChargeControl->bEnable==DCL_TRUE) { return_status = STATUS_OK; break; } BMT_Charge((kal_bool)prChargeControl->bEnable); return_status = STATUS_OK; } break; case BMT_CMD_GET_CUSTOMIZED_PARA: { BMT_CTRL_GET_CUSTOMIZED_PARA_T *prGetCustomizedPara; prGetCustomizedPara = &(data->rGetCustomizedPara); return_status = bmt_get_customized_para(prGetCustomizedPara); } break; case BMT_CMD_SET_EXT_CHARGER: { return_status = STATUS_UNSUPPORTED; } break; case BMT_CMD_INITIALIZE: { bmt_initialize(); return_status = STATUS_OK; } break; case BMT_CMD_IS_BAT_ON: { BMT_CTRL_IS_BAT_ON_T *prIsBatOn; prIsBatOn = &(data->rIsBatOn); prIsBatOn->fgBatIsOn = (DCL_BOOLEAN)bmt_is_bat_on(); return_status = STATUS_OK; } break; case BMT_CMD_SENDMES2UEM: { BMT_CTRL_SENDMES2UEM_T *prSendMes2Uem; prSendMes2Uem = &(data->rSendMes2Uem); BMT_sendMes2UEM((BMT_CHR_STAT)prSendMes2Uem->ChargerMsg); return_status = STATUS_OK; } break; case BMT_CMD_SET_CHR_STATUS: { BMT_CTRL_SET_CHR_STATUS_T *prSetChrStatus; prSetChrStatus = &(data->rSetChrStatus); bmt_set_chr_status((Charger_Status)prSetChrStatus->ChargerStat); return_status = STATUS_OK; } break; case BMT_CMD_VBATINHISR: { #if defined( __DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__) BMT_VbatInHISR(); return_status = STATUS_OK; #else return_status = STATUS_UNSUPPORTED; #endif } break; default: return_status = STATUS_INVALID_CMD; break; } return return_status; // return STATUS_FAIL; }
/* * FUNCTION * bmt_charge_start * * DESCRIPTION * This function is to start charging algorithm. * * CALLS * * PARAMETERS * None * * RETURNS * None * * GLOBALS AFFECTED * None */ void bmt_charge_start(void) { #if defined(__EVB__) && defined(__MTK_INTERNAL__) /* under construction !*/ #elif defined(__DRV_BMT_NO_CHARGING__) return; #else //#if defined(__EVB__) #if defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__) double adc; #endif //#if defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__) DCL_STATUS adc_status; ADC_CTRL_MODIFY_PARAM_T adc_para; #if defined(MT6236) || defined(MT6252) PMU_CTRL_CHR_SET_CHR_CURRENT set_chr_current; #endif //#ifdef __DRV_BMT_SW_POLLING_CHARGER_OV__ // kal_set_timer(bmt_sw_polling_timerId, (kal_timer_func_ptr)bmt_sw_polling_ov, NULL,43 , 0); //#endif //#ifdef __DRV_BMT_SW_POLLING_CHARGER_OV__ BMT_Charge(KAL_FALSE); BMT.pmictrl_state = PMIC_CHARGEOFF; #if defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__) if(g_battery_pre_voltage == 0) BMT_Current_Voltage(DCL_VBAT_ADC_CHANNEL, &g_battery_pre_voltage,&adc); BMT.bat_state = CHR_PRE_FULL_CHECK; #else //defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__) BMT.bat_state = CHR_PRE; #endif //defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__) BMT.VBAT_UEM= VBAT_UEM_CHR_IN_FISRT; low_charger_count = 0; low_current_count = 0; low_temper_count = 0; over_temper_count = 0; #if defined(DRV_BMT_HW_PRECC_WORKAROUND) SW_Workaround_Flag = KAL_TRUE; HW_Plug_Status = bmt_chr_uninit; Manual_Disable_Charge_Flag = KAL_FALSE; #endif #if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT) First_Time_Charge_Enable = KAL_TRUE; bmt_high_vchg_current = 0xFFFFFFF; Pre_VCharge_AVG = 0; Cur_VCharge_MAX = 0; #endif bmt_enable_sleepmode(KAL_FALSE); // #ifdef MTK_SLEEP_ENABLE // L1SM_SleepDisable(bmt_sm_handle); // #endif adc_para.u4Period = 1; adc_para.u1EvaluateCount = 1; adc_status = DclSADC_Control(bmt_adc_handle, ADC_CMD_MODIFY_PARAM, (DCL_CTRL_DATA_T *)&adc_para); if(adc_status != STATUS_OK) { ASSERT(0); } adc_status = DclSADC_Control(bmt_adc_handle, ADC_CMD_START_MEASURE, NULL); if(adc_status != STATUS_OK) { ASSERT(0); } #ifdef __BMT_CHARGE_GUARD_TIME__ bmt_set_guardtimer(KAL_TICKS_1_MIN*BMT_CHARGE_GUARD_TIME_PERIOD); drv_trace2(TRACE_GROUP_10, BMT_SAFETY_AND_GUARD_TIMER_START_TRC, BMT_TOTAL_CHARGE_TIME, BMT_CHARGE_GUARD_TIME_PERIOD); #else // __BMT_CHARGE_GUARD_TIME__ #if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT) bmt_safety_timer_config = KAL_FALSE; #else stack_start_timer(&ChargeTimeout_timer, 0, KAL_TICKS_1_MIN*BMT_TOTAL_CHARGE_TIME); drv_trace1(TRACE_GROUP_10, BMT_SAFETY_TIMER_START_TRC, BMT_TOTAL_CHARGE_TIME); SaftyTimer_Flag = BMT_SAFETY_TIMER_ON; #endif //#if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT) #endif // __BMT_CHARGE_GUARD_TIME__ #if defined(MT6236) || defined(MT6252) set_chr_current.current = PMU_CHARGE_CURRENT_200_00_MA; // Pre-CC 200mA DclPMU_Control(bmt_PmuHandler, CHR_SET_CHR_CURRENT, (DCL_CTRL_DATA_T *)&set_chr_current); #else bmt_set_chr_current(); #endif #if defined(PMIC_CHARGE_WDT) // Defined in pmic_features.h bmt_charge_enable_wdt(KAL_TRUE); #endif // #if defined(PMIC_CHARGE_WDT) drv_trace0(TRACE_GROUP_10, BMT_CHARGING_START_TRC); #endif//#if defined(__EVB__) }