diff options
author | Mary Ruthven <mruthven@chromium.org> | 2016-02-23 14:56:28 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-02-26 21:22:07 -0800 |
commit | 9b4f662a8e139a75dc1557d4ccbf6348b43630d8 (patch) | |
tree | 44ffc60123897ac0adc0df028814b74a171cea05 /board | |
parent | 60552e57b61d036edbb628fcd1debbf0ec087e6e (diff) | |
download | chrome-ec-9b4f662a8e139a75dc1557d4ccbf6348b43630d8.tar.gz |
lucid: add support to detect BC1.2 suppliers
Use built-in USB periperal to detect BC1.2 suppliers and update the
charge manager.
BUG=chrome-os-partner:48658
BRANCH=None
TEST=manual for lucid. Use a samus as the supplier, and insert the
charger into Lucid. Verify that it identifies it as SDP. Use a wall
charger and verify that Lucid identifies it as DCP.
Change-Id: I7842e9f75874f727837df5bfc28690662caf821c
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/329236
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/lucid/board.c | 76 | ||||
-rw-r--r-- | board/lucid/board.h | 1 |
2 files changed, 53 insertions, 24 deletions
diff --git a/board/lucid/board.c b/board/lucid/board.c index d82467bd7e..a536153b42 100644 --- a/board/lucid/board.c +++ b/board/lucid/board.c @@ -8,6 +8,7 @@ #include "adc_chip.h" #include "charge_manager.h" #include "charge_state.h" +#include "charger_detect.h" #include "common.h" #include "console.h" #include "extpower.h" @@ -18,9 +19,11 @@ #include "registers.h" #include "task.h" #include "usb_charge.h" +#include "usb_pd.h" #include "util.h" #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) +#define USB_CHG_DETECT_DELAY_US 5000 void board_config_pre_init(void) { @@ -40,6 +43,52 @@ void board_config_pre_init(void) STM32_SYSCFG_CFGR1 |= (1 << 9) | (1 << 10); } +static void reset_charge(int port) +{ + struct charge_port_info charge_none; + + charge_none.voltage = USB_CHARGER_VOLTAGE_MV; + charge_none.current = 0; + charge_manager_update_charge(CHARGE_SUPPLIER_PROPRIETARY, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_CDP, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_DCP, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_SDP, + port, + &charge_none); + charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, + port, + &charge_none); +} + +static void usb_charger_bc12_detect(void) +{ + int type; + struct charge_port_info charge; + + type = charger_detect_get_device_type(); + if (gpio_get_level(GPIO_AC_PRESENT) && type) { + charge.voltage = USB_CHARGER_VOLTAGE_MV; + if (type == CHARGE_SUPPLIER_BC12_CDP) + charge.current = 1500; + else + charge.current = 500; + + charge_manager_update_charge(type, 0, &charge); + } else + reset_charge(0); + + + /* notify host of power info change */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); +} +DECLARE_DEFERRED(usb_charger_bc12_detect); + static void update_vbus_supplier(int vbus_level) { struct charge_port_info charge; @@ -56,6 +105,7 @@ void vbus_evt(enum gpio_signal signal) * lucid only has one port and charging is always enabled. */ + hook_call_deferred(usb_charger_bc12_detect, USB_CHG_DETECT_DELAY_US); update_vbus_supplier(gpio_get_level(signal)); task_wake(TASK_ID_PD_C0); @@ -95,32 +145,10 @@ const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); static void board_init(void) { int i; - struct charge_port_info charge_none; /* Initialize all BC1.2 charge suppliers to 0 */ - /* - * TODO: use built-in USB peripheral to detect BC1.2 suppliers an - * update charge manager. - */ - charge_none.voltage = USB_CHARGER_VOLTAGE_MV; - charge_none.current = 0; - 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); - } + for (i = 0; i < CONFIG_USB_PD_PORT_COUNT; i++) + reset_charge(i); /* Enable charge status interrupt */ gpio_enable_interrupt(GPIO_CHARGE_STATUS); diff --git a/board/lucid/board.h b/board/lucid/board.h index f9fd68c5b1..2163d28517 100644 --- a/board/lucid/board.h +++ b/board/lucid/board.h @@ -50,6 +50,7 @@ #define CONFIG_LOW_POWER_IDLE #define CONFIG_LTO #define CONFIG_STM_HWTIMER32 +#define CONFIG_STM32_CHARGER_DETECT #undef CONFIG_TASK_PROFILING #define CONFIG_USB_POWER_DELIVERY #define CONFIG_USB_PD_ALT_MODE |