diff options
Diffstat (limited to 'board/bugzzy/battery.c')
-rw-r--r-- | board/bugzzy/battery.c | 113 |
1 files changed, 92 insertions, 21 deletions
diff --git a/board/bugzzy/battery.c b/board/bugzzy/battery.c index 12ec2c42aa..5f6c54cb9a 100644 --- a/board/bugzzy/battery.c +++ b/board/bugzzy/battery.c @@ -8,9 +8,12 @@ #include "battery_fuel_gauge.h" #include "charge_state.h" #include "common.h" +#include "hooks.h" +#include "usb_pd.h" +#include "util.h" /* - * Battery info for all waddledoo battery types. Note that the fields + * Battery info for all bugzzy battery types. Note that the fields * start_charging_min/max and charging_min/max are not used for the charger. * The effective temperature limits are given by discharging_min/max_c. * @@ -30,37 +33,105 @@ * The assumption for battery types supported is that the charge/discharge FET * status can be read with a sb_read() command and therefore, only the register * address, mask, and disconnect value need to be provided. + * + * Battery FET Status in Manufacture Access : bit15 & bit14 + * b'00 - dfet : on / cfet : on + * b'01 - dfet : on / cfet : off + * b'10 - dfet : off / cfet : off + * b'11 - dfet : off / cfet : on + * The value b'10 is disconnect_val, so we can use b'01 for cfet_off_val */ + +/* charging current is limited to 0.45C */ +#define CHARGING_CURRENT_45C 2804 + const struct board_batt_params board_battery_info[] = { - /* POW-TECH Battery Information */ - [BATTERY_POWER_TECH] = { + /* SDI Battery Information */ + [BATTERY_SDI] = { .fuel_gauge = { - .manuf_name = "POW-TECH", + .manuf_name = "SDI", + .device_name = "4404D57", .ship_mode = { - .reg_addr = 0x0, - .reg_data = { 0x10, 0x10 }, + .reg_addr = 0x00, + .reg_data = { 0x0010, 0x0010 }, }, .fet = { - .reg_addr = 0x00, - .reg_mask = 0x2000, - .disconnect_val = 0x2000, + .mfgacc_support = 0, + .reg_addr = 0x00, + .reg_mask = 0xc000, + .disconnect_val = 0x8000, + .cfet_mask = 0xc000, + .cfet_off_val = 0x2000, } }, .batt_info = { - .voltage_max = 8800, /* mV */ - .voltage_normal = 7700, - .voltage_min = 6000, - .precharge_current = 160, /* mA */ - .start_charging_min_c = 0, - .start_charging_max_c = 45, - .charging_min_c = 0, - .charging_max_c = 45, - .discharging_min_c = -20, - .discharging_max_c = 60, + .voltage_max = 8800, + .voltage_normal = 7700, /* mV */ + .voltage_min = 6000, /* mV */ + .precharge_current = 200, /* mA */ + .start_charging_min_c = 0, + .start_charging_max_c = 45, + .charging_min_c = 0, + .charging_max_c = 55, + .discharging_min_c = -20, + .discharging_max_c = 70, }, - }, }; BUILD_ASSERT(ARRAY_SIZE(board_battery_info) == BATTERY_TYPE_COUNT); -const enum battery_type DEFAULT_BATTERY_TYPE = BATTERY_POWER_TECH; +const enum battery_type DEFAULT_BATTERY_TYPE = BATTERY_SDI; + +int charger_profile_override(struct charge_state_data *curr) +{ + if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) + return 0; + + if (curr->requested_current > CHARGING_CURRENT_45C) + curr->requested_current = CHARGING_CURRENT_45C; + + return 0; +} + +/* Customs options controllable by host command. */ +#define PARAM_FASTCHARGE (CS_PARAM_CUSTOM_PROFILE_MIN + 0) + +enum ec_status charger_profile_override_get_param(uint32_t param, + uint32_t *value) +{ + return EC_RES_INVALID_PARAM; +} + +enum ec_status charger_profile_override_set_param(uint32_t param, + uint32_t value) +{ + return EC_RES_INVALID_PARAM; +} + +/* Lower our input voltage to 5V in S0iX when battery is full. */ +#define PD_VOLTAGE_WHEN_FULL 5000 +static void reduce_input_voltage_when_full(void) +{ + static int saved_input_voltage = -1; + int max_pd_voltage_mv = pd_get_max_voltage(); + int port; + + if (charge_get_percent() == 100 && + chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) { + if (max_pd_voltage_mv != PD_VOLTAGE_WHEN_FULL) { + saved_input_voltage = max_pd_voltage_mv; + max_pd_voltage_mv = PD_VOLTAGE_WHEN_FULL; + } + } else if (saved_input_voltage != -1) { + if (max_pd_voltage_mv == PD_VOLTAGE_WHEN_FULL) + max_pd_voltage_mv = saved_input_voltage; + saved_input_voltage = -1; + } + + if (pd_get_max_voltage() != max_pd_voltage_mv) { + for (port = 0; port < CONFIG_USB_PD_PORT_MAX_COUNT; port++) + pd_set_external_voltage_limit(port, max_pd_voltage_mv); + } +} +DECLARE_HOOK(HOOK_SECOND, reduce_input_voltage_when_full, + HOOK_PRIO_DEFAULT); |