summaryrefslogtreecommitdiff
path: root/board/bugzzy/battery.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/bugzzy/battery.c')
-rw-r--r--board/bugzzy/battery.c113
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);