summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2016-03-29 02:01:55 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-03-31 14:53:52 -0700
commite2deea36495ae4c6541db0ff0899c700b731ced7 (patch)
tree52c81114338a1f89271906c6c70f319533e7116d
parent55bd1930f1822d3f7947721e47004800a65b8095 (diff)
downloadchrome-ec-e2deea36495ae4c6541db0ff0899c700b731ced7.tar.gz
kevin: Add battery and charger support
Add support for bd99955 charger and battery. BUG=chrome-os-partner:51722 TEST=Verify kevin charges at 3A input current when zinger is inserted, and verify battery actually charges. BRANCH=None Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Change-Id: Iccd8185585fe39440681f5830cf58acafe6291b8 Reviewed-on: https://chromium-review.googlesource.com/335538 Commit-Ready: Shawn N <shawnn@chromium.org> Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Mary Ruthven <mruthven@chromium.org>
-rw-r--r--board/kevin/battery.c82
-rw-r--r--board/kevin/board.c72
-rw-r--r--board/kevin/board.h11
-rw-r--r--board/kevin/build.mk3
-rw-r--r--board/kevin/ec.tasklist1
-rw-r--r--board/kevin/gpio.inc6
-rw-r--r--board/kevin/usb_pd_policy.c7
7 files changed, 168 insertions, 14 deletions
diff --git a/board/kevin/battery.c b/board/kevin/battery.c
new file mode 100644
index 0000000000..8fc9f02c90
--- /dev/null
+++ b/board/kevin/battery.c
@@ -0,0 +1,82 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Battery pack vendor provided charging profile
+ */
+
+#include "battery.h"
+#include "battery_smart.h"
+#include "charge_state.h"
+#include "console.h"
+#include "ec_commands.h"
+#include "util.h"
+
+/* Shutdown mode parameter to write to manufacturer access register */
+#define SB_SHUTDOWN_DATA 0x0010
+
+/* Battery info for proto - copied from celes */
+/* TODO: Update once real battery is available */
+static const struct battery_info info = {
+ .voltage_max = 8700,
+ .voltage_normal = 7600,
+ .voltage_min = 6000,
+ .precharge_current = 150,
+ .start_charging_min_c = 0,
+ .start_charging_max_c = 45,
+ .charging_min_c = 0,
+ .charging_max_c = 60,
+ .discharging_min_c = -20,
+ .discharging_max_c = 60,
+};
+
+const struct battery_info *battery_get_info(void)
+{
+ return &info;
+}
+
+int board_cut_off_battery(void)
+{
+ int rv;
+
+ /* Ship mode command must be sent twice to take effect */
+ rv = sb_write(SB_MANUFACTURER_ACCESS, SB_SHUTDOWN_DATA);
+ if (rv != EC_SUCCESS)
+ return EC_RES_ERROR;
+
+ rv = sb_write(SB_MANUFACTURER_ACCESS, SB_SHUTDOWN_DATA);
+ return rv ? EC_RES_ERROR : EC_RES_SUCCESS;
+}
+
+int charger_profile_override(struct charge_state_data *curr)
+{
+ const struct battery_info *batt_info;
+ /* battery temp in 0.1 deg C */
+ int bat_temp_c = curr->batt.temperature - 2731;
+
+ batt_info = battery_get_info();
+ /* Don't charge if outside of allowable temperature range */
+ if (bat_temp_c >= batt_info->charging_max_c * 10 ||
+ bat_temp_c < batt_info->charging_min_c * 10) {
+ curr->requested_current = 0;
+ curr->requested_voltage = 0;
+ curr->batt.flags &= ~BATT_FLAG_WANT_CHARGE;
+ curr->state = ST_IDLE;
+ }
+ 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/kevin/board.c b/board/kevin/board.c
index bc615eba49..d49eafa7e0 100644
--- a/board/kevin/board.c
+++ b/board/kevin/board.c
@@ -7,10 +7,17 @@
#include "adc_chip.h"
#include "backlight.h"
#include "button.h"
+#include "charge_manager.h"
+#include "charge_state.h"
+#include "charger.h"
+#include "chipset.h"
#include "common.h"
+#include "console.h"
+#include "driver/charger/bd99955.h"
#include "driver/tcpm/fusb302.h"
#include "extpower.h"
#include "gpio.h"
+#include "hooks.h"
#include "host_command.h"
#include "i2c.h"
#include "keyboard_scan.h"
@@ -24,9 +31,13 @@
#include "switch.h"
#include "timer.h"
#include "thermal.h"
+#include "usb_charge.h"
#include "usb_pd_tcpm.h"
#include "util.h"
+#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args)
+#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args)
+
static void tcpc_alert_event(enum gpio_signal signal)
{
/* Exchange status with TCPCs */
@@ -123,18 +134,67 @@ uint16_t tcpc_get_alert_status(void)
int board_set_active_charge_port(int charge_port)
{
- /* TODO: Select proper charge port through BD99955 regs. */
- ASSERT(charge_port != 1);
- return EC_SUCCESS;
+ enum bd99955_charge_port bd99955_port;
+
+ CPRINTS("New chg p%d", charge_port);
+
+ switch (charge_port) {
+ case 0:
+ bd99955_port = BD99955_CHARGE_PORT_VBUS;
+ break;
+ case 1:
+ bd99955_port = BD99955_CHARGE_PORT_VCC;
+ break;
+ case CHARGE_PORT_NONE:
+ bd99955_port = BD99955_CHARGE_PORT_NONE;
+ break;
+ default:
+ panic("Invalid charge port\n");
+ break;
+ }
+
+ return bd99955_select_input_port(bd99955_port);
}
void board_set_charge_limit(int charge_ma)
{
- /* TODO: Add support for BD99955 charger. */
+ charge_set_input_current_limit(MAX(charge_ma,
+ CONFIG_CHARGER_INPUT_CURRENT));
}
int extpower_is_present(void)
{
- /* TODO: Add support for BD99955 charger. */
- return 1;
+ return bd99955_extpower_is_present();
+}
+
+static void board_init(void)
+{
+ struct charge_port_info charge_none;
+ int i;
+
+ /* Initialize all pericom charge suppliers to 0 */
+ charge_none.voltage = USB_CHARGER_VOLTAGE_MV;
+ charge_none.current = 0;
+ /* TODO: Implement BC1.2 + VBUS detection */
+ for (i = 0; i < CONFIG_USB_PD_PORT_COUNT; i++) {
+ charge_manager_update_charge(CHARGE_SUPPLIER_PROPRIETARY,
+ i,
+ &charge_none);
+ charge_manager_update_charge(CHARGE_SUPPLIER_BC12_CDP,
+ i,
+ &charge_none);
+ charge_manager_update_charge(CHARGE_SUPPLIER_BC12_DCP,
+ i,
+ &charge_none);
+ charge_manager_update_charge(CHARGE_SUPPLIER_BC12_SDP,
+ i,
+ &charge_none);
+ charge_manager_update_charge(CHARGE_SUPPLIER_OTHER,
+ i,
+ &charge_none);
+ charge_manager_update_charge(CHARGE_SUPPLIER_VBUS,
+ i,
+ &charge_none);
+ }
}
+DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
diff --git a/board/kevin/board.h b/board/kevin/board.h
index 9850fab677..824e17396c 100644
--- a/board/kevin/board.h
+++ b/board/kevin/board.h
@@ -30,6 +30,11 @@
#define CONFIG_SPI_FLASH_W25X40
#define CONFIG_VBOOT_HASH
+#define CONFIG_CHARGER
+#define CONFIG_CHARGER_BD99955
+#define CONFIG_CHARGER_INPUT_CURRENT 512
+#define CONFIG_CHARGER_V2
+
/* USB PD config */
#define CONFIG_CHARGE_MANAGER
#define CONFIG_USB_POWER_DELIVERY
@@ -45,8 +50,9 @@
/* TODO: Enable TRY_SRC */
#undef CONFIG_USB_PD_TRY_SRC
-#define CONFIG_BATTERY_SMART
+#define CONFIG_BATTERY_CUT_OFF
#define CONFIG_BATTERY_PRESENT_GPIO GPIO_EC_BATT_PRES_L
+#define CONFIG_BATTERY_SMART
/* TODO: Allow higher voltage charging */
#define PD_OPERATING_POWER_MW 15000
@@ -81,6 +87,9 @@
#undef CONFIG_PSTORE
#undef CONFIG_LOW_POWER_IDLE /* Deep Sleep Support */
+#undef DEFERRABLE_MAX_COUNT
+#define DEFERRABLE_MAX_COUNT 9
+
#define I2C_PORT_TCPC0 NPCX_I2C_PORT0_0
#define I2C_PORT_TCPC1 NPCX_I2C_PORT0_1
#define I2C_PORT_CHARGER NPCX_I2C_PORT2
diff --git a/board/kevin/build.mk b/board/kevin/build.mk
index 34d772b275..7c7ca73c7f 100644
--- a/board/kevin/build.mk
+++ b/board/kevin/build.mk
@@ -10,5 +10,6 @@
CHIP:=npcx
CHIP_VARIANT:=npcx5m5g
-board-y=board.o
+board-y=battery.o
+board-y+=board.o
board-y+=usb_pd_policy.o
diff --git a/board/kevin/ec.tasklist b/board/kevin/ec.tasklist
index 4697cca773..4eec31e7f1 100644
--- a/board/kevin/ec.tasklist
+++ b/board/kevin/ec.tasklist
@@ -18,6 +18,7 @@
*/
#define CONFIG_TASK_LIST \
TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \
+ TASK_ALWAYS(CHARGER, charger_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_NOTEST(PDCMD, pd_command_task, NULL, TASK_STACK_SIZE) \
TASK_ALWAYS(HOSTCMD, host_command_task, NULL, TASK_STACK_SIZE) \
diff --git a/board/kevin/gpio.inc b/board/kevin/gpio.inc
index ab67c93ba4..f372b7fdc8 100644
--- a/board/kevin/gpio.inc
+++ b/board/kevin/gpio.inc
@@ -23,8 +23,8 @@ GPIO_INT(VOLUME_DOWN_L, PIN(8, 3), GPIO_INT_BOTH | GPIO_INPUT | GPIO_PULL_UP,
button_interrupt)
GPIO_INT(POWER_BUTTON_L, PIN(0, 4), GPIO_INT_BOTH | GPIO_INPUT,
power_button_interrupt)
-GPIO_INT(LID_OPEN, PIN(9, 7), GPIO_INT_BOTH | GPIO_INPUT | GPIO_SEL_1P8V,
- lid_interrupt)
+GPIO_INT(LID_OPEN, PIN(9, 7),
+ GPIO_INT_BOTH | GPIO_INPUT | GPIO_SEL_1P8V, lid_interrupt)
/* TODO: Add power sequencing interrupt pins */
@@ -98,7 +98,7 @@ GPIO(USB_DP_HPD, PIN(6, 6), GPIO_OUT_LOW)
GPIO(CHARGER_RESET_L, PIN(0, 1), GPIO_OUT_HIGH | GPIO_OPEN_DRAIN)
GPIO(CR50_RESET_L, PIN(0, 2), GPIO_OUT_HIGH | GPIO_OPEN_DRAIN)
GPIO(CHARGER_INT_L, PIN(3, 3), GPIO_INPUT)
-GPIO(EC_BATT_PRES_L, PIN(3, 4), GPIO_INPUT | GPIO_PULL_UP)
+GPIO(EC_BATT_PRES_L, PIN(3, 4), GPIO_INPUT)
GPIO(LID_360_L, PIN(3, 6), GPIO_INPUT | GPIO_SEL_1P8V)
GPIO(BASE_SIXAXIS_INT_L, PIN(4, 0), GPIO_INPUT | GPIO_SEL_1P8V)
GPIO(CCD_MODE, PIN(6, 3), GPIO_INPUT)
diff --git a/board/kevin/usb_pd_policy.c b/board/kevin/usb_pd_policy.c
index 48a6cf6064..0afe188de9 100644
--- a/board/kevin/usb_pd_policy.c
+++ b/board/kevin/usb_pd_policy.c
@@ -7,6 +7,7 @@
#include "charge_manager.h"
#include "common.h"
#include "console.h"
+#include "driver/charger/bd99955.h"
#include "gpio.h"
#include "hooks.h"
#include "host_command.h"
@@ -50,11 +51,11 @@ void pd_transition_voltage(int idx)
int pd_set_power_supply_ready(int port)
{
/* Disable charging */
- /* TODO: Add support for BD99955 */
+ bd99955_select_input_port(BD99955_CHARGE_PORT_NONE);
/* Provide VBUS */
gpio_set_level(port ? GPIO_C1_VOUT_EN_L :
- GPIO_C0_VOUT_EN_L, 1);
+ GPIO_C0_VOUT_EN_L, 0);
/* notify host of power info change */
pd_send_host_event(PD_EVENT_POWER_CHANGE);
@@ -66,7 +67,7 @@ void pd_power_supply_reset(int port)
{
/* Disable VBUS */
gpio_set_level(port ? GPIO_C1_VOUT_EN_L :
- GPIO_C0_VOUT_EN_L, 0);
+ GPIO_C0_VOUT_EN_L, 1);
/* notify host of power info change */
pd_send_host_event(PD_EVENT_POWER_CHANGE);