summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2019-03-22 20:30:49 +0800
committerCommit Bot <commit-bot@chromium.org>2019-06-20 09:38:50 +0000
commit8b6200d6c6caaf1dc1b65db5dac85ba1bb9ccd49 (patch)
tree891879043d90124c3ef77d6b282f7942df79f048
parent8efa67d5d535e10021edbb7034ff83e6b76452a8 (diff)
downloadchrome-ec-8b6200d6c6caaf1dc1b65db5dac85ba1bb9ccd49.tar.gz
kukui: implement pogo charge logic
Added a dedicated(POGO) charge port and related costomization functions. BUG=b:128386458 TEST=`gpioset POGO_VBUS_PRESENT 0/1` to simulate pogo charger presence, and a normal usb charger for usb port to check its behavior. BRANCH=None Change-Id: If102c57088f1aafee437c7cc912992dc0cf8e9da Signed-off-by: Ting Shen <phoenixshen@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1535087 Reviewed-by: Yilun Lin <yllin@chromium.org> Tested-by: Ting Shen <phoenixshen@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Auto-Submit: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--board/kukui/board.c87
-rw-r--r--board/kukui/board.h15
-rw-r--r--board/kukui/gpio.inc3
-rw-r--r--board/kukui/usb_pd_policy.c32
4 files changed, 113 insertions, 24 deletions
diff --git a/board/kukui/board.c b/board/kukui/board.c
index b6e5a04150..285372e089 100644
--- a/board/kukui/board.c
+++ b/board/kukui/board.c
@@ -50,6 +50,8 @@
#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args)
#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args)
+#define POGO_VBUS_DETECT_DEBOUNCE_US (20 * MSEC)
+
static void tcpc_alert_event(enum gpio_signal signal)
{
schedule_deferred_pd_interrupt(0 /* port */);
@@ -60,6 +62,33 @@ static void gauge_interrupt(enum gpio_signal signal)
task_wake(TASK_ID_CHARGER);
}
+static void pogo_vbus_detect_deferred(void);
+DECLARE_DEFERRED(pogo_vbus_detect_deferred);
+
+static void pogo_vbus_detect_deferred(void)
+{
+ if (gpio_get_level(GPIO_POGO_VBUS_PRESENT)) {
+ struct charge_port_info info = {
+ .voltage = 5000, .current = 1500};
+ /*
+ * Set supplier type to PD to have same priority as type c
+ * port.
+ */
+ charge_manager_update_charge(
+ CHARGE_SUPPLIER_DEDICATED, CHARGE_PORT_POGO, &info);
+ } else {
+ charge_manager_update_charge(
+ CHARGE_SUPPLIER_DEDICATED, CHARGE_PORT_POGO, NULL);
+ }
+ pd_send_host_event(PD_EVENT_POWER_CHANGE);
+}
+
+static void pogo_vbus_present(enum gpio_signal signal)
+{
+ hook_call_deferred(&pogo_vbus_detect_deferred_data,
+ POGO_VBUS_DETECT_DEBOUNCE_US);
+}
+
#include "gpio_list.h"
/******************************************************************************/
@@ -155,15 +184,34 @@ uint16_t tcpc_get_alert_status(void)
return status;
}
+static void board_pogo_charge_init(void)
+{
+ int i;
+
+ /* Initialize all charge suppliers to 0 */
+ for (i = 0; i < CHARGE_SUPPLIER_COUNT; i++)
+ charge_manager_update_charge(i, CHARGE_PORT_POGO, NULL);
+
+ hook_call_deferred(&pogo_vbus_detect_deferred_data, 0);
+}
+DECLARE_HOOK(HOOK_INIT, board_pogo_charge_init,
+ HOOK_PRIO_CHARGE_MANAGER_INIT + 1);
+
int board_set_active_charge_port(int charge_port)
{
CPRINTS("New chg p%d", charge_port);
switch (charge_port) {
- case 0:
+ case CHARGE_PORT_USB_C:
/* Don't charge from a source port */
if (board_vbus_source_enabled(charge_port))
return -1;
+ gpio_set_level(GPIO_EN_POGO_CHARGE_L, 1);
+ gpio_set_level(GPIO_EN_USBC_CHARGE_L, 0);
+ break;
+ case CHARGE_PORT_POGO:
+ gpio_set_level(GPIO_EN_USBC_CHARGE_L, 1);
+ gpio_set_level(GPIO_EN_POGO_CHARGE_L, 0);
break;
case CHARGE_PORT_NONE:
/*
@@ -171,6 +219,8 @@ int board_set_active_charge_port(int charge_port)
* even when battery is disconnected, keep VBAT rail on but
* set the charging current to minimum.
*/
+ gpio_set_level(GPIO_EN_POGO_CHARGE_L, 1);
+ gpio_set_level(GPIO_EN_USBC_CHARGE_L, 1);
charger_set_current(0);
break;
default:
@@ -188,16 +238,23 @@ void board_set_charge_limit(int port, int supplier, int charge_ma,
CONFIG_CHARGER_INPUT_CURRENT), charge_mv);
}
+int board_discharge_on_ac(int enable)
+{
+ /* TODO(b:123268580): Implement POGO discharge logic. */
+ return charger_discharge_on_ac(enable);
+}
+
int extpower_is_present(void)
{
/*
* The charger will indicate VBUS presence if we're sourcing 5V,
* so exclude such ports.
*/
- if (board_vbus_source_enabled(0))
+ /* TODO(b:127767432): Also need to check pogo_vbus_present. */
+ if (board_vbus_source_enabled(CHARGE_PORT_USB_C))
return 0;
else
- return tcpm_get_vbus_level(0);
+ return tcpm_get_vbus_level(CHARGE_PORT_USB_C);
}
int pd_snk_is_vbus_provided(int port)
@@ -253,6 +310,9 @@ static void board_init(void)
if (IS_ENABLED(BOARD_KRANE))
/* Display bias settings. */
mt6370_db_set_voltages(6000, 5800, 5800);
+
+ /* Enable pogo charging signal */
+ gpio_enable_interrupt(GPIO_POGO_VBUS_PRESENT);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
@@ -532,3 +592,24 @@ int board_is_vbus_too_low(int port, enum chg_ramp_vbus_state ramp_state)
*/
return charger_get_vbus_voltage(port) < 4400;
}
+
+int board_charge_port_is_sink(int port)
+{
+ /* TODO(b:128386458): Check POGO_ADC_INT_L */
+ return 1;
+}
+
+int board_charge_port_is_connected(int port)
+{
+ return gpio_get_level(GPIO_POGO_VBUS_PRESENT);
+}
+
+void board_fill_source_power_info(int port,
+ struct ec_response_usb_pd_power_info *r)
+{
+ r->meas.voltage_now = 3300;
+ r->meas.voltage_max = 3300;
+ r->meas.current_max = 1500;
+ r->meas.current_lim = 1500;
+ r->max_power = r->meas.voltage_now * r->meas.current_max;
+}
diff --git a/board/kukui/board.h b/board/kukui/board.h
index a8ff2fbf58..a42342bc1f 100644
--- a/board/kukui/board.h
+++ b/board/kukui/board.h
@@ -63,6 +63,9 @@
#define CONFIG_SOFTWARE_PANIC
#define CONFIG_VBOOT_HASH
#define CONFIG_VOLUME_BUTTONS
+#undef CONFIG_DEDICATED_CHARGE_PORT_COUNT
+#define CONFIG_DEDICATED_CHARGE_PORT_COUNT 1
+#define DEDICATED_CHARGE_PORT 1
#define CONFIG_CHARGE_RAMP_SW
#define CONFIG_CHARGER
@@ -74,6 +77,7 @@
#define CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW 15000
#define CONFIG_CHARGER_PROFILE_OVERRIDE
#define CONFIG_CHARGER_DISCHARGE_ON_AC
+#define CONFIG_CHARGER_DISCHARGE_ON_AC_CUSTOM
#define CONFIG_CHARGER_OTG
#define CONFIG_USB_CHARGER
#define CONFIG_USB_MUX_VIRTUAL
@@ -251,6 +255,12 @@ enum sensor_id {
SENSOR_COUNT,
};
+enum charge_port {
+ CHARGE_PORT_USB_C,
+ CHARGE_PORT_POGO,
+};
+
+#include "ec_commands.h"
#include "gpio_signal.h"
#include "registers.h"
@@ -263,6 +273,11 @@ void board_reset_pd_mcu(void);
int board_get_version(void);
int board_is_sourcing_vbus(int port);
void pogo_adc_interrupt(enum gpio_signal signal);
+int board_discharge_on_ac(int enable);
+int board_charge_port_is_sink(int port);
+int board_charge_port_is_connected(int port);
+void board_fill_source_power_info(int port,
+ struct ec_response_usb_pd_power_info *r);
#endif /* !__ASSEMBLER__ */
diff --git a/board/kukui/gpio.inc b/board/kukui/gpio.inc
index eebe21587c..cba7902172 100644
--- a/board/kukui/gpio.inc
+++ b/board/kukui/gpio.inc
@@ -45,6 +45,8 @@ GPIO_INT(GAUGE_INT_ODL, PIN(C, 9), GPIO_INT_FALLING | GPIO_PULL_UP,
gauge_interrupt)
GPIO_INT(POGO_ADC_INT_L, PIN(A, 6), GPIO_INT_BOTH | GPIO_ANALOG,
pogo_adc_interrupt)
+GPIO_INT(POGO_VBUS_PRESENT, PIN(A, 14), GPIO_INT_BOTH,
+ pogo_vbus_present)
/* Reset pins */
GPIO(AP_SYS_RST_L, PIN(C, 11), GPIO_OUT_LOW)
@@ -71,7 +73,6 @@ GPIO(EC_SKU_ID, PIN(B, 0), GPIO_ANALOG)
GPIO(WP_L, PIN(C, 8), GPIO_INPUT) /* EC_FLASH_WP_ODL */
GPIO(BOOT0, PIN(F, 11), GPIO_INPUT)
GPIO(CCD_MODE_ODL, PIN(A, 1), GPIO_INPUT)
-GPIO(POGO_VBUS_PRESENT, PIN(A, 14), GPIO_INPUT)
/* Other output pins */
GPIO(ENTERING_RW, PIN(C, 6), GPIO_ODR_HIGH) /* EC_ENTERING_RW_ODL */
diff --git a/board/kukui/usb_pd_policy.c b/board/kukui/usb_pd_policy.c
index 5d11326411..185c692adf 100644
--- a/board/kukui/usb_pd_policy.c
+++ b/board/kukui/usb_pd_policy.c
@@ -80,17 +80,17 @@ int board_is_sourcing_vbus(int port)
int pd_set_power_supply_ready(int port)
{
+ if (port != CHARGE_PORT_USB_C)
+ return EC_ERROR_INVAL;
+
pd_set_vbus_discharge(port, 0);
/* Provide VBUS */
vbus_en = 1;
- if (board_get_version() <= 1) {
- charger_enable_otg_power(1);
- } else {
- /* TODO(b:123268580): Implement POGO discharge logic. */
- gpio_set_level(GPIO_EN_USBC_CHARGE_L, 1);
- gpio_set_level(GPIO_EN_PP5000_USBC, 1);
- }
+ charger_enable_otg_power(1);
+
+ gpio_set_level(GPIO_EN_USBC_CHARGE_L, 1);
+ gpio_set_level(GPIO_EN_PP5000_USBC, 1);
/* notify host of power info change */
pd_send_host_event(PD_EVENT_POWER_CHANGE);
@@ -102,6 +102,9 @@ void pd_power_supply_reset(int port)
{
int prev_en;
+ if (port != CHARGE_PORT_USB_C)
+ return;
+
prev_en = vbus_en;
/* Disable VBUS */
vbus_en = 0;
@@ -109,19 +112,8 @@ void pd_power_supply_reset(int port)
if (prev_en)
pd_set_vbus_discharge(port, 1);
- if (board_get_version() <= 1) {
- charger_enable_otg_power(0);
- } else {
- /*
- * TODO(b:123268580): Implement POGO discharge logic.
- *
- * Turn off source path and POGO path before asserting
- * EN_USB_CHARGE_L.
- */
- gpio_set_level(GPIO_EN_PP5000_USBC, 0);
- gpio_set_level(GPIO_EN_POGO_CHARGE_L, 1);
- gpio_set_level(GPIO_EN_USBC_CHARGE_L, 0);
- }
+ charger_enable_otg_power(0);
+ gpio_set_level(GPIO_EN_PP5000_USBC, 0);
/* notify host of power info change */
pd_send_host_event(PD_EVENT_POWER_CHANGE);