diff options
author | Mary Ruthven <mruthven@chromium.org> | 2021-10-12 19:28:18 -0500 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-10-13 21:01:26 +0000 |
commit | 29c152bcf67e09d60d28f519458b7fd7a0e8a1cd (patch) | |
tree | 3cee0b187a5827da26a23ea25d300d23982130ae /board | |
parent | 39447a20c6e663d83b8581330378275530b3b2f3 (diff) | |
download | chrome-ec-29c152bcf67e09d60d28f519458b7fd7a0e8a1cd.tar.gz |
ccdblock: add option to tri-state the EC UART
Block EC UART output and EC COMM with 'ccdblock TRISTATE_EC enable'.
This removes the EC UART output, prevents EC-EFS2, and removes the
pulldown from the EC RX signal.
This is used for flashing the EC with c2d2. It's only available when CCD
is enabled.
BUG=b:202464674
TEST=manual
# Disconnect servo. Verify EC tx is disabled and there's no pull
# down after tristating the EC
> ccdblock TRISTATE_EC enable
CCD ports blocked: EC IGNORE_SERVO
WARNING: enabling UART while servo is connected may damage
hardware EC_CR50_COMM TRISTATE_EC
> pinmux
...
400600c8: DIOB5 0 IN
400600d0: DIOB6 16 IN GPIO0_GPIO15
...
> ccdstate
...
State flags: UARTAP USBEC+TX
CCD ports blocked: EC EC_CR50_COMM TRISTATE_EC
...
# Check UART TX is re-enabled after disabling TRISTATE_EC
> ccdblock TRISTATE_EC disable
CCD ports blocked: (none)
> ccdstate
...
State flags: UARTAP+TX UARTEC+TX I2C SPI USBEC+TX
CCD ports blocked: (none)
...
> pinmux
...
400600c8: DIOB5 78 IN UART2_TX
400600d0: DIOB6 16 IN GPIO0_GPIO15
...
# Connect servo, so cr50 disables the EC UART on it's own.
# Verify the pulldown is removed after tristating the EC.
> ccdstate
...
State flags: UARTAP UARTEC USBEC+TX
CCD ports blocked: (none)
> pinmux
...
400600c8: DIOB5 0 IN PD
400600d0: DIOB6 16 IN GPIO0_GPIO15
...
> ccdblock TRISTATE_EC enable
CCD ports blocked: EC EC_CR50_COMM TRISTATE_EC
> ccdstate
...
State flags: UARTAP USBEC+TX
CCD ports blocked: EC EC_CR50_COMM TRISTATE_EC
# Check PD is removed from DIOB5
> pinmux
...
400600c8: DIOB5 0 IN
400600d0: DIOB6 16 IN GPIO0_GPIO15
...
# Check PD is re-enabled after disabling TRISTATE_EC
> ccdblock TRISTATE_EC disable
CCD ports blocked: (none)
> ccdstate
...
State flags: UARTAP UARTEC USBEC+TX
CCD ports blocked: (none)
> pinmux
...
400600c8: DIOB5 0 IN PD
400600d0: DIOB6 16 IN GPIO0_GPIO15
Change-Id: I7bde996be3914bd5d625ad99e418f9bd2c0f41d1
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3219760
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/cr50/rdd.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/board/cr50/rdd.c b/board/cr50/rdd.c index 0f6fcc6674..e7727c3ac8 100644 --- a/board/cr50/rdd.c +++ b/board/cr50/rdd.c @@ -62,7 +62,13 @@ enum ccd_block_flags { * This will block EC-CR50-communication. CR50 should not enable EC * UART. */ - CCD_BLOCK_EC_CR50_COMM = BIT(4) + CCD_BLOCK_EC_CR50_COMM = BIT(4), + + /* + * This will block EC-CR50-communication. CR50 should not enable EC + * UART. + */ + CCD_BLOCK_TRISTATE_EC = BIT(5) }; /* Which UARTs are blocked by console command */ @@ -107,8 +113,13 @@ static void uartn_tx_disconnect(int uart) } else { GWRITE(PINMUX, DIOB5_SEL, 0); - /* Set up the pulldown */ - GWRITE_FIELD(PINMUX, DIOB5_CTL, PD, 1); + /* + * Set up the pulldown on EC RX unless the EC UART is supposed + * to be tri-stated. If it's supposed to be tristated, disable + * TX and remove the pull-down from RX. + */ + GWRITE_FIELD(PINMUX, DIOB5_CTL, PD, + !(ccd_block & CCD_BLOCK_TRISTATE_EC)); } } @@ -452,6 +463,8 @@ static void print_ccd_ports_blocked(void) } if (ccd_block & CCD_BLOCK_EC_CR50_COMM) ccputs(" EC_CR50_COMM"); + if (ccd_block & CCD_BLOCK_TRISTATE_EC) + ccputs(" TRISTATE_EC"); if (!ccd_block) ccputs(" (none)"); ccputs("\n"); @@ -494,6 +507,10 @@ static int command_ccd_block(int argc, char **argv) block_flag = CCD_BLOCK_IGNORE_SERVO; else if (!strcasecmp(argv[1], "EC_CR50_COMM")) block_flag = CCD_BLOCK_EC_CR50_COMM; + else if (!strcasecmp(argv[1], "TRISTATE_EC")) + block_flag = (CCD_BLOCK_TRISTATE_EC | + CCD_BLOCK_EC_UART | + CCD_BLOCK_EC_CR50_COMM); else return EC_ERROR_PARAM1; @@ -507,9 +524,16 @@ static int command_ccd_block(int argc, char **argv) if (block_flag == CCD_BLOCK_IGNORE_SERVO) servo_ignore(new_state); - else if (block_flag == CCD_BLOCK_EC_CR50_COMM) + else if (block_flag & CCD_BLOCK_EC_CR50_COMM) ec_comm_block(new_state); + /* + * Call uartn_tx_disconnect to make sure the pulldown gets + * removed even if the EC uart is already disabled. + */ + if (block_flag & CCD_BLOCK_TRISTATE_EC) + uartn_tx_disconnect(UART_EC); + /* Update blocked state in deferred function */ ccd_update_state(); } @@ -519,6 +543,6 @@ static int command_ccd_block(int argc, char **argv) return EC_SUCCESS; } DECLARE_CONSOLE_COMMAND(ccdblock, command_ccd_block, - "[<AP | EC | SERVO | IGNORE_SERVO | EC_CR50_COMM>" - " [BOOLEAN]]", + "[<AP | EC | SERVO | IGNORE_SERVO | EC_CR50_COMM | " + "TRISTATE_EC> [BOOLEAN]]", "Force CCD ports disabled"); |