Fix timing issues with battery desync fix

This commit is contained in:
Kostas Missos 2018-07-01 04:58:37 +03:00
parent e5a34c3818
commit d9dba2b182
2 changed files with 29 additions and 34 deletions

View file

@ -132,11 +132,11 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_FaultReg); data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_FaultReg);
*value = data & BQ24193_FAULT_THERM_MASK; *value = data & BQ24193_FAULT_THERM_MASK;
break; break;
case BQ24193_DevID: //Current now. case BQ24193_DevID: // Dev ID.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart); data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart);
*value = data & BQ24193_VENDORPART_DEV_MASK; *value = data & BQ24193_VENDORPART_DEV_MASK;
break; break;
case BQ24193_ProductNumber: //Current avg. case BQ24193_ProductNumber: // Product number.
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart); data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_VendorPart);
*value = (data & BQ24193_VENDORPART_PN_MASK) >> 3; *value = (data & BQ24193_VENDORPART_PN_MASK) >> 3;
break; break;
@ -146,24 +146,6 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
return 0; return 0;
} }
static int _bq24193_write_verify_reg(u8 reg, u8 value)
{
int retries = 8;
int ret;
u8 read_value;
do {
ret = i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, reg, value);
read_value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, reg);
if (read_value != value) {
ret = -1;
retries--;
}
} while (retries && read_value != value);
return ret;
}
void bq24193_fake_battery_removal() void bq24193_fake_battery_removal()
{ {
u8 value; u8 value;
@ -171,10 +153,10 @@ void bq24193_fake_battery_removal()
// Disable watchdog to keep BATFET disabled. // Disable watchdog to keep BATFET disabled.
value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer); value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer);
value &= ~BQ24193_CHRGTERM_WATCHDOG_MASK; value &= ~BQ24193_CHRGTERM_WATCHDOG_MASK;
_bq24193_write_verify_reg(BQ24193_ChrgTermTimer, value); i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgTermTimer, value);
// Force BATFET to disabled state. This disconnects the battery from the system. // Force BATFET to disabled state. This disconnects the battery from the system.
value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc); value = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc);
value |= BQ24193_MISC_BATFET_DI_MASK; value |= BQ24193_MISC_BATFET_DI_MASK;
_bq24193_write_verify_reg(BQ24193_Misc, value); i2c_send_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_Misc, value);
} }

View file

@ -1746,8 +1746,9 @@ void fix_battery_desync()
gfx_clear_grey(&gfx_ctxt, 0x1B); gfx_clear_grey(&gfx_ctxt, 0x1B);
gfx_con_setpos(&gfx_con, 0, 0); gfx_con_setpos(&gfx_con, 0, 0);
gfx_printf(&gfx_con, "%kAre you really sure?\nThis will wipe your battery stats completely!\n", 0xFFFFDD00); gfx_printf(&gfx_con, "%k\nThis will wipe your battery stats completely!\n"
gfx_printf(&gfx_con, "\nAdditionally you may need to reconfigure,\nyour time and date settings.\n%k", 0xFFCCCCCC); "%kAnd it may not power on without physically\nremoving and re-inserting the battery.\n%k"
"\nAre you really sure?%k\n", 0xFFFFDD00, 0xFFFF0000, 0xFFFFDD00, 0xFFCCCCCC);
gfx_puts(&gfx_con, "\nPress POWER to Continue.\nPress VOL to go to the menu.\n\n\n"); gfx_puts(&gfx_con, "\nPress POWER to Continue.\nPress VOL to go to the menu.\n\n\n");
u32 btn = btn_wait(); u32 btn = btn_wait();
@ -1755,20 +1756,32 @@ void fix_battery_desync()
{ {
gfx_clear_grey(&gfx_ctxt, 0x1B); gfx_clear_grey(&gfx_ctxt, 0x1B);
gfx_con_setpos(&gfx_con, 0, 0); gfx_con_setpos(&gfx_con, 0, 0);
gfx_printf(&gfx_con, "%kDisconnect the USB cable and wait 30 seconds.\naAfter that press any key!%k\n\n", 0xFFFFDD00, 0xFFCCCCCC); gfx_printf(&gfx_con, "%kKeep the USB cable connected!%k\n\n", 0xFFFFDD00, 0xFFCCCCCC);
gfx_printf(&gfx_con, "%k* After this process is done,\n connect the USB cable to power-on.\n\n%k", 0xFF00DDFF, 0xFFCCCCCC); gfx_con_getpos(&gfx_con, &gfx_con.savedx, &gfx_con.savedy);
sleep(500000);
btn_wait(); u8 value = 30;
while (value > 0)
{
gfx_con_setpos(&gfx_con, gfx_con.savedx, gfx_con.savedy);
gfx_printf(&gfx_con, "%kWait... (%ds) %k", 0xFF888888, value, 0xFFCCCCCC);
sleep(1000000);
value--;
}
gfx_con_setpos(&gfx_con, gfx_con.savedx, gfx_con.savedy);
//Check if still connected. //Check if still connected.
max17050_get_property(MAX17050_AvgCurrent, &avgCurrent); max17050_get_property(MAX17050_AvgCurrent, &avgCurrent);
if (avgCurrent < -100000) if ((avgCurrent / 1000) < -10)
{ EPRINTF("You need to be connected to a wall adapter\nor PC to apply this fix!");
bq24193_fake_battery_removal();
gfx_printf(&gfx_con, "If the device did not powered off,\ndo it from hekate menu");
}
else else
EPRINTF("You need to be disconnected from USB,\nto apply this fix!"); {
// Apply fix.
bq24193_fake_battery_removal();
gfx_printf(&gfx_con, "Done! \n"
"%k1. Remove the USB cable\n"
"2. Press POWER for 15s.\n"
"3. Reconnect the USB to power-on!%k\n", 0xFFFFDD00, 0xFFCCCCCC);
}
sleep(500000); sleep(500000);
btn_wait(); btn_wait();
} }