@@ -212,6 +212,21 @@ enum battery_present battery_is_present(void)
212212 return batt_pres ;
213213}
214214
215+ uint32_t get_system_percentage (void )
216+ {
217+ static uint32_t pre_os_percentage ;
218+ uint32_t memmap_cap = * (uint32_t * )host_get_memmap (EC_MEMMAP_BATT_CAP );
219+ uint32_t memmap_lfcc = * (uint32_t * )host_get_memmap (EC_MEMMAP_BATT_LFCC );
220+ uint32_t os_percentage = 1000 * memmap_cap / (memmap_lfcc + 1 );
221+
222+ /* ensure this value is valid */
223+ if (os_percentage <= 1000 && os_percentage >= 0 ) {
224+ pre_os_percentage = os_percentage ;
225+ return os_percentage ;
226+ } else
227+ return pre_os_percentage ;
228+ }
229+
215230#ifdef CONFIG_EMI_REGION1
216231
217232void battery_customize (struct charge_state_data * emi_info )
@@ -248,7 +263,7 @@ void battery_customize(struct charge_state_data *emi_info)
248263
249264 * host_get_customer_memmap (EC_MEMMAP_ER1_BATT_AVER_TEMP ) =
250265 (emi_info -> batt .temperature - 2731 )/10 ;
251- * host_get_customer_memmap (EC_MEMMAP_ER1_BATT_PERCENTAGE ) = emi_info -> batt . display_charge / 10 ;
266+ * host_get_customer_memmap (EC_MEMMAP_ER1_BATT_PERCENTAGE ) = get_system_percentage () / 10 ;
252267
253268 if (emi_info -> batt .status & STATUS_FULLY_CHARGED )
254269 * host_get_customer_memmap (EC_MEMMAP_ER1_BATT_STATUS ) |= EC_BATT_FLAG_FULL ;
@@ -314,24 +329,37 @@ void battery_customize(struct charge_state_data *emi_info)
314329static void battery_percentage_control (void )
315330{
316331 enum ec_charge_control_mode new_mode ;
332+ static int in_percentage_control ;
333+ uint32_t batt_os_percentage = get_system_percentage ();
317334 int rv ;
318335
336+ /**
337+ * If the host command EC_CMD_CHARGE_CONTROL set control mode to CHARGE_CONTROL_DISCHARGE
338+ * or CHARGE_CONTROL_IDLE, ignore the battery_percentage_control();
339+ */
340+ if (!in_percentage_control && get_chg_ctrl_mode () != CHARGE_CONTROL_NORMAL )
341+ return ;
319342
320343 if (charging_maximum_level == NEED_RESTORE )
321344 system_get_bbram (SYSTEM_BBRAM_IDX_CHG_MAX , & charging_maximum_level );
322345
323346 if (charging_maximum_level & CHG_LIMIT_OVERRIDE ) {
324347 new_mode = CHARGE_CONTROL_NORMAL ;
325- if (charge_get_percent () == 100 )
348+ if (batt_os_percentage == 1000 )
326349 charging_maximum_level = charging_maximum_level | 0x64 ;
327350 } else if (charging_maximum_level < 20 )
328351 new_mode = CHARGE_CONTROL_NORMAL ;
329- else if (charge_get_percent () > charging_maximum_level )
352+ else if (batt_os_percentage > charging_maximum_level * 10 ) {
330353 new_mode = CHARGE_CONTROL_DISCHARGE ;
331- else if (charge_get_percent () == charging_maximum_level )
354+ in_percentage_control = 1 ;
355+ } else if (batt_os_percentage == charging_maximum_level * 10 ) {
332356 new_mode = CHARGE_CONTROL_IDLE ;
333- else
357+ in_percentage_control = 1 ;
358+ } else {
334359 new_mode = CHARGE_CONTROL_NORMAL ;
360+ in_percentage_control = 0 ;
361+ }
362+
335363
336364 ccprints ("Charge Limit mode = %d" , new_mode );
337365
@@ -445,6 +473,9 @@ __override void board_battery_compensate_params(struct batt_params *batt)
445473 batt -> flags &= ~BATT_FLAG_BAD_ANY ;
446474 batt -> flags |= BATT_FLAG_RESPONSIVE ;
447475 batt_cache .flags |= BATT_FLAG_RESPONSIVE ;
476+
477+ /* override the display charge value for Windows system */
478+ batt -> display_charge = get_system_percentage ();
448479}
449480
450481/*****************************************************************************/
0 commit comments