summaryrefslogtreecommitdiff
path: root/board/servo_v4p1/ccd_measure_sbu.c
diff options
context:
space:
mode:
authorEric Herrmann <eherrmann@chromium.org>2020-08-12 13:13:30 -0700
committerCommit Bot <commit-bot@chromium.org>2020-08-26 07:12:36 +0000
commit1a09ade7b846cc048fb2f177adcacd5f836b8887 (patch)
tree595c10108150bff9358f0f2070e526c722575a7e /board/servo_v4p1/ccd_measure_sbu.c
parentdcfbe43bdd75620cf5b12d6779b5e0e2d233d14c (diff)
downloadchrome-ec-1a09ade7b846cc048fb2f177adcacd5f836b8887.tar.gz
ServoV4/V4p1: Change CCD detection flow
Currently, servoV4 and servoV4p1 don't apply terminations to SBU when searching for a DUT. This means SBU can float which can break the SBU voltage detection. Technically, the DUT should only need to pull up D+ and can float D- since it is a FS USB2 device when in CCD mode. Change the detection to connect SBU to the USB2 hub on servoV4/4p1. The USB2 hub will apply 15k pulldowns to the USB lines, which will pull SBU down and fix detection in the case where the DUT floats SBU. BUG=b:161762948, b:150886157, b:151487379 TEST=make BOARD=servo_v4; make BOARD=servo_v4p1 TEST=check that CCD works on DUT without pulldown resistors on SBU BRANCH=none Change-Id: I9b6f620617fb0e270e35804704111afd3c606a3b Signed-off-by: Eric Herrmann <eherrmann@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2352439 Reviewed-by: Wai-Hong Tam <waihong@google.com>
Diffstat (limited to 'board/servo_v4p1/ccd_measure_sbu.c')
-rw-r--r--board/servo_v4p1/ccd_measure_sbu.c50
1 files changed, 25 insertions, 25 deletions
diff --git a/board/servo_v4p1/ccd_measure_sbu.c b/board/servo_v4p1/ccd_measure_sbu.c
index b9c9680cc9..42ab4a5d52 100644
--- a/board/servo_v4p1/ccd_measure_sbu.c
+++ b/board/servo_v4p1/ccd_measure_sbu.c
@@ -36,24 +36,27 @@ static void ccd_measure_sbu(void)
{
int sbu1;
int sbu2;
- int mux_en;
static int count /* = 0 */;
static int last /* = 0 */;
static int polarity /* = 0 */;
+ /*
+ * The SBU mux should be enabled so SBU is connected to the USB2
+ * hub. The hub needs to apply its terminations to read the
+ * correct SBU levels.
+ */
+ gpio_set_level(GPIO_SBU_MUX_EN, 1);
+
/* Read sbu voltage levels */
sbu1 = adc_read_channel(ADC_SBU1_DET);
sbu2 = adc_read_channel(ADC_SBU2_DET);
- mux_en = gpio_get_level(GPIO_SBU_MUX_EN);
/*
- * While SBU_MUX is disabled (SuzyQ unplugged), we'll poll the SBU lines
- * to check if an idling, unconfigured USB device is present.
- * USB FS pulls one line high for connect request.
- * If so, and it persists for 500ms, we'll enable the SuzyQ in that
- * orientation.
+ * Poll the SBU lines to check if an idling, unconfigured USB device is
+ * present. USB FS pulls one line high for connect request. If so, and
+ * it persists for 500ms, we'll enable the SuzyQ in that orientation.
*/
- if ((!mux_en) && (sbu1 > USB_HIGH_MV) && (sbu2 < GND_MAX_MV)) {
+ if ((sbu1 > USB_HIGH_MV) && (sbu2 < GND_MAX_MV)) {
/* Check flip connection polarity. */
if (last != MODE_SBU_FLIP) {
last = MODE_SBU_FLIP;
@@ -62,7 +65,7 @@ static void ccd_measure_sbu(void)
} else {
count++;
}
- } else if ((!mux_en) && (sbu2 > USB_HIGH_MV) && (sbu1 < GND_MAX_MV)) {
+ } else if ((sbu2 > USB_HIGH_MV) && (sbu1 < GND_MAX_MV)) {
/* Check direct connection polarity. */
if (last != MODE_SBU_CONNECT) {
last = MODE_SBU_CONNECT;
@@ -71,13 +74,15 @@ static void ccd_measure_sbu(void)
} else {
count++;
}
- /*
- * If SuzyQ is enabled, we'll poll for a persistent no-signal
- * for 500ms. Since USB is differential, we should never see
- * GND/GND while the device is connected.
- * If disconnected, electrically remove SuzyQ.
- */
- } else if ((mux_en) && (sbu1 < GND_MAX_MV) && (sbu2 < GND_MAX_MV)) {
+ /*
+ * If SuzyQ is enabled, we'll poll for a persistent no-signal
+ * for 500ms. We may see GND/GND while passing data since the
+ * ADC's don't sample simultaneously, so there needs to be a
+ * deglitch to not falsely detect a disconnect. If disconnected,
+ * take no action. We need to keep the mux enabled to detect
+ * another device.
+ */
+ } else if ((sbu1 < GND_MAX_MV) && (sbu2 < GND_MAX_MV)) {
/* Check for SBU disconnect if connected. */
if (last != MODE_SBU_DISCONNECT) {
last = MODE_SBU_DISCONNECT;
@@ -95,24 +100,19 @@ static void ccd_measure_sbu(void)
* We have seen a new state continuously for 500ms.
* Let's update the mux to enable/disable SuzyQ appropriately.
*/
- if (count > 5) {
- if (mux_en) {
- /* Disable mux as it's disconnected now. */
- gpio_set_level(GPIO_SBU_MUX_EN, 0);
- msleep(10);
+ if (count == 50) {
+ if (last == MODE_SBU_DISCONNECT) {
CPRINTS("CCD: disconnected.");
} else {
/* SBU flip = polarity */
sbu_flip_sel(polarity);
- gpio_set_level(GPIO_SBU_MUX_EN, 1);
- msleep(10);
CPRINTS("CCD: connected %s",
polarity ? "flip" : "noflip");
}
}
- /* Measure every 100ms, forever. */
- hook_call_deferred(&ccd_measure_sbu_data, 100 * MSEC);
+ /* Measure every 10ms, forever. */
+ hook_call_deferred(&ccd_measure_sbu_data, 10 * MSEC);
}
void ccd_enable(int enable)