@@ -212,6 +212,21 @@ enum battery_present battery_is_present(void)
212
212
return batt_pres ;
213
213
}
214
214
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
+
215
230
#ifdef CONFIG_EMI_REGION1
216
231
217
232
void battery_customize (struct charge_state_data * emi_info )
@@ -248,7 +263,7 @@ void battery_customize(struct charge_state_data *emi_info)
248
263
249
264
* host_get_customer_memmap (EC_MEMMAP_ER1_BATT_AVER_TEMP ) =
250
265
(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 ;
252
267
253
268
if (emi_info -> batt .status & STATUS_FULLY_CHARGED )
254
269
* 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)
314
329
static void battery_percentage_control (void )
315
330
{
316
331
enum ec_charge_control_mode new_mode ;
332
+ static int in_percentage_control ;
333
+ uint32_t batt_os_percentage = get_system_percentage ();
317
334
int rv ;
318
335
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 ;
319
342
320
343
if (charging_maximum_level == NEED_RESTORE )
321
344
system_get_bbram (SYSTEM_BBRAM_IDX_CHG_MAX , & charging_maximum_level );
322
345
323
346
if (charging_maximum_level & CHG_LIMIT_OVERRIDE ) {
324
347
new_mode = CHARGE_CONTROL_NORMAL ;
325
- if (charge_get_percent () == 100 )
348
+ if (batt_os_percentage == 1000 )
326
349
charging_maximum_level = charging_maximum_level | 0x64 ;
327
350
} else if (charging_maximum_level < 20 )
328
351
new_mode = CHARGE_CONTROL_NORMAL ;
329
- else if (charge_get_percent () > charging_maximum_level )
352
+ else if (batt_os_percentage > charging_maximum_level * 10 ) {
330
353
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 ) {
332
356
new_mode = CHARGE_CONTROL_IDLE ;
333
- else
357
+ in_percentage_control = 1 ;
358
+ } else {
334
359
new_mode = CHARGE_CONTROL_NORMAL ;
360
+ in_percentage_control = 0 ;
361
+ }
362
+
335
363
336
364
ccprints ("Charge Limit mode = %d" , new_mode );
337
365
@@ -445,6 +473,9 @@ __override void board_battery_compensate_params(struct batt_params *batt)
445
473
batt -> flags &= ~BATT_FLAG_BAD_ANY ;
446
474
batt -> flags |= BATT_FLAG_RESPONSIVE ;
447
475
batt_cache .flags |= BATT_FLAG_RESPONSIVE ;
476
+
477
+ /* override the display charge value for Windows system */
478
+ batt -> display_charge = get_system_percentage ();
448
479
}
449
480
450
481
/*****************************************************************************/
0 commit comments