diff options
author | YongBeum Ha <ybha@samsung.com> | 2018-12-20 08:54:49 +0900 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-01-24 00:51:38 -0800 |
commit | ebb25bc556e399678189895b0371065e8c9507c0 (patch) | |
tree | 6f179932ebd77a447577fb94e4c79fd3d8c8ad54 /board/casta | |
parent | 544ba7da11eeeae342861b5ecfc72a50152a4711 (diff) | |
download | chrome-ec-ebb25bc556e399678189895b0371065e8c9507c0.tar.gz |
casta : Add battery information
Casta uses same battery as nautilus.
BUG=b:122868858
BRANCH=octopus
TEST=make -j buildall; flash EC & check battery information
Change-Id: I55894821744d242958c2dcf31da355b315d9ac8f
Signed-off-by: YongBeum Ha <ybha@samsung.com>
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/1385764
Reviewed-by: Philip Chen <philipchen@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1430740
Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'board/casta')
-rw-r--r-- | board/casta/battery.c | 122 | ||||
-rw-r--r-- | board/casta/board.c | 43 | ||||
-rw-r--r-- | board/casta/board.h | 5 |
3 files changed, 167 insertions, 3 deletions
diff --git a/board/casta/battery.c b/board/casta/battery.c index 6cb4fc5743..7cb6dff4c6 100644 --- a/board/casta/battery.c +++ b/board/casta/battery.c @@ -6,9 +6,14 @@ */ #include "battery_fuel_gauge.h" +#include "battery_smart.h" +#include "charge_state.h" #include "common.h" #include "util.h" +#define CHARGING_VOLTAGE_MV_SAFE 8400 +#define CHARGING_CURRENT_MA_SAFE 1500 + /* * Battery info for all casta battery types. Note that the fields * start_charging_min/max and charging_min/max are not used for the charger. @@ -32,8 +37,121 @@ * address, mask, and disconnect value need to be provided. */ const struct board_batt_params board_battery_info[] = { - /* TODO(b/119871861): Casta: battery datasheets and specs */ + [BATTERY_SDI] = { + .fuel_gauge = { + .manuf_name = "SDI", + .device_name = "4402D51", + .ship_mode = { + .reg_addr = 0x00, + .reg_data = { 0x0010, 0x0010 }, + }, + .fet = { + .mfgacc_support = 0, + .reg_addr = 0x00, + .reg_mask = 0xc000, + .disconnect_val = 0x8000, + } + }, + .batt_info = { + .voltage_max = 8700, + .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 = 50, + .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_TYPE_COUNT; +const enum battery_type DEFAULT_BATTERY_TYPE = BATTERY_SDI; + +int charger_profile_override(struct charge_state_data *curr) +{ + int current; + int voltage; + /* battery temp in 0.1 deg C */ + int bat_temp_c; + + /* + * Keep track of battery temperature range: + * + * ZONE_0 ZONE_1 ZONE_2 ZONE_3 + * ---+------+--------+--------+------+--- Temperature (C) + * 0 5 12 45 50 + */ + enum { + TEMP_ZONE_0, /* 0 <= bat_temp_c <= 5 */ + TEMP_ZONE_1, /* 5 < bat_temp_c <= 12 */ + TEMP_ZONE_2, /* 12 < bat_temp_c <= 45 */ + TEMP_ZONE_3, /* 45 < bat_temp_c <= 50 */ + TEMP_ZONE_COUNT, + TEMP_OUT_OF_RANGE = TEMP_ZONE_COUNT + } temp_zone; + + current = curr->requested_current; + voltage = curr->requested_voltage; + bat_temp_c = curr->batt.temperature - 2731; + + /* + * If the temperature reading is bad, assume the temperature + * is out of allowable range. + */ + if ((curr->batt.flags & BATT_FLAG_BAD_TEMPERATURE) || + (bat_temp_c < 0) || (bat_temp_c > 500)) + temp_zone = TEMP_OUT_OF_RANGE; + else if (bat_temp_c <= 50) + temp_zone = TEMP_ZONE_0; + else if (bat_temp_c <= 120) + temp_zone = TEMP_ZONE_1; + else if (bat_temp_c <= 450) + temp_zone = TEMP_ZONE_2; + else + temp_zone = TEMP_ZONE_3; + + switch (temp_zone) { + case TEMP_ZONE_0: + voltage = CHARGING_VOLTAGE_MV_SAFE; + current = CHARGING_CURRENT_MA_SAFE; + break; + case TEMP_ZONE_1: + current = CHARGING_CURRENT_MA_SAFE; + break; + case TEMP_ZONE_2: + break; + case TEMP_ZONE_3: + voltage = CHARGING_VOLTAGE_MV_SAFE; + break; + case TEMP_OUT_OF_RANGE: + /* Don't charge if outside of allowable temperature range */ + current = 0; + voltage = 0; + curr->batt.flags &= ~BATT_FLAG_WANT_CHARGE; + curr->state = ST_IDLE; + break; + } + + curr->requested_voltage = MIN(curr->requested_voltage, voltage); + curr->requested_current = MIN(curr->requested_current, current); + + 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; +} diff --git a/board/casta/board.c b/board/casta/board.c index 124601fa75..bcea197537 100644 --- a/board/casta/board.c +++ b/board/casta/board.c @@ -88,6 +88,49 @@ const struct temp_sensor_t temp_sensors[] = { }; BUILD_ASSERT(ARRAY_SIZE(temp_sensors) == TEMP_SENSOR_COUNT); +/* + * I2C callbacks to ensure bus free time for battery I2C transactions is at + * least 5ms. + */ +#define BATTERY_FREE_MIN_DELTA_US (5 * MSEC) +static timestamp_t battery_last_i2c_time; + +static int is_battery_i2c(int port, int slave_addr) +{ + return (port == I2C_PORT_BATTERY) && (slave_addr == BATTERY_ADDR); +} + +static int is_battery_port(int port) +{ + return (port == I2C_PORT_BATTERY); +} + +void i2c_start_xfer_notify(int port, int slave_addr) +{ + unsigned int time_delta_us; + + if (!is_battery_i2c(port, slave_addr)) + return; + + time_delta_us = time_since32(battery_last_i2c_time); + if (time_delta_us >= BATTERY_FREE_MIN_DELTA_US) + return; + + usleep(BATTERY_FREE_MIN_DELTA_US - time_delta_us); +} + +void i2c_end_xfer_notify(int port, int slave_addr) +{ + /* + * The bus free time needs to be maintained from last transaction + * on I2C bus to any device on it to the next transaction to battery. + */ + if (!is_battery_port(port)) + return; + + battery_last_i2c_time = get_time(); +} + void board_overcurrent_event(int port, int is_overcurrented) { /* Sanity check the port. */ diff --git a/board/casta/board.h b/board/casta/board.h index 8d83af75af..aa18f515b7 100644 --- a/board/casta/board.h +++ b/board/casta/board.h @@ -36,6 +36,9 @@ #define CONFIG_MKBP_EVENT #define CONFIG_MKBP_USE_HOST_EVENT +/* Battery W/A */ +#define CONFIG_I2C_XFER_BOARD_CALLBACK + #ifndef __ASSEMBLER__ #include "gpio_signal.h" @@ -55,8 +58,8 @@ enum temp_sensor_id { }; /* List of possible batteries */ -/* TODO(b/119871861): Casta: battery datasheets and specs */ enum battery_type { + BATTERY_SDI, BATTERY_TYPE_COUNT, }; |