📄 lcc_handle_message.c
字号:
ind = (struct pwr_adc_ind_s*)request;
ttw(ttr(TTrEventLow,"State=%d" NL, ind->data[State]));
// Basic trace - not for CAL
switch (pwr_ctrl->state)
{
case PRE :
ttw(ttr(TTrEventLow,"Vbat=%d" NL, ADC_to_mV(ind->data[Vbat])));
ttw(ttr(TTrEventLow,"Vchg=%d" NL, ADC_to_mV(ind->data[Vchg])));
ttw(ttr(TTrEventLow,"Ichg=%d" NL, ind->data[Ichg]));
break;
case INI :
case SUP :
case CCI :
case LCI :
case CCV :
case LCV :
ttw(ttr(TTrEventLow,"Vbat=%d" NL, ADC_to_mV(ind->data[Vbat])));
ttw(ttr(TTrEventLow,"Vbat_adc=%d" NL, ind->data[Vbat]));
#if (USE_Q402_CHG_CIRCUIT == 1)
// Vchg Scaling factor for Q402 circuit
pwr_cfg->data.Vchg = 5*ADC_to_mV(ind->data[Vchg])/4;
ttw(ttr(TTrEventLow,"Vchg=%d" NL, pwr_cfg->data.Vchg));
#else
pwr_cfg->data.Vchg = ADC_to_mV(ind->data[Vchg]);
ttw(ttr(TTrEventLow,"Vchg=%d" NL, pwr_cfg->data.Vchg));
#endif
ttw(ttr(TTrEventLow,"Ichg=%d" NL, ind->data[Ichg]));
ttw(ttr(TTrEventLow,"Type=%d" NL, ind->data[Type]));
ttw(ttr(TTrEventLow,"Tbat=%d" NL, ind->data[Tbat]));
ttw(ttr(TTrEventLow,"T_rf=%d" NL, ind->data[T_rf]));
ttw(ttr(TTrEventLow,"Vbt2=%d" NL, ADC_to_mV(ind->data[Vbt2])));
break;
}
// Updates variables in 'service' mode - not for CAL, PRE & INI
switch (pwr_ctrl->state)
{
case SUP :
case CCI :
case LCI :
case CCV :
case LCV :
index = pwr_ctrl->index % CONSECUTIVE_CHG_UNPLUGS;
ttw(ttr(TTrEventLow,"Using index: (%d)" NL, index));
pwr_ctrl->index++;
// Get current nucleus time
timer = rvf_get_tick_count();
// T0 timer expired?
pwr_ctrl->time_elapsed_T0 = pwr_timer_elapsed(pwr_ctrl->time_begin_T0, timer);
ttw(ttr(TTrTimerLow,"T0: %d ms elapsed " NL, pwr_ctrl->time_elapsed_T0));
// Compare T0 with configured sampling rate
if (pwr_ctrl->time_elapsed_T0 > pwr_cfg->common.sampling)
{
ttw(ttr(TTrTimer, "T0 Reset: elapsed (%d)" NL, pwr_ctrl->time_elapsed_T0));
pwr_ctrl->time_begin_T0 = timer;
}
pwr_cfg->data.Vbat = ind->data[Vbat];
pwr_cfg->data.Vbat_avg = (ind->data[Vbat] + pwr_cfg->common.alfa1 * pwr_cfg->data.Vbat_avg)/(pwr_cfg->common.alfa1 + 1);
//pwr_cfg->data.Vbat_avg_mV = ADC_to_mV(pwr_cfg->data.Vbat_avg);
tmp_vbat_mV = (ADC_to_mV(ind->data[Vbat]) + pwr_cfg->data.Vbat_avg_mV * pwr_cfg->common.alfa1) / (pwr_cfg->common.alfa1 + 1);
pwr_cfg->data.Vbat_avg_mV = (UINT16)tmp_vbat_mV;
/* Robert.Chen added, 2004-05-29 */
if(pwr_cfg->data.Vbat_avg_mV >= pwr_cfg->bat.chg_stop_thr && pwr_ctrl->state == CCV)
{
cv_overflow = 1;
}
/* add end */
ttw(ttr(TTrEventLow,"Vbat_avg=%d" NL, pwr_cfg->data.Vbat_avg_mV));
MI_dbgPrintf("zhq: PowerState=%d, Vbat=%d, Vbat_avg_mV=%d,Vbat=%d,Vbat_avg=%d", pwr_ctrl->state, ADC_to_mV(ind->data[Vbat]), pwr_cfg->data.Vbat_avg_mV,ind->data[Vbat],pwr_cfg->data.Vbat_avg);
pwr_cfg->data.Tbat = ind->data[Tbat];
pwr_cfg->data.Tbat_avg = (ind->data[Tbat] + pwr_cfg->common.alfa2 * pwr_cfg->data.Tbat_avg)/(pwr_cfg->common.alfa2 + 1);
ttw(ttr(TTrEventLow,"Tbat_avg=%d" NL, pwr_cfg->data.Tbat_avg));
temp = pwr_temp_lookup(pwr_cfg->data.Tbat_avg, 0x01);
ttw(ttr(TTrEventLow,"temp=%d" NL, temp));
pwr_cfg->data.T_rf_avg = ind->data[T_rf];
pwr_cfg->data.T_rf_avg = (ind->data[T_rf] + pwr_cfg->common.alfa3 * pwr_cfg->data.T_rf_avg)/(pwr_cfg->common.alfa3 + 1);
ttw(ttr(TTrEventLow,"T_rf_avg=%d" NL, pwr_cfg->data.T_rf_avg));
pwr_cfg->data.Ichg = ind->data[Ichg];
break;
}
// 'Main' switch
ttw(ttr(TTrEventLow,"state=%d" NL, pwr_ctrl->state));
switch (pwr_ctrl->state)
{
case CAL :
MI_dbgPrintf("zhq: we entered CAL state.");
// Read calibration files
// Decide if SW precharge should be started (state PRE) or if a normal configuration scheme should be inititated (state INI)
error = pwr_read_cal_files();
if (error >= 0)
{
MI_dbgPrintf("Vbat = %d", ADC_to_mV(ind->data[Vbat]));
// Save measurements - also initial values for averaging
pwr_cfg->data.Vbat_avg = pwr_cfg->data.Vbat = ind->data[Vbat];
pwr_cfg->data.Vbat_avg_mV = ADC_to_mV(pwr_cfg->data.Vbat_avg);
ttw(ttr(TTrEventLow,"Vbat=%d" NL, ADC_to_mV(ind->data[Vbat])));
ttw(ttr(TTrEventLow,"Vchg=%d" NL, ADC_to_mV(ind->data[Vchg])));
// Charger was already inserted?
status = ind->data[State];
if (status & CHGPRES)
{
// Charger plugged caused a wakeup
pwr_ctrl->flag_chg_plugged = 1;
pwr_ctrl->flag_chg_prev_plugged = 1;
ttw(ttr(TTrInitLow,"Polled - charger plugged (%d)" NL, status));
}
// Check Pre-charge - immediately change state to PRE
if ((pwr_cfg->data.Vbat_avg_mV < VBAT_PRECHG_START) && (pwr_ctrl->flag_chg_plugged == 1))
{
ttw(ttr(TTrInitLow,"precharge (%d)" NL, ADC_to_mV(ind->data[Vbat])));
// Charger interrupts (plug/unplug) are already masked off - in case it was a linear charger
pwr_ctrl->state = PRE;
#if (LCC_ALWAYS_MMI_INFO == 1)
#if 0
if(pwr_ctrl->flag_mmi_registered == 1)
{
pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG;
mmi_send_msg(pwr_ctrl->mmi_ptr);
}
#endif
#endif
}
else
{
pwr_ctrl->state = INI;
}
}
/* zhq, 2004/06/16, adding this for in INI and CAL state, no bat info is send to MMI, though mmi info timer
has been started in pwr_register(). pay attention that in INI and CAL, we should use a temporary capacity array.*/
#if (LCC_ALWAYS_MMI_INFO == 1)
pwr_check_timers();
#endif
break;
case PRE :
MI_dbgPrintf("zhq: we entered PRE state.");
// Start fast charge immediately after 3.2V boot
// Enter INI state - in order to read FFS configuration files - when Vbat reaches 3.6V
/* zhq, 2004/06/16, add below code for in PRE state, MMI should be
nofitied that charging has beging. */
if (pwr_ctrl->flag_mmi_registered == 1)
{
if(eventsend == 0)
{
pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG_START_IND;
mmi_send_msg(pwr_ctrl->mmi_ptr);
eventsend++;
}
else if (eventsend == 9)
{
eventsend = 0;
}
else
{
eventsend++;
}
}
// Hardcoding moving average to PRECHG_AVG_WINDOW_SIZE since we haven't read any configuration
pwr_cfg->data.Vbat = ind->data[Vbat];
pwr_cfg->data.Vbat_avg = (ind->data[Vbat] + PRECHG_AVG_WINDOW_SIZE * pwr_cfg->data.Vbat_avg)/(PRECHG_AVG_WINDOW_SIZE + 1);
pwr_cfg->data.Vbat_avg_mV = ADC_to_mV(pwr_cfg->data.Vbat_avg);
if (pwr_cfg->data.Vbat_avg_mV > VBAT_PRECHG_STOP)
{
ttw(ttr(TTrInitLow,"state PRE (%d > VBAT_PRECHG_STOP)" NL, pwr_cfg->data.Vbat_avg_mV));
pwr_ctrl->state = INI;
pwr_ctrl->flag_prechg_started = 0;
stop_pre_charge();
}
else
{
ttw(ttr(TTrInitLow,"state PRE (%d < VBAT_PRECHG_STOP)" NL, pwr_cfg->data.Vbat_avg_mV));
// Start fast charging NOW
if (pwr_ctrl->flag_prechg_started == 0)
{
pwr_ctrl->flag_prechg_started = 1;
start_pre_charge();
}
}
#if (LCC_ALWAYS_MMI_INFO == 1) /* Robert.Chen added, 2004-05-28, getting battery info at 'PRE' state */
pwr_check_timers();
#endif
break;
case INI :
MI_dbgPrintf("zhq: we entered INI state.");
// Charger was already inserted?
status = ind->data[State];
pwr_ctrl->chg_unplug_vec[index] = (status & CHGPRES);
if (status & CHGPRES)
{
// Charger plugged caused a wakeup
pwr_ctrl->flag_chg_plugged = 1;
pwr_ctrl->flag_chg_prev_plugged = 1;
ttw(ttr(TTrInitLow,"Polled - charger plugged (%d)" NL, status));
}
if (pwr_ctrl->flag_ini_virgo == 0)
{
// Perform some very basic initialization
/* Precharge (C/20) is switched OFF since it was finished in state PRE */
ABB_Write_Register_on_page(PAGE0, BCICTL2, 0x0002);
// Enable battery type identification
// Switch on battery type identification (TYPEN)
// NOTE: Battery type identification is ALWAYS done with 10uA (TYPEN)
ttw(ttr(TTrInitLow,"Enable type ident (%d)" NL, 0x00));
#if (LCC_BATID_DETECT_EN == 1) /* Robert.Chen added, */
ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_30uA | TYPEN);
#endif
pwr_ctrl->flag_ini_virgo = 1;
}
// Don't read battery files before we know which battery id to use
// We will ignore the first BATTERY_TYPE_SLIP measurements of battery id
if ((pwr_ctrl->count_bat_type == BATTERY_TYPE_SLIP))
{
error = pwr_task_init();
// Change state
pwr_ctrl->state = SUP;
// Readout /pwr/common.cfg
ttw(ttr(TTrInitLow,"common.cfg: pins: %d" NL, pwr_cfg->common.pins));
ttw(ttr(TTrInitLow,"chg_dedic %d" NL, pwr_cfg->common.chg_dedic));
ttw(ttr(TTrInitLow,"sampling %d" NL, pwr_cfg->common.sampling));
ttw(ttr(TTrInitLow,"mod_cycle %d" NL, pwr_cfg->common.mod_cycle));
ttw(ttr(TTrInitLow,"alfa1 %d" NL, pwr_cfg->common.alfa1));
ttw(ttr(TTrInitLow,"alfa2 %d" NL, pwr_cfg->common.alfa2));
ttw(ttr(TTrInitLow,"alfa3 %d" NL, pwr_cfg->common.alfa3));
ttw(ttr(TTrInitLow,"rise_thr %d" NL, pwr_cfg->common.rise_thr));
// Readout /pwr/bat/bat.cfg
ttw(ttr(TTrInitLow,"bat.cfg: type: %d" NL, pwr_cfg->bat.type));
ttw(ttr(TTrInitLow,"rf_temp: %d" NL, pwr_cfg->bat.rf_temp));
ttw(ttr(TTrInitLow,"id_low: %d" NL, pwr_cfg->bat.id_low));
ttw(ttr(TTrInitLow,"id_high: %d" NL, pwr_cfg->bat.id_high));
ttw(ttr(TTrInitLow,"cbat: %d" NL, pwr_cfg->bat.cbat));
ttw(ttr(TTrInitLow,"ratio: %d" NL, pwr_cfg->bat.ratio));
ttw(ttr(TTrInitLow,"T1: %d" NL, pwr_cfg->bat.T1));
ttw(ttr(TTrInitLow,"T2: %d" NL, pwr_cfg->bat.T2));
ttw(ttr(TTrInitLow,"T3: %d" NL, pwr_cfg->bat.T3));
ttw(ttr(TTrInitLow,"chg_start_thr: %d" NL, pwr_cfg->bat.chg_start_thr));
ttw(ttr(TTrInitLow,"chg_stop_thr: %d" NL, pwr_cfg->bat.chg_stop_thr));
ttw(ttr(TTrInitLow,"chg_ctrl_thr: %d" NL, pwr_cfg->bat.chg_ctrl_thr));
ttw(ttr(TTrInitLow,"chg_again_thr: %d" NL, pwr_cfg->bat.chg_again_thr));
// Readout /pwr/bat/temp<N>.cfg
ttw(ttr(TTrInitLow,"sizeof(temp): %d" NL, sizeof(pwr_cfg->temp)));
ttw(ttr(TTrInitLow,"sizeof(T_PWR_BAT_TEMP_CFG_BLOCK): %d" NL, sizeof(T_PWR_BAT_TEMP_CFG_BLOCK)));
ttw(ttr(TTrInitLow,"temp.cfg: tbat_min: %d" NL, pwr_cfg->temp.tbat_min));
ttw(ttr(TTrInitLow,"tbat_max: %d" NL, pwr_cfg->temp.tbat_max));
ttw(ttr(TTrInitLow,"i_meas1: %d" NL, pwr_cfg->temp.i_meas1));
for (i=0;i<=8;i++)
{
ttw(ttr(TTrInitLow,"v2t_1[]: %d" NL, pwr_cfg->temp.v2t_1[i]));
}
ttw(ttr(TTrInitLow,"i_meas2: %d" NL, pwr_cfg->temp.i_meas2));
for (i=0;i<=8;i++)
{
ttw(ttr(TTrInitLow,"v2t_2[]: %d" NL, pwr_cfg->temp.v2t_2[i]));
}
for (i=0;i<=9;i++)
{
ttw(ttr(TTrInitLow,"cap[]: %d" NL, pwr_cfg->temp.cap[i]));
}
ttw(ttr(TTrInitLow,"a0: %d" NL, pwr_cfg->temp.a0));
ttw(ttr(TTrInitLow,"a1: %d" NL, pwr_cfg->temp.a1));
ttw(ttr(TTrInitLow,"a2: %d" NL, pwr_cfg->temp.a2));
// Readout /mmi/pwr/bsie.cfg
ttw(ttr(TTrInitLow,"mmi repetition: %d" NL, pwr_cfg->mmi.repetition));
// Initialize battery temperature - must not be made in the virgo part since Tbat=0
pwr_cfg->data.Tbat_avg = ind->data[Tbat];
// Setup thermal sensor - don't re-enable TYPEN
/* zhq, 2004/06/16, add this macro to prevent using thermal resistor to detect
temperature for we do not have its support on hardware. */
#if (LCC_TEMP_DETECT_EN == 1)
if (pwr_cfg->temp.i_meas2 == 50)
{
ttw(ttr(TTrInitLow,"ABB set i_current: %d" NL, pwr_cfg->temp.i_meas2));
ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_50uA);
}
else if (pwr_cfg->temp.i_meas2 == 30)
{
ttw(ttr(TTrInitLow,"ABB set i_current: %d" NL, pwr_cfg->temp.i_meas2));
ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_30uA);
}
else
{
// Default 30uA
ttw(ttr(TTrInitLow,"ABB set i_current default: %d" NL, pwr_cfg->temp.i_meas2));
ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_30uA);
}
#endif
}
else
{
// Compare battery id with values found in FFS
// First value(s) are NOT to be trusted
pwr_ctrl->count_bat_type++;
pwr_cfg->data.bat_id = ind->data[Type];
}
/* zhq, 2004/06/16, adding this for in INI and CAL state, no bat info is send to MMI, though mmi info timer
has been started in pwr_register(). pay attention that in INI and CAL, we should use a temporary capacity array.*/
#if (LCC_ALWAYS_MMI_INFO == 1)
pwr_check_timers();
#endif
break;
case SUP :
MI_dbgPrintf("zhq: we entered SUP state.");
// Charger inserted?? Poll!!
// Reason: 100Hz interrupts will occur if an unregulated charger is inserted & charger interrupts are enabled
// This will cause an immediate crash!
status = ind->data[State];
pwr_ctrl->chg_unplug_vec[index] = (status & CHGPRES);
if (status & CHGPRES)
{
// Charger is plugged - continue
ttw(ttr(TTrEventLow,"Polled - chg plugged (%d)" NL, status));
pwr_ctrl->flag_chg_plugged = 1;
pwr_ctrl->capacity = pwr_capacity(pwr_cfg->data.Vbat_avg_mV);
}
else
{
pwr_ctrl->flag_chg_plugged = 0;
}
if (pwr_ctrl->flag_mmi_registered == 1)
{
// If the charger is plugged and no charging is initiated this message will be repeated until charging has started
// Charger plugged
if ((pwr_ctrl->flag_chg_plugged == 1) && (pwr_ctrl->flag_chg_prev_plugged == 0))
{
pwr_ctrl->flag_chg_prev_plugged = 1;
pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG_PLUG_IND;
mmi_send_msg(pwr_ctrl->mmi_ptr);
}
// Charger unplugged
if ((pwr_ctrl->flag_chg_plugged == 0) && (pwr_ctrl->flag_chg_prev_plugged == 1))
{
pwr_ctrl->flag_chg_prev_plugged = 0;
pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG_UNPLUG_IND;
mmi_send_msg(pwr_ctrl->mmi_ptr);
}
if (pwr_ctrl->flag_bat_unknown == 1)
{
// Battery unknown - inform the MMI
pwr_ctrl->mmi_ptr->header.msg_id = MMI_BAT_UNKNOWN_IND;
mmi_send_msg(pwr_ctrl->mmi_ptr);
// Send only once
pwr_ctrl->flag_bat_unknown = 0;
}
}
pwr_check_timers();
// If charger is plugged AND charger configuration is not read AND capacity is below configured limit - charger id Vchg(Load=0) must be measured
if ((pwr_ctrl->flag_chg_plugged == 1) &&
(pwr_ctrl->flag_chg_cfg_read == 0) &&
(pwr_ctrl->capacity < pwr_cfg->bat.chg_again_thr)
)
{
// Measurement loop - Take the 2nd Vchg(0) measurements
if (pwr_ctrl->count_chg_type == CHARGER_TYPE_SLIP)
{
if (pwr_cfg->data.Vchg > CHARGER_TYPE_OUT_OF_BOUND_LOW)
{
pwr_cfg->data.chg_id = pwr_cfg->data.Vchg;
}
else
{
// Out of bound!!
ttr(TTrWarning, "Charger id out of bound! %d" NL, pwr_cfg->data.Vchg);
pwr_cfg->data.chg_id = CHARGER_TYPE_TYPICAL;
}
ttw(ttr(TTrEventLow,"Using chg id=%d" NL, pwr_cfg->data.chg_id));
error = pwr_read_chg_files();
pwr_ctrl->flag_chg_cfg_read = 1;
// Initialize the circular buffer with charger plugs
for (i=0;i<= CONSECUTIVE_CHG_UNPLUGS-1 ;i++)
pwr_ctrl->chg_unplug_vec[i] = CHGPRES;
if (pwr_chg_start(pwr_temp_lookup(pwr_cfg->data.Tbat_avg, 0x01)) == TRUE)
{
if (pwr_cfg->chg.type == CI)
{
pwr_ctrl->state = CCI;
// Enable charger plug/unplug interrupts for a CI charger
ABB_Write_Register_on_page(PAGE0, ITMASK, ALL_IT_UMSK);
}
else
{
if (pwr_cfg->chg.type == UNREGULATED)
pwr_ctrl->state = LCI;
else
{
ttr(TTrWarning, "Unknown charger type! %d" NL, pwr_cfg->chg.type);
pwr_ctrl->state = LCI;
}
}
#if (USE_Q401_CHG_CIRCUIT == 1)
start_q401_charge();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -