static void charge_core_sbatt_handler(int vbat, struct charge_segment_data segment_data[], struct charge_core_data *data) { /*not fcp do not use segment charging strategy */ if(FCP_STAGE_SUCESS != fcp_get_stage_status()) { return ; } switch (data->segment_type) { case SEGMENT_TYPE_BY_VBAT_ICHG: hwlog_debug("case = SEGMENT_TYPE_BY_VBAT_ICHG. \n"); charge_core_sbatt_by_vbat_ichg_handler(vbat, segment_data, data); break; case SEGMENT_TYPE_BY_VBAT: hwlog_debug("case = SEGMENT_TYPE_BY_VBAT. \n"); charge_core_sbatt_by_vbat_handler(vbat, segment_data, data); break; default: break; } }
/********************************************************** * Function: charge_core_protect_inductance_handler * Discription: update the charge parameters in different capacity to protect inductance * Parameters: cbat:battery capacity * inductance_data[]:the table for describe the inductance property * data:charge parameters * return value: NULL **********************************************************/ static void charge_core_protect_inductance_handler(int cbat, struct charge_inductance_data inductance_data[], struct charge_core_data *data) { int i; static int last_i = 0; static int last_iin = 0; static int last_cbat = 0; static int flag_running_first = 1; /*not fcp do not use segment charging strategy */ if(FCP_STAGE_SUCESS != fcp_get_stage_status()) { return ; } for (i = 0; i < INDUCTANCE_PARA_LEVEL; i++) { if ((cbat >= inductance_data[i].cap_min) && (cbat < inductance_data[i].cap_max)) { if ((last_i - i <= 0) || (inductance_data[i].cap_max - cbat > inductance_data[i].cap_back) || (abs(last_i - i) > 1) || (flag_running_first == 1)) { data->iin = data->iin < inductance_data[i].iin_inductance ? data->iin : inductance_data[i].iin_inductance; } else { data->iin = data->iin < last_iin ? data->iin : last_iin; } break; } } last_i = i; flag_running_first = 0; last_cbat = cbat; last_iin = data->iin; hwlog_info("%s : battery capacity is %%%d, last_iin set to %d ma,i = %d \n",__func__, cbat, data->iin,i); }
/********************************************************** * Function: charge_core_sbatt_handler * Discription: update the charge parameters in different segment charging * Parameters: vbat:battery voltage * segment_data[]:the table for describe the segment property * data:charge parameters * return value: NULL **********************************************************/ static void charge_core_sbatt_handler(int vbat, struct charge_segment_data segment_data[], struct charge_core_data *data) { int i,ichg; static int last_i = 0; static int last_vterm = 0; static int last_ichg = 0; static int last_vbat = 0; static int flag_running_first = 1; /*not fcp do not use segment charging strategy */ if(FCP_STAGE_SUCESS != fcp_get_stage_status()) { return ; } ichg = -hisi_battery_current(); /* choose index of segment_data */ for (i = 0; i < SEGMENT_PARA_LEVEL; i++) { if ((vbat >= segment_data[i].vbat_min) && (vbat < segment_data[i].vbat_max) && ichg < segment_data[i].ichg_segment) { if ((last_i - i <= 0) || (segment_data[i].vbat_max - vbat > segment_data[i].volt_back) || (abs(last_i - i) > 1) || (flag_running_first == 1)) { /*do nothing,just get index "i" */ } else { i = i+1; } break; } } /* if cannot choose right index ,keep last index */ if(i == SEGMENT_PARA_LEVEL) { i=last_i; } /* set ichg and vterm according to index only when two consecutive index is the same ,or keep last ichg and vterm */ if(last_i == i || flag_running_first == 1) { data->ichg = data->ichg < segment_data[i].ichg_segment ? data->ichg : segment_data[i].ichg_segment; data->vterm = data->vterm < segment_data[i].vterm_segment ? data->vterm : segment_data[i].vterm_segment; } else { data->ichg = data->ichg < last_ichg ? data->ichg :last_ichg; data->vterm = data->vterm < last_vterm ? data->vterm : last_vterm; } hwlog_info("%s :ichg = %d,vbat =%d , last_i =%d, i =%d,segment_data[i].ichg_segment =%d ,data->ichg =%d ,last_ichg = %d \n", __func__,ichg,vbat,last_i,i,segment_data[i].ichg_segment,data->ichg,last_ichg); last_i = i; flag_running_first = 0; last_vbat = vbat; last_ichg = data->ichg; last_vterm = data->vterm; }