power: fuel gauge: rk817: fix the display soc jump from 0 to 100
Change-Id: I8ad336bfdce6bac04ec5d07d885fd8a0992b4339 Signed-off-by: shengfei Xu <xsf@rock-chips.com>
This commit is contained in:
parent
52015e9715
commit
6aaa9b68fd
|
|
@ -20,7 +20,7 @@
|
|||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static int dbg_enable;
|
||||
static int dbg_enable = 1;
|
||||
#define DBG(args...) \
|
||||
do { \
|
||||
if (dbg_enable) { \
|
||||
|
|
@ -166,6 +166,7 @@ static int dbg_enable;
|
|||
|
||||
#define CHRG_CT_EN BIT(1)
|
||||
#define MIN_FCC 500
|
||||
#define CAP_INVALID BIT(7)
|
||||
|
||||
/* USB_CTRL_REG */
|
||||
#define INPUT_CUR_MSK 0x0f
|
||||
|
|
@ -219,8 +220,8 @@ struct rk817_battery_device {
|
|||
int pwron_voltage;
|
||||
int sm_linek;
|
||||
int sm_old_cap;
|
||||
u8 calc_dsoc;
|
||||
u8 calc_rsoc;
|
||||
int calc_dsoc;
|
||||
int calc_rsoc;
|
||||
int sm_chrg_dsoc;
|
||||
u8 halt_cnt;
|
||||
bool is_halt;
|
||||
|
|
@ -236,7 +237,6 @@ struct rk817_battery_device {
|
|||
u32 *ocv_table;
|
||||
int ocv_size;
|
||||
u32 design_capacity;
|
||||
u32 design_qmax;
|
||||
u32 max_soc_offset;
|
||||
u32 virtual_power;
|
||||
u32 chrg_type;
|
||||
|
|
@ -428,33 +428,6 @@ static void rk817_bat_calibration(struct rk817_battery_device *battery)
|
|||
}
|
||||
}
|
||||
|
||||
static u32 rk817_bat_get_capacity_uah(struct rk817_battery_device *battery)
|
||||
{
|
||||
u32 val = 0, capacity;
|
||||
|
||||
val = rk817_bat_read(battery, Q_PRES_H3) << 24;
|
||||
val |= rk817_bat_read(battery, Q_PRES_H2) << 16;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L1) << 8;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L0) << 0;
|
||||
|
||||
capacity = ADC_TO_CAPACITY_UAH(val, battery->res_div);
|
||||
return capacity;
|
||||
}
|
||||
|
||||
static u32 rk817_bat_get_capacity_mah(struct rk817_battery_device *battery)
|
||||
{
|
||||
u32 val, capacity;
|
||||
|
||||
val = rk817_bat_read(battery, Q_PRES_H3) << 24;
|
||||
val |= rk817_bat_read(battery, Q_PRES_H2) << 16;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L1) << 8;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L0) << 0;
|
||||
|
||||
capacity = ADC_TO_CAPACITY(val, battery->res_div);
|
||||
|
||||
return capacity;
|
||||
}
|
||||
|
||||
static void rk817_bat_init_coulomb_cap(struct rk817_battery_device *battery,
|
||||
u32 capacity)
|
||||
{
|
||||
|
|
@ -475,6 +448,47 @@ static void rk817_bat_init_coulomb_cap(struct rk817_battery_device *battery,
|
|||
battery->remain_cap = capacity * 1000;
|
||||
}
|
||||
|
||||
static bool rk817_bat_remain_cap_is_valid(struct rk817_battery_device *battery)
|
||||
{
|
||||
return !(rk817_bat_read(battery, Q_PRES_H3) & CAP_INVALID);
|
||||
}
|
||||
|
||||
static u32 rk817_bat_get_capacity_uah(struct rk817_battery_device *battery)
|
||||
{
|
||||
u32 val = 0, capacity = 0;
|
||||
|
||||
if (rk817_bat_remain_cap_is_valid(battery)) {
|
||||
val = rk817_bat_read(battery, Q_PRES_H3) << 24;
|
||||
val |= rk817_bat_read(battery, Q_PRES_H2) << 16;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L1) << 8;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L0) << 0;
|
||||
|
||||
capacity = ADC_TO_CAPACITY_UAH(val, battery->res_div);
|
||||
} else {
|
||||
rk817_bat_init_coulomb_cap(battery, 0);
|
||||
}
|
||||
|
||||
return capacity;
|
||||
}
|
||||
|
||||
static u32 rk817_bat_get_capacity_mah(struct rk817_battery_device *battery)
|
||||
{
|
||||
u32 val, capacity = 0;
|
||||
|
||||
if (rk817_bat_remain_cap_is_valid(battery)) {
|
||||
val = rk817_bat_read(battery, Q_PRES_H3) << 24;
|
||||
val |= rk817_bat_read(battery, Q_PRES_H2) << 16;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L1) << 8;
|
||||
val |= rk817_bat_read(battery, Q_PRES_L0) << 0;
|
||||
|
||||
capacity = ADC_TO_CAPACITY(val, battery->res_div);
|
||||
} else {
|
||||
rk817_bat_init_coulomb_cap(battery, 0);
|
||||
}
|
||||
|
||||
return capacity;
|
||||
}
|
||||
|
||||
static void rk817_bat_save_cap(struct rk817_battery_device *battery,
|
||||
int capacity)
|
||||
{
|
||||
|
|
@ -643,7 +657,7 @@ static int rk817_bat_get_fcc(struct rk817_battery_device *battery)
|
|||
{
|
||||
u32 fcc = 0;
|
||||
|
||||
fcc |= rk817_bat_read(battery, NEW_FCC_REG2) << 16;
|
||||
fcc = rk817_bat_read(battery, NEW_FCC_REG2) << 16;
|
||||
fcc |= rk817_bat_read(battery, NEW_FCC_REG1) << 8;
|
||||
fcc |= rk817_bat_read(battery, NEW_FCC_REG0) << 0;
|
||||
|
||||
|
|
@ -651,9 +665,9 @@ static int rk817_bat_get_fcc(struct rk817_battery_device *battery)
|
|||
DBG("invalid fcc(%d), use design cap", fcc);
|
||||
fcc = battery->design_capacity;
|
||||
rk817_bat_save_fcc(battery, fcc);
|
||||
} else if (fcc > battery->design_qmax) {
|
||||
} else if (fcc > battery->qmax) {
|
||||
DBG("invalid fcc(%d), use qmax", fcc);
|
||||
fcc = battery->design_qmax;
|
||||
fcc = battery->qmax;
|
||||
rk817_bat_save_fcc(battery, fcc);
|
||||
}
|
||||
|
||||
|
|
@ -977,6 +991,7 @@ static void rk817_bat_debug_info(struct rk817_battery_device *battery)
|
|||
DBG("k = %d, b = %d\n", battery->voltage_k, battery->voltage_b);
|
||||
DBG("battery: %d\n", rk817_bat_get_battery_voltage(battery));
|
||||
DBG("voltage_sys = %d\n", rk817_bat_get_sys_voltage(battery));
|
||||
DBG("voltage_usb = %d\n", rk817_bat_get_USB_voltage(battery));
|
||||
DBG("current_avg = %d\n", rk817_bat_get_avg_current(battery));
|
||||
DBG("dsoc = %d\n", battery->dsoc);
|
||||
DBG("rsoc = %d\n", rk817_bat_get_rsoc(battery));
|
||||
|
|
@ -1043,6 +1058,7 @@ static int rk817_bat_update_get_soc(struct udevice *dev)
|
|||
struct rk817_battery_device *battery = dev_get_priv(dev);
|
||||
static ulong seconds;
|
||||
|
||||
rk817_bat_debug_info(battery);
|
||||
/* set charge current */
|
||||
battery->chrg_type =
|
||||
rk817_bat_get_charger_type(battery);
|
||||
|
|
@ -1150,8 +1166,6 @@ static int rk817_fg_init(struct rk817_battery_device *battery)
|
|||
rk817_bat_rsoc_init(battery);
|
||||
rk817_bat_init_coulomb_cap(battery, battery->nac);
|
||||
rk817_bat_set_initialized_flag(battery);
|
||||
battery->remain_cap = rk817_bat_get_capacity_uah(battery);
|
||||
rk817_bat_calc_linek(battery);
|
||||
|
||||
battery->voltage_avg = rk817_bat_get_battery_voltage(battery);
|
||||
battery->voltage_sys = rk817_bat_get_sys_voltage(battery);
|
||||
|
|
@ -1161,6 +1175,7 @@ static int rk817_fg_init(struct rk817_battery_device *battery)
|
|||
battery->remain_cap = rk817_bat_get_capacity_uah(battery);
|
||||
battery->rsoc = rk817_bat_get_rsoc(battery);
|
||||
battery->sm_linek = rk817_bat_calc_linek(battery);
|
||||
battery->chrg_type = rk817_bat_get_charger_type(battery);
|
||||
battery->finish_chrg_base = get_timer(0);
|
||||
battery->term_sig_base = get_timer(0);
|
||||
|
||||
|
|
@ -1168,9 +1183,7 @@ static int rk817_fg_init(struct rk817_battery_device *battery)
|
|||
battery->dbg_pwr_rsoc = battery->rsoc;
|
||||
battery->dbg_pwr_vol = battery->voltage_avg;
|
||||
|
||||
DBG("chrg onle: %d\n", rk817_bat_dwc_otg_check_dpdm());
|
||||
DBG("chrg onle: %d\n", rk817_bat_dwc_otg_check_dpdm());
|
||||
DBG("chrg onle: %d\n", rk817_bat_dwc_otg_check_dpdm());
|
||||
rk817_bat_charger_setting(battery, battery->chrg_type);
|
||||
|
||||
DBG("voltage_k = %d, voltage_b = %d\n",
|
||||
battery->voltage_k, battery->voltage_b);
|
||||
|
|
@ -1184,6 +1197,7 @@ static int rk817_fg_init(struct rk817_battery_device *battery)
|
|||
DBG("qmax = %d\n", battery->qmax);
|
||||
DBG("dsoc = %d\n", battery->dsoc);
|
||||
DBG("rsoc = %d\n", battery->rsoc);
|
||||
DBG("charge type: %d\n", battery->chrg_type);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue