diff options
author | Ting Shen <phoenixshen@google.com> | 2019-03-22 20:30:49 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-20 09:38:50 +0000 |
commit | 8b6200d6c6caaf1dc1b65db5dac85ba1bb9ccd49 (patch) | |
tree | 891879043d90124c3ef77d6b282f7942df79f048 | |
parent | 8efa67d5d535e10021edbb7034ff83e6b76452a8 (diff) | |
download | chrome-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.c | 87 | ||||
-rw-r--r-- | board/kukui/board.h | 15 | ||||
-rw-r--r-- | board/kukui/gpio.inc | 3 | ||||
-rw-r--r-- | board/kukui/usb_pd_policy.c | 32 |
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); |