summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Yilun Lin <yllin@chromium.org>2021-03-31 15:13:25 +0800
committerCommit Bot <commit-bot@chromium.org>2021-04-08 08:08:33 +0000
commitc2e9a8b208387e50c480a3f9edc9c67f3088cf22 (patch)
tree7cae3c496450933177f82bbdfbfed72deaa77be3
parent74b190af723b38f3766b0bab63cf9e26f8fa7be3 (diff)
downloadchrome-ec-c2e9a8b208387e50c480a3f9edc9c67f3088cf22.tar.gz
asurada : measure VBUS by ADC.
Dual VBUS ADC are supported since board revision >= 4. This is to address the inaccurate VBUS present detection on SYV682x. SYV682X assumes can only recognize VBUS equals Vsafe5V or Vsafe0V. If the VBUS is not falling at the both range, it assume the VBUS > vSafe5V and thus VBUS is presented. But if the votlage is fallint between Vsafe5V and Vsafe0V, it still thinks VBUS presented, and this is a false positive. BUG=b:181203590 TEST=ensure VBUS ADC reports reasonable value BRANCH=asurada Change-Id: I1b57395216f1d6788bcd09306b503bdd3b49ddc8 Signed-off-by: Eric Yilun Lin <yllin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2793853 Reviewed-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--baseboard/asurada/baseboard.c17
-rw-r--r--baseboard/asurada/baseboard.h3
-rw-r--r--baseboard/asurada/usb_pd_policy.c12
-rw-r--r--board/asurada/gpio.inc3
-rw-r--r--board/spherion/gpio.inc8
5 files changed, 32 insertions, 11 deletions
diff --git a/baseboard/asurada/baseboard.c b/baseboard/asurada/baseboard.c
index 5376aa6dc2..a9e8d029c5 100644
--- a/baseboard/asurada/baseboard.c
+++ b/baseboard/asurada/baseboard.c
@@ -60,6 +60,7 @@ static void x_ec_interrupt(enum gpio_signal signal);
#include "gpio_list.h"
+#define CPRINTSUSB(format, args...) cprints(CC_USBCHARGE, format, ## args)
#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ## args)
#define CPRINTF(format, args...) cprintf(CC_SYSTEM, format, ## args)
@@ -129,12 +130,13 @@ DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_I2C + 1);
/* ADC channels. Must be in the exactly same order as in enum adc_channel. */
const struct adc_t adc_channels[] = {
/* Convert to mV (3000mV/1024). */
- {"VBUS", ADC_MAX_MVOLT * 10, ADC_READ_MAX + 1, 0, CHIP_ADC_CH0},
+ {"VBUS_C0", ADC_MAX_MVOLT * 10, ADC_READ_MAX + 1, 0, CHIP_ADC_CH0},
{"BOARD_ID_0", ADC_MAX_MVOLT, ADC_READ_MAX + 1, 0, CHIP_ADC_CH1},
{"BOARD_ID_1", ADC_MAX_MVOLT, ADC_READ_MAX + 1, 0, CHIP_ADC_CH2},
/* AMON/BMON gain = 17.97 */
{"CHARGER_AMON_R", ADC_MAX_MVOLT * 1000 / 17.97, ADC_READ_MAX + 1, 0,
CHIP_ADC_CH3},
+ {"VBUS_C1", ADC_MAX_MVOLT * 10, ADC_READ_MAX + 1, 0, CHIP_ADC_CH5},
{"CHARGER_PMON", ADC_MAX_MVOLT, ADC_READ_MAX + 1, 0, CHIP_ADC_CH6},
};
BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT);
@@ -614,3 +616,16 @@ static void baseboard_init(void)
gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_ODL);
}
DECLARE_HOOK(HOOK_INIT, baseboard_init, HOOK_PRIO_DEFAULT-1);
+
+
+#ifdef CONFIG_USB_PD_VBUS_MEASURE_ADC_EACH_PORT
+enum adc_channel board_get_vbus_adc(int port)
+{
+ if (port == 0)
+ return ADC_VBUS_C0;
+ if (port == 1)
+ return ADC_VBUS_C1;
+ CPRINTSUSB("Unknown vbus adc port id: %d", port);
+ return ADC_VBUS_C0;
+}
+#endif /* CONFIG_USB_PD_VBUS_MEASURE_ADC_EACH_PORT */
diff --git a/baseboard/asurada/baseboard.h b/baseboard/asurada/baseboard.h
index e9b6b2bf4b..9eb0b38509 100644
--- a/baseboard/asurada/baseboard.h
+++ b/baseboard/asurada/baseboard.h
@@ -55,6 +55,7 @@
/* Charger */
#define ADC_AMON_BMON ADC_CHARGER_AMON_R /* ADC name remap */
#define ADC_PSYS ADC_CHARGER_PMON /* ADC name remap */
+#define ADC_VBUS ADC_VBUS_C0 /* ADC name remap */
#define CONFIG_CHARGE_MANAGER
#define CONFIG_CHARGER
#define CONFIG_CHARGE_RAMP_HW
@@ -129,6 +130,7 @@
#define CONFIG_USB_PD_TCPMV2
#define CONFIG_USB_PD_TRY_SRC
#define CONFIG_USB_PD_VBUS_DETECT_PPC
+#define CONFIG_USB_PD_VBUS_MEASURE_ADC_EACH_PORT
#define CONFIG_USB_PID 0x5566 /* TODO: update PID */
#define CONFIG_USB_POWER_DELIVERY
@@ -199,6 +201,7 @@ enum adc_channel {
ADC_BOARD_ID_0, /* ADC 1 */
ADC_BOARD_ID_1, /* ADC 2 */
ADC_CHARGER_AMON_R, /* ADC 3 */
+ ADC_VBUS_C1, /* ADC 5 */
ADC_CHARGER_PMON, /* ADC 6 */
/* Number of ADC channels */
diff --git a/baseboard/asurada/usb_pd_policy.c b/baseboard/asurada/usb_pd_policy.c
index 20e315b6db..7422e6771f 100644
--- a/baseboard/asurada/usb_pd_policy.c
+++ b/baseboard/asurada/usb_pd_policy.c
@@ -148,7 +148,16 @@ __override void svdm_exit_dp_mode(int port)
int pd_snk_is_vbus_provided(int port)
{
- return ppc_is_vbus_present(port);
+ if ((IS_ENABLED(BOARD_HAYATO) && board_get_version() < 4) ||
+ (IS_ENABLED(BOARD_SPHERION) && board_get_version() < 1))
+ return ppc_is_vbus_present(port);
+
+ /*
+ * (b:181203590#comment20) TODO(yllin): use
+ * PD_VSINK_DISCONNECT_PD for non-5V case.
+ */
+ return charge_manager_get_vbus_voltage(port) >=
+ PD_V_SINK_DISCONNECT_MAX;
}
void pd_power_supply_reset(int port)
@@ -200,4 +209,3 @@ int board_vbus_source_enabled(int port)
{
return ppc_is_sourcing_vbus(port);
}
-
diff --git a/board/asurada/gpio.inc b/board/asurada/gpio.inc
index 6856efe956..209de9c901 100644
--- a/board/asurada/gpio.inc
+++ b/board/asurada/gpio.inc
@@ -128,7 +128,7 @@ ALTERNATE(PIN_MASK(B, 0x03), 1, MODULE_UART, 0) /* EC to Servo */
ALTERNATE(PIN_MASK(A, 0x07), 1, MODULE_PWM, 0) /* PWM 0~2 */
/* ADC */
-ALTERNATE(PIN_MASK(I, 0x4F), 0, MODULE_ADC, 0) /* ADC 0,1,2,3,6 */
+ALTERNATE(PIN_MASK(I, 0x6F), 0, MODULE_ADC, 0) /* ADC 0,1,2,3,5,6 */
/* SPI */
ALTERNATE(PIN_MASK(M, 0x33), 0, MODULE_SPI, 0) /* SPI */
@@ -149,7 +149,6 @@ GPIO(CCD_MODE_ODL, PIN(C, 4), GPIO_INPUT)
* ADC pins don't have internal pull-down capability,
* so we set them as output low.
*/
-GPIO(NC_GPI5, PIN(I, 5), GPIO_OUT_LOW)
GPIO(NC_GPI7, PIN(I, 7), GPIO_OUT_LOW)
/* NC pins, enable internal pull-up/down to avoid floating state. */
#ifdef BOARD_ASURADA_REV0
diff --git a/board/spherion/gpio.inc b/board/spherion/gpio.inc
index 5794a456dc..369896f91f 100644
--- a/board/spherion/gpio.inc
+++ b/board/spherion/gpio.inc
@@ -108,7 +108,7 @@ ALTERNATE(PIN_MASK(E, 0x81), 1, MODULE_I2C, 0) /* I2C E */
ALTERNATE(PIN_MASK(B, 0x03), 1, MODULE_UART, 0) /* EC to Servo */
/* ADC */
-ALTERNATE(PIN_MASK(I, 0x4F), 0, MODULE_ADC, 0) /* ADC 0,1,2,3,6 */
+ALTERNATE(PIN_MASK(I, 0x6F), 0, MODULE_ADC, 0) /* ADC 0,1,2,3,5,6 */
/* SPI */
ALTERNATE(PIN_MASK(M, 0x33), 0, MODULE_SPI, 0) /* SPI */
@@ -133,11 +133,7 @@ GPIO(PG_MT6315_GPU_ODL, PIN(H, 6), GPIO_INPUT)
GPIO(EN_PP3000_SD_U, PIN(G, 1), GPIO_INPUT | GPIO_PULL_DOWN | GPIO_SEL_1P8V)
/* reserved for future use */
GPIO(CCD_MODE_ODL, PIN(C, 4), GPIO_INPUT)
-/*
- * ADC pins don't have internal pull-down capability,
- * so we set them as output low.
- */
-GPIO(NC_GPI5, PIN(I, 5), GPIO_OUT_LOW)
+
/* NC pins, enable internal pull-up/down to avoid floating state. */
GPIO(NC_GPM2, PIN(M, 2), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(NC_GPM3, PIN(M, 3), GPIO_INPUT | GPIO_PULL_DOWN)