diff options
author | Eric Herrmann <eherrmann@chromium.org> | 2020-08-12 13:13:30 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-08-26 07:12:36 +0000 |
commit | 1a09ade7b846cc048fb2f177adcacd5f836b8887 (patch) | |
tree | 595c10108150bff9358f0f2070e526c722575a7e /board/servo_v4p1 | |
parent | dcfbe43bdd75620cf5b12d6779b5e0e2d233d14c (diff) | |
download | chrome-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')
-rw-r--r-- | board/servo_v4p1/ccd_measure_sbu.c | 50 | ||||
-rw-r--r-- | board/servo_v4p1/ioexpanders.c | 4 |
2 files changed, 27 insertions, 27 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) diff --git a/board/servo_v4p1/ioexpanders.c b/board/servo_v4p1/ioexpanders.c index 6617a8d30e..9c88d7a2d0 100644 --- a/board/servo_v4p1/ioexpanders.c +++ b/board/servo_v4p1/ioexpanders.c @@ -26,14 +26,14 @@ int init_ioexpanders(void) * ------------------------------------------------- * BIT-0 (SBU_UART_SEL) | O | 0 * BIT-1 (ATMEL_RESET_L) | O | 0 - * BIT-2 (SBU_FLIP_SEL) | O | 1 + * BIT-2 (SBU_FLIP_SEL) | O | 0 * BIT-3 (USB3_A0_MUX_SEL) | O | 0 * BIT-4 (USB3_A0_MUX_EN_L) | O | 0 * BIT-5 (USB3_A0_PWR_EN) | O | 0 * BIT-6 (UART_18_SEL) | O | 0 * BIT-7 (USERVO_POWER_EN) | O | 0 */ - ret = tca6416a_write_byte(1, TCA6416A_OUT_PORT_0, 0x04); + ret = tca6416a_write_byte(1, TCA6416A_OUT_PORT_0, 0x00); if (ret != EC_SUCCESS) return ret; |